监控K8s集群中指定Pod是否处于运行状态的最简单方法是什么?
K8s指定Pod状态异常告警极简实现方案
方案优势
无需部署Prometheus整套监控栈,无需配置集群级ClusterRole/ClusterRoleBinding,权限最小化收敛,整体配置不足100行。
实现步骤
1. 配置最小权限访问凭证
仅为监控任务分配目标命名空间下Pod的只读权限,使用Namespace级别的Role即可,完全不需要集群级权限:
创建权限配置文件pod-monitor-rbac.yaml:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: <替换为podName-0所在的命名空间> name: pod-status-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get"] --- apiVersion: v1 kind: ServiceAccount metadata: name: pod-monitor-sa namespace: <替换为podName-0所在的命名空间> --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pod-status-reader-binding namespace: <替换为podName-0所在的命名空间> subjects: - kind: ServiceAccount name: pod-monitor-sa namespace: <替换为podName-0所在的命名空间> roleRef: kind: Role name: pod-status-reader apiGroup: rbac.authorization.k8s.io
执行命令生效:kubectl apply -f pod-monitor-rbac.yaml
2. 编写状态检查与告警逻辑
直接用内置kubectl的轻量镜像,脚本逻辑如下,你也可以把脚本打包进自定义镜像减少运行时依赖:
#!/bin/sh # 自定义配置项,替换为实际值 TARGET_POD="podName-0" TARGET_NS="<替换为目标命名空间>" RECEIVE_MAIL="<告警接收人邮箱>" SMTP_SERVER="<你的发件邮箱SMTP地址:端口,例如smtp.qq.com:587>" SMTP_USER="<发件人邮箱账号>" SMTP_PWD="<发件人邮箱SMTP授权码>" # 检查Pod状态,查询失败/状态非Running都判定为异常 POD_PHASE=$(kubectl get pod ${TARGET_POD} -n ${TARGET_NS} -o jsonpath='{.status.phase}' 2>/dev/null) if [ "${POD_PHASE}" != "Running" ]; then echo "Subject: 【告警】K8s Pod ${TARGET_POD} 运行异常 Pod ${TARGET_POD} 当前状态为 ${POD_PHASE:-不存在/查询失败},未处于正常Running状态,请尽快排查处理。" | sendmail -S ${SMTP_SERVER} -au ${SMTP_USER} -ap ${SMTP_PWD} ${RECEIVE_MAIL} fi
3. 部署定时任务周期性检查
用K8s原生CronJob运行监控脚本,示例配置每分钟执行一次,频率可自行调整:
创建pod-monitor-cronjob.yaml:
apiVersion: batch/v1 kind: CronJob metadata: name: pod-status-monitor namespace: <替换为目标命名空间> spec: schedule: "*/1 * * * *" concurrencyPolicy: Forbid jobTemplate: spec: backoffLimit: 1 template: spec: serviceAccountName: pod-monitor-sa restartPolicy: OnFailure containers: - name: monitor image: alpine/k8s:1.27.3 command: ["/bin/sh", "-c"] args: - | apk add --no-cache sendmail # 把上面的监控脚本内容粘贴到此处
执行命令生效:kubectl apply -f pod-monitor-cronjob.yaml
更轻量替代方案(无需修改集群配置)
如果你的本地机器/跳板机已经配置了可访问目标集群的kubeconfig,且具备目标Pod的只读权限,可以直接把上述脚本放在本地,配置Linux crontab定时执行即可,完全不需要在集群内创建任何资源。
内容的提问来源于stack exchange,提问作者Neo Gónzález
相关产品推荐
相关产品推荐

