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": ""}]