Kubernetes集群状态监控脚本

代码脚本 · 容器

监控Kubernetes集群状态,检查Node、Pod、Deployment、Service健康状态,输出集群健康报告

详细内容

#!/bin/bash # ========================================== # Kubernetes集群状态监控脚本 # 用途:监控K8s集群状态,检查Node、Pod、Deployment健康状态 # 使用方法:bash k8s_monitor.sh # ========================================== # 配置 NAMESPACE="${NAMESPACE:-all}" ALERT_EMAIL="${ALERT_EMAIL:-}" ALERT_WEBHOOK="${ALERT_WEBHOOK:-}" echo "========== Kubernetes集群监控报告 ==========" echo "监控时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "命名空间: $NAMESPACE" echo "" # 检查kubectl if ! command -v kubectl &> /dev/null; then echo "❌ 错误: kubectl未安装" exit 1 fi # 检查集群连接 if ! kubectl cluster-info &> /dev/null; then echo "❌ 错误: 无法连接Kubernetes集群" exit 1 fi echo "✅ 集群连接成功" echo "" ALERTS=() # 1. 集群信息 echo "【1. 集群信息】" kubectl cluster-info 2>/dev/null | head -5 echo "" # 2. Node状态 echo "【2. Node节点状态】" NODE_COUNT=$(kubectl get nodes --no-headers 2>/dev/null | wc -l) READY_NODES=$(kubectl get nodes --no-headers 2>/dev/null | grep -c "Ready") NOT_READY_NODES=$((NODE_COUNT - READY_NODES)) echo " 总节点数: $NODE_COUNT" echo " Ready: $READY_NODES" echo " NotReady: $NOT_READY_NODES" echo "" kubectl get nodes -o wide 2>/dev/null | while read line; do echo " $line" done if [ "$NOT_READY_NODES" -gt 0 ]; then ALERTS+=("🔴 有 $NOT_READY_NODES 个节点状态异常") fi echo "" # 3. Pod状态 echo "【3. Pod状态】" if [ "$NAMESPACE" = "all" ]; then POD_CMD="kubectl get pods --all-namespaces" else POD_CMD="kubectl get pods -n $NAMESPACE" fi TOTAL_PODS=$(eval $POD_CMD --no-headers 2>/dev/null | wc -l) RUNNING_PODS=$(eval $POD_CMD --no-headers 2>/dev/null | awk '{print $NF}' | grep -c "Running") PENDING_PODS=$(eval $POD_CMD --no-headers 2>/dev/null | awk '{print $NF}' | grep -c "Pending") FAILED_PODS=$(eval $POD_CMD --no-headers 2>/dev/null | awk '{print $NF}' | grep -cE "Failed|CrashLoopBackOff|Error|ImagePullBackOff") echo " 总Pod数: $TOTAL_PODS" echo " Running: $RUNNING_PODS" echo " Pending: $PENDING_PODS" echo " Failed/Error: $FAILED_PODS" echo "" # 显示异常Pod echo " 异常Pod列表:" eval $POD_CMD --no-headers 2>/dev/null | awk '$NF != "Running" && $NF != "Completed"' | head -10 | while read line; do echo " ⚠️ $line" done if [ "$FAILED_PODS" -gt 0 ]; then ALERTS+=("🔴 有 $FAILED_PODS 个Pod状态异常") fi if [ "$PENDING_PODS" -gt 5 ]; then ALERTS+=("⚠️ 有 $PENDING_PODS 个Pod处于Pending状态") fi echo "" # 4. Deployment状态 echo "【4. Deployment状态】" if [ "$NAMESPACE" = "all" ]; then DEPLOY_CMD="kubectl get deployments --all-namespaces" else DEPLOY_CMD="kubectl get deployments -n $NAMESPACE" fi eval $DEPLOY_CMD 2>/dev/null | while read line; do echo " $line" done # 检查不可用的Deployment UNAVAILABLE_DEPLOYS=$(eval $DEPLOY_CMD --no-headers 2>/dev/null | awk '{if ($4 != $3) print $0}' | wc -l) if [ "$UNAVAILABLE_DEPLOYS" -gt 0 ]; then ALERTS+=("⚠️ 有 $UNAVAILABLE_DEPLOYS 个Deployment副本数不匹配") fi echo "" # 5. Service状态 echo "【5. Service状态】" if [ "$NAMESPACE" = "all" ]; then SVC_CMD="kubectl get services --all-namespaces" else SVC_CMD="kubectl get services -n $NAMESPACE" fi eval $SVC_CMD 2>/dev/null | head -20 | while read line; do echo " $line" done echo "" # 6. 资源使用情况 echo "【6. 资源使用情况】" echo " Node资源使用:" kubectl top nodes 2>/dev/null | while read line; do echo " $line" done echo "" echo " Pod资源使用(Top 10 CPU):" kubectl top pods --all-namespaces --sort-by=cpu 2>/dev/null | head -11 | while read line; do echo " $line" done echo "" # 7. 事件检查 echo "【7. 最近异常事件】" kubectl get events --all-namespaces --field-selector type=Warning --sort-by='.lastTimestamp' 2>/dev/null | tail -10 | while read line; do echo " ⚠️ $line" done echo "" # 8. 告警汇总 echo "【8. 告警汇总】" if [ ${#ALERTS[@]} -gt 0 ]; then echo " 🔴 发现 ${#ALERTS[@]} 个告警:" for alert in "${ALERTS[@]}"; do echo " $alert" done # 发送告警 if [ -n "$ALERT_EMAIL" ] || [ -n "$ALERT_WEBHOOK" ]; then msg="K8s集群告警 - $(hostname) " for alert in "${ALERTS[@]}"; do msg="$msg$alert " done if [ -n "$ALERT_EMAIL" ]; then echo -e "$msg" | mail -s "K8s集群告警" "$ALERT_EMAIL" 2>/dev/null fi if [ -n "$ALERT_WEBHOOK" ]; then curl -s -X POST "$ALERT_WEBHOOK" -H "Content-Type: application/json" -d "{"content": "$msg"}" >/dev/null 2>&1 fi fi else echo " ✅ 集群运行正常,无告警" fi echo "" echo "========== 监控完成 ==========" echo "常用命令:" echo " 查看Pod日志: kubectl logs -n " echo " 进入Pod: kubectl exec -it -n -- /bin/bash" echo " 描述Pod: kubectl describe pod -n " echo " 查看事件: kubectl get events -n --sort-by='.lastTimestamp'"

适配环境

适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+

依赖环境:bash 4.0+

参数说明

[{"name": "NAMESPACE", "label": "\u547d\u540d\u7a7a\u95f4(all=\u5168\u90e8)", "default": "all"}, {"name": "ALERT_EMAIL", "label": "\u544a\u8b66\u90ae\u7bb1", "default": ""}, {"name": "ALERT_WEBHOOK", "label": "Webhook\u5730\u5740", "default": ""}]
KubernetesK8s集群监控Pod状态容器编排

更多容器