随笔 - 378  文章 - 0  评论 - 5  阅读 - 6085

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
  • 检查内容:筛选出非 RunningSucceededFailed 状态的 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
    • 其他系统请参考相应的包管理器安装。

2. 权限设置

  1. 保存脚本:将脚本保存为 k8s_inspection.sh
  2. 赋予执行权限:执行以下命令赋予脚本执行权限。
    chmod +x k8s_inspection.sh
    

3. 定时执行

使用 cron 定时任务每天执行一次。例如,编辑 crontab:

crontab -e

添加以下内容每天凌晨 2 点执行:

0 2 * * * /path/to/k8s_inspection.sh

4. 日志查看

  • 日志目录:巡检日志保存在 /var/log/k8s_inspection/ 目录下。
  • 查看方式:通过 catless 或其他日志查看工具查看日志文件。
    cat /var/log/k8s_inspection/inspection_2025-01-15.log
    

5. 报警需求

  • 添加检查项:根据实际需求,可以添加更多的检查项,例如存储卷状态、Ingress 资源检查、安全策略审计等。
  • 集成告警系统:如 Slack、钉钉、邮件等,实现自动化通知。

注意事项

  • 安全性:确保日志文件的权限设置正确,避免敏感信息泄露。
  • 性能影响:在大型集群中,频繁执行某些 kubectl 命令可能会对 API Server 产生一定负载,建议根据集群规模调整巡检频率和检查内容。
  • 错误处理:脚本中包含基础的错误处理,但在生产环境中可以根据需要增加更多的异常捕获和处理逻辑。

通过以上脚本可以简单满足巡检k8s搭建初期的需求!!!

posted on   Leo-Yide  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示