核心腳本功能:
- 一鍵檢查集群核心組件狀態
- 自動化掃描節點/Pod異常
- 存儲與網絡關鍵指標檢測
- 風險分級輸出(紅/黃/綠標識)
一、自動化巡檢腳本 (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 nodes | CPU/Mem ≥85% 告警,≥95% 嚴重 |
Pod重啟次數 | Pod注解restartCount | >5次為異常 |
PVC綁定狀態 | kubectl get pvc | 非Bound狀態即高風險 |
DNS解析延遲 | 臨時Pod執行nslookup | >5s 警告 |
證書有效期 | 解析Kubeconfig證書 | 有效期<90天高風險 |
三、自動化部署建議
-
定時任務配置(每日巡檢):
# 將腳本加入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/"
-
Prometheus關鍵告警規則(示例):
# 內存泄漏檢測 - alert: NodeMemoryPressureexpr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 85for: 10mlabels:severity: warningannotations:summary: "節點內存壓力 ({{ $labels.instance }})"
四、緊急事件處理流程
當腳本輸出 CRITICAL(紅色) 時:
- Master組件異常:立即檢查
kube-apiserver
/etcd
日志 - 節點NotReady:
kubectl cordon <NODE_NAME> # 停止調度 kubectl drain <NODE_NAME> # 驅逐Pod
- 證書即將過期:
kubeadm certs renew all # 使用kubeadm更新證書
最佳實踐補充:
- 探針配置:Java應用設置
initialDelaySeconds: 120
避免頻繁重啟- 存儲擴容:當PVC使用率>80%時自動觸發擴容(需配置CSI StorageClass)
- 日志跟蹤:集成ELK過濾
ERROR
日志并統計占比(>5%觸發告警)