当前位置: 首页 > news >正文

Kubernetes生产环境健康检查自动化指南


核心脚本功能

  1. 一键检查集群核心组件状态
  2. 自动化扫描节点/Pod异常
  3. 存储与网络关键指标检测
  4. 风险分级输出(红/黄/绿标识)

一、自动化巡检脚本 (k8s-health-check.sh)
#!/bin/bash
# Desc: Kubernetes全维度健康检查脚本
# 执行要求:kubectl配置+Popeye安装# 核心组件检查
check_core_components() {echo "===== 集群核心组件检查 [高风险] ====="kubectl get componentstatuses | awk '$2 != "Healthy" {printf "\033[31mCRITICAL\033[0m: %s 状态异常\n", $1; exit 1}{printf "\033[32mPASS\033[0m: %s 状态正常\n", $1}'# ETCD集群检测 (需提前配置etcdctl证书)etcdctl endpoint health 2>&1 | grep -v "health: true" && \echo -e "\033[31mCRITICAL\033[0m: ETCD节点异常" || \echo -e "\033[32mPASS\033[0m: ETCD集群健康"
}# 节点健康检查
check_nodes() {echo "===== 节点健康巡检 ====="# 节点就绪状态kubectl get nodes --no-headers | awk '$2 != "Ready" {count++}END {if(count>=2) {printf "\033[31mCRITICAL\033[0m: %d个节点NotReady\n", count; exit 1}else if(count>0) {printf "\033[33mWARN\033[0m: %d个节点NotReady\n", count}else {print "\033[32mPASS\033[0m: 所有节点Ready"}}'# 资源使用率(依赖metrics-server)kubectl top nodes --no-headers | awk '{cpu=$3; mem=$5;sub(/%/, "", cpu); sub(/%/, "", mem);if (cpu>=95 || mem>=95) {printf "\033[31mCRITICAL\033[0m: 节点%s CPU=%d%% MEM=%d%%\n", $1, cpu, mem}else if (cpu>=85 || mem>=85) {printf "\033[33mWARN\033[0m: 节点%s CPU=%d%% MEM=%d%%\n", $1, cpu, mem}}'
}# 工作负载检查
check_workloads() {echo "===== Pod状态检查 ====="# 异常Pod检测kubectl get pods --all-namespaces --field-selector=status.phase!=Running,status.phase!=Completed -o wide | grep -v "No resources" && \echo -e "\033[31mCRITICAL\033[0m: 存在异常Pod" || \echo -e "\033[32mPASS\033[0m: 无Pending/CrashLoopBackOff状态Pod"# 容器重启次数kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.containerStatuses[].restartCount}{"\n"}{end}' | \awk '$2>5 {printf "\033[33mWARN\033[0m: Pod %s 重启%d次\n", $1, $2}'
}# 存储系统检查
check_storage() {echo "===== 存储健康检查 ====="# PVC绑定状态kubectl get pvc --all-namespaces | awk '$2 != "Bound" {print $0; exit 1}' && \echo -e "\033[31mCRITICAL\033[0m: 存在未绑定PVC" || \echo -e "\033[32mPASS\033[0m: PVC均正常绑定"# PostgreSQL连接数示例 (需替换实际参数)PG_POD=$(kubectl get pod -n db -l app=postgres -o name | head -1)kubectl exec -n db $PG_POD -- psql -U postgres -c "SELECT count(*) FROM pg_stat_activity" | \awk 'NR==3 && $1>1024 {printf "\033[33mWARN\033[0m: 数据库连接数过高(%d)\n", $1}'
}# 网络检查
check_network() {echo "===== 网络服务检查 ====="# DNS解析延迟测试kubectl run dns-test --image=busybox:1.28 --rm -it --restart=Never -- \sh -c "time nslookup kubernetes.default" 2>&1 | grep real | \awk -F'm' '{print $2*60+$3}' | awk '$1>5 {printf "\033[33mWARN\033[0m: DNS解析延迟%.2fs\n", $1}'
}# 证书过期检查
check_certs() {echo "===== 证书有效期检查 [高风险] ====="kubectl config view --raw -o jsonpath='{..certificate-data}' | base64 -d | \openssl x509 -enddate -noout | awk -F'=' '$1=="notAfter" {cmd="date -d \""$2"\" +%s";cmd | getline exp;close(cmd);now=systime();diff=(exp-now)/86400;if(diff<90) printf "\033[31mCRITICAL\033[0m: 证书将在%.0f天后过期\n", diff}'
}### 执行所有检查 ###
check_core_components
check_nodes
check_workloads
check_storage
check_network
check_certs# 使用Popeye做深度扫描
echo "===== 运行Popeye集群扫描 ====="
popeye --out=html > /tmp/popeye-report.html && \echo "报告已保存: /tmp/popeye-report.html"

