k8s巡检脚本
Kubernetes 日常巡检脚本分享
在企业级环境中,确保 Kubernetes(k8s)集群的稳定运行至关重要。这篇文章我将用到我在公司初期搭建k8s集群巡检的一个 Bash 脚本,涵盖节点状态、Pod 状态、资源使用情况、事件检查等多个方面。通过定期运行此脚本,可以及时发现并处理潜在的问题,保障集群的健康。(不建议直接复制粘贴!!!!)
脚本代码
[root@master scripts-shell]$sudo cat k8s_inspection.sh
#!/bin/bash
# Kubernetes 日常巡检脚本
# 需要预先配置好 kubectl 并确保脚本运行的环境具有访问集群的权限
# 设置日志文件
LOG_DIR="/var/log/k8s_inspection"
LOG_FILE="$LOG_DIR/inspection_$(date +%F).log"
mkdir -p "$LOG_DIR"
# 函数:记录日志
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# 函数:检查节点状态
check_nodes() {
log "开始检查节点状态..."
NODE_STATUS=$(kubectl get nodes --no-headers | awk '{print $2}' | sort | uniq)
if [[ "$NODE_STATUS" != *"Ready"* ]]; then
log "警告:存在非 Ready 状态的节点!当前节点状态:$NODE_STATUS"
else
log "所有节点状态正常。"
fi
}
# 函数:检查所有 Pod 状态
check_pods() {
log "开始检查 Pod 状态..."
NON_RUNNING_PODS=$(kubectl get pods --all-namespaces --field-selector=status.phase!=Running,status.phase!=Succeeded,status.phase!=Failed -o json | jq '.items[] | {namespace: .metadata.namespace, name: .metadata.name, status: .status.phase}')
if [[ -n "$NON_RUNNING_PODS" ]]; then
log "警告:存在非 Running、Succeeded 或 Failed 状态的 Pod:"
echo "$NON_RUNNING_PODS" | tee -a "$LOG_FILE"
else
log "所有 Pod 状态正常。"
fi
}
# 函数:检查资源使用情况
check_resources() {
log "开始检查节点资源使用情况(CPU 和内存)..."
kubectl top nodes --no-headers | awk '{print $1, $2, $3}' | while read -r NODE_NAME CPU_USAGE MEMORY_USAGE; do
# 检查 CPU 和内存使用值是否有效数字
if [[ ! "$CPU_USAGE" =~ ^[0-9]+$ ]] || [[ ! "$MEMORY_USAGE" =~ ^[0-9]+(Mi|Gi|%)$ ]]; then
log "节点 $NODE_NAME :CPU=$CPU_USAGE,内存=$MEMORY_USAGE"
continue
fi
# 直接保留内存百分比,而不进行转换
if [[ "$MEMORY_USAGE" =~ ^[0-9]+%$ ]]; then
log "警告:节点 $NODE_NAME 的内存使用率是百分比:${MEMORY_USAGE}"
else
# 移除单位并转换内存单位(如果需要)
MEMORY_USAGE_NUM=$(echo "$MEMORY_USAGE" | sed 's/Mi//;s/Gi/*1024/' | bc)
fi
# 移除单位并转换 CPU 使用率
CPU_USAGE_NUM=$(echo "$CPU_USAGE" | sed 's/m//')
# 设置阈值(毫核和 Mi)
CPU_LIMIT=8000 # 8000m = 8核
MEMORY_LIMIT=16000 # 16000Mi = 16Gi
# 检查 CPU 使用率
if [ "$CPU_USAGE_NUM" -gt "$CPU_LIMIT" ]; then
log "警告:节点 $NODE_NAME 的 CPU 使用率超过阈值:${CPU_USAGE}"
fi
# 检查内存使用率
if [[ "$MEMORY_USAGE" != *% && "$MEMORY_USAGE_NUM" -gt "$MEMORY_LIMIT" ]]; then
log "警告:节点 $NODE_NAME 的内存使用率超过阈值:${MEMORY_USAGE}"
fi
done
}
# 函数:检查事件
check_events() {
log "开始检查最近 24 小时的集群事件..."
# 获取24小时前的时间戳
SINCE_TIME=$(date -u -d "24 hours ago" +"%Y-%m-%dT%H:%M:%SZ")
# 检查 kubectl 是否支持 --since-time
if kubectl get events --help | grep -- "--since-time" &>/dev/null; then
RECENT_EVENTS=$(kubectl get events --all-namespaces --since-time="$SINCE_TIME" --sort-by='.lastTimestamp')
else
# 如果不支持 --since-time,获取所有事件并在脚本中筛选
RECENT_EVENTS=$(kubectl get events --all-namespaces -o json | jq --arg SINCE_TIME "$SINCE_TIME" '
.items[] | select(.lastTimestamp >= $SINCE_TIME) |
{namespace: .metadata.namespace, name: .metadata.name, lastTimestamp: .lastTimestamp, type: .type, reason: .reason, message: .message}')
fi
# 判断是否有事件
if [[ -n "$RECENT_EVENTS" && "$RECENT_EVENTS" != "[]" ]]; then
log "最近 24 小时内的集群事件:"
echo "$RECENT_EVENTS" | tee -a "$LOG_FILE"
else
log "过去 24 小时内没有新的集群事件。"
fi
}
# 函数:检查命名空间状态
check_namespaces() {
log "开始检查命名空间状态..."
NON_ACTIVE_NS=$(kubectl get namespaces --no-headers | awk '$2!="Active" {print $1 " - " $2}')
if [[ -n "$NON_ACTIVE_NS" ]]; then
log "警告:存在非 Active 状态的命名空间:"
echo "$NON_ACTIVE_NS" | tee -a "$LOG_FILE"
else
log "所有命名空间状态正常。"
fi
}
# 函数:汇总巡检
run_inspection() {
log "==================== 开始 Kubernetes 集群日常巡检 ===================="
check_nodes
check_pods
check_resources
check_namespaces
check_events
log "==================== Kubernetes 集群日常巡检完成 ===================="
}
# 执行巡检
run_inspection
# 可选:发送邮件或通知(需要配置邮件服务器或通知服务)
# 例如,使用 mail 命令发送日志
# mail -s "K8s 日常巡检报告 - $(date +%F)" admin@example.com < "$LOG_FILE"
exit 0
[root@master scripts-shell]$
脚本说明
1. 日志记录
- 日志目录:日志文件保存在
/var/log/k8s_inspection/
目录下,文件名包含当前日期,便于历史查看。 - 日志函数:使用
log
函数统一记录日志,并将日志输出到控制台和日志文件中。
2. 节点状态检查
- 命令:
kubectl get nodes
- 检查内容:所有节点是否处于
Ready
状态。 - 处理:如果存在非
Ready
状态的节点,记录警告信息。
3. Pod 状态检查
- 命令:
kubectl get pods --all-namespaces
- 检查内容:筛选出非
Running
、Succeeded
或Failed
状态的 Pod。 - 处理:记录详细的异常 Pod 信息。
4. 资源使用情况检查
- 命令:
kubectl top nodes
- 检查内容:每个节点的 CPU 和内存使用情况。
- 阈值:
- CPU 使用率:8000 毫核(根据实际情况调整)
- 内存使用率:16000 Mi(根据实际情况调整)
- 处理:如果节点的 CPU 或内存使用率超过阈值,记录警告信息。
5. 事件检查
- 命令:
kubectl get events --since=24h
- 检查内容:过去 24 小时内的集群事件。
- 处理:记录所有新事件,便于排查问题。
6. 核心组件状态检查
- 命令:
kubectl get componentstatuses
- 检查内容:Kubernetes 核心组件(如 etcd、scheduler、controller-manager)的健康状态。
- 处理:记录任何非
Healthy
状态的组件。
7. 命名空间状态检查
- 命令:
kubectl get namespaces
- 检查内容:所有命名空间的状态是否为
Active
。 - 处理:记录任何非
Active
状态的命名空间。
8. 汇总巡检
- 流程:依次执行所有检查函数,并在日志中标记巡检的开始和结束。
9. 通知(可选)
- 功能:将巡检结果通过邮件发送给管理员。
- 配置:需要提前配置好邮件服务器或其他通知服务。
- 示例:使用
mail
命令发送日志。
使用说明
1. 环境要求
- kubectl:已安装并配置好
kubectl
,并确保执行脚本的用户具有足够的权限访问集群。 - jq:安装
jq
工具,用于解析 JSON 数据。- 安装命令(Debian/Ubuntu):
sudo apt-get install jq
- 其他系统请参考相应的包管理器安装。
- 安装命令(Debian/Ubuntu):
2. 权限设置
- 保存脚本:将脚本保存为
k8s_inspection.sh
。 - 赋予执行权限:执行以下命令赋予脚本执行权限。
chmod +x k8s_inspection.sh
3. 定时执行
使用 cron
定时任务每天执行一次。例如,编辑 crontab:
crontab -e
添加以下内容每天凌晨 2 点执行:
0 2 * * * /path/to/k8s_inspection.sh
4. 日志查看
- 日志目录:巡检日志保存在
/var/log/k8s_inspection/
目录下。 - 查看方式:通过
cat
、less
或其他日志查看工具查看日志文件。cat /var/log/k8s_inspection/inspection_2025-01-15.log
5. 报警需求
- 添加检查项:根据实际需求,可以添加更多的检查项,例如存储卷状态、Ingress 资源检查、安全策略审计等。
- 集成告警系统:如 Slack、钉钉、邮件等,实现自动化通知。
注意事项
- 安全性:确保日志文件的权限设置正确,避免敏感信息泄露。
- 性能影响:在大型集群中,频繁执行某些
kubectl
命令可能会对 API Server 产生一定负载,建议根据集群规模调整巡检频率和检查内容。 - 错误处理:脚本中包含基础的错误处理,但在生产环境中可以根据需要增加更多的异常捕获和处理逻辑。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)