二、关键巡检项说明与阈值
检查维度自动化实现方式风险阈值
API Server健康kubectl get componentstatuses非Healthy状态即高风险
节点资源使用率kubectl top nodesCPU/Mem ≥85% 告警,≥95% 严重
Pod重启次数Pod注解restartCount>5次为异常
PVC绑定状态kubectl get pvc非Bound状态即高风险
DNS解析延迟临时Pod执行nslookup>5s 警告
证书有效期解析Kubeconfig证书有效期<90天高风险

三、自动化部署建议
  1. 定时任务配置(每日巡检):

    # 将脚本加入CronJob
    kubectl create cronjob k8s-daily-check --image=bitnami/kubectl:latest \--scheme="0 8 * * *" \-- /bin/sh -c "curl -sL https://raw.githubusercontent.com/ops/k8s-health-check.sh | bash && aws s3 cp /tmp/popeye-report.html s3://my-bucket/reports/"
    
  2. Prometheus关键告警规则(示例):

    # 内存泄漏检测
    - alert: NodeMemoryPressureexpr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 85for: 10mlabels:severity: warningannotations:summary: "节点内存压力 ({{ $labels.instance }})"
    

四、紧急事件处理流程

当脚本输出 CRITICAL(红色) 时:

  1. Master组件异常:立即检查kube-apiserver/etcd日志
  2. 节点NotReady
    kubectl cordon <NODE_NAME>    # 停止调度
    kubectl drain <NODE_NAME>     # 驱逐Pod
    
  3. 证书即将过期
    kubeadm certs renew all       # 使用kubeadm更新证书
    

最佳实践补充

  • 探针配置:Java应用设置initialDelaySeconds: 120避免频繁重启
  • 存储扩容:当PVC使用率>80%时自动触发扩容(需配置CSI StorageClass)
  • 日志跟踪:集成ELK过滤ERROR日志并统计占比(>5%触发告警)
http://www.xdnf.cn/news/1281421.html

相关文章:

  • SQL复杂查询
  • Java AI生成长篇小说的实用
  • 基于大数据的个性化学习环境构建的研究与应用
  • Flutter Provider 状态管理全面解析与实战应用:从入门到精通
  • libwebsockets 服务端获取过代理的真实连接IP
  • 重学React(五):脱围机制一
  • 使用Windbg分析多线程死锁项目实战问题分享
  • 金蝶云星空 × SRM 深度集成实战(附完整接口清单)
  • 两个Maven工程,使用idea开发,工程A中依赖了工程B,改了工程B,工程A如何获取最新代码
  • Java学习 -- 可变参数与Collections工具类
  • 基于数据结构用java实现二叉树的排序器
  • Java项目基本流程(三)
  • 【SpringBoot】持久层 sql 注入问题
  • 第六十一章:AI 模型的“视频加速术”:Wan视频扩散模型优化
  • Spring Boot文件下载功能实现详解
  • 每日算法刷题Day61:8.11:leetcode 堆11道题,用时2h30min
  • 第十六届蓝桥杯大赛青少组 C++ 省赛真题解析(2025年8月10日)
  • (25.08)Ubuntu20.04复现KISS-ICP
  • 【k8s】k8s中的几个概念性问题
  • Spring MVC 注解参数接收详解:@RequestBody、@PathVariable 等区别与使用场景
  • 亚马逊广告底层逻辑重构:从流量博弈到价值创造的战略升维
  • 爬虫与数据分析入门:从中国大学排名爬取到数据可视化全流程
  • Python网络爬虫(一) - 爬取静态网页
  • 爬虫与数据分析结和
  • 小白玩转 DINO-X MCP(1):如何接入 MCP Server
  • 赚钱有什么规律,怎么泛化?
  • 多人游戏中的帧同步策略
  • macOS 搭建 Gitea 私有 Git 服务器教程
  • 【linux】企业级WEB应用服务器tomcat
  • 教程 | Win11彻底关闭“推荐的项目“,解放开始菜单! (Windows11推荐项目设置器)