Pod与容器资源监控面板自定义搭建

技术栈:Kubernetes v1.32.13 + Rocky Linux 8.6 + 监控告警系统 + Containerd 1.7.x

操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案

Pod与容器资源监控面板自定义搭建

操作环境

  • K8s 集群 3 节点:k8s-master(192.168.1.10), k8s-node1(192.168.1.11), k8s-node2(192.168.1.12),K8s 版本 v1.32.13

  • 监控组件:监控告警系统通用,已部署对应监控组件 Pod,Prometheus 已配置服务发现,Grafana 已对接数据源

  • 操作系统 Rocky Linux 8.6,容器运行时 Containerd 1.7.x,已配置监控专用命名空间 monitoring

  • 监控数据持久化:已配置 PVC 绑定,数据留存策略已规划,监控组件资源限制已设置

  • 已配置 RBAC 权限,监控组件具备集群资源读取权限,网络策略已放行监控通信端口

对接原理

Pod与容器资源监控面板自定义搭建是 K8s 集群监控告警系统运维中的核心操作场景。K8s 监控体系通过指标采集(Exporter)、数据存储(Prometheus TSDB)、可视化展示(Grafana)、告警管理(Alertmanager)四大核心组件实现全链路监控。监控告警系统通用作为监控体系的具体组件,负责指标采集、数据存储、可视化展示或告警分发。运维操作的核心目标是确保监控系统的可用性、数据质量、告警精准度和性能稳定性:通过规范化的部署配置确保监控组件稳定运行,通过精细化的指标采集确保数据完整准确,通过合理的告警规则确保故障及时发现不误报,通过性能调优确保监控系统不成为瓶颈,通过高可用和容灾备份确保监控不中断。所有操作需遵循业务无感知原则,对监控系统的变更采用灰度和滚动方式,避免影响业务监控。

详细步骤

1. 监控现状盘点与组件状态检查

# 1. 检查集群节点状态
kubectl get nodes -o wide
kubectl get pods -n monitoring -o wide 2>/dev/null || kubectl get pods -A | grep -E 'prometheus|grafana|alertmanager|exporter'
​
# 2. 检查监控组件状态
kubectl get pods -n monitoring -o wide 2>/dev/null
kubectl get svc -n monitoring -o wide 2>/dev/null
kubectl get pvc -n monitoring -o wide 2>/dev/null
​
# 3. 检查 Prometheus 状态
kubectl get pods -n monitoring -l app=prometheus -o wide 2>/dev/null
kubectl logs -n monitoring -l app=prometheus --tail=30 2>/dev/null | tail -20
​
# 4. 检查 Grafana 状态
kubectl get pods -n monitoring -l app=grafana -o wide 2>/dev/null
kubectl logs -n monitoring -l app=grafana --tail=20 2>/dev/null | tail -10
​
# 5. 检查 Alertmanager 状态
kubectl get pods -n monitoring -l app=alertmanager -o wide 2>/dev/null
kubectl logs -n monitoring -l app=alertmanager --tail=20 2>/dev/null | tail -10
​
# 6. 检查 Exporter 状态
kubectl get pods -A | grep -E 'node-exporter|cadvisor|kube-state-metrics'
kubectl get svc -A | grep -E 'node-exporter|cadvisor|kube-state-metrics'
​
# 7. 检查监控数据采集状态
# Prometheus Targets 状态
# kubectl port-forward -n monitoring svc/prometheus 9090:9090 &
# curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | {job, health, lastError}' | head -50
​
# 8. 导出监控配置备份
kubectl get cm -n monitoring -o yaml > /tmp/monitor_cm_backup_$(date +%Y%m%d).yaml 2>/dev/null
kubectl get secret -n monitoring -o yaml > /tmp/monitor_secret_backup_$(date +%Y%m%d).yaml 2>/dev/null
kubectl get pvc -n monitoring -o yaml > /tmp/monitor_pvc_backup_$(date +%Y%m%d).yaml 2>/dev/null
echo "监控配置已备份到 /tmp/"
​

2. 制定操作方案与备份防护

# 1. 备份监控配置(操作前必做)
kubectl get cm -n monitoring -o yaml > /tmp/monitor_cm_backup_$(date +%Y%m%d_%H%M%S).yaml 2>/dev/null
kubectl get secret -n monitoring -o yaml > /tmp/monitor_secret_backup_$(date +%Y%m%d_%H%M%S).yaml 2>/dev/null
kubectl get deployment,statefulset,daemonset -n monitoring -o yaml > /tmp/monitor_workload_backup_$(date +%Y%m%d_%H%M%S).yaml 2>/dev/null
kubectl get pvc -n monitoring -o yaml > /tmp/monitor_pvc_backup_$(date +%Y%m%d_%H%M%S).yaml 2>/dev/null
​
# 2. 记录当前监控状态
echo "=== 监控状态记录 $(date) ===" > /tmp/monitor_status_$(date +%Y%m%d).txt
echo "--- 监控组件 Pod ---" >> /tmp/monitor_status_$(date +%Y%m%d).txt
kubectl get pods -n monitoring -o wide 2>/dev/null >> /tmp/monitor_status_$(date +%Y%m%d).txt
echo "--- 监控 Service ---" >> /tmp/monitor_status_$(date +%Y%m%d).txt
kubectl get svc -n monitoring -o wide 2>/dev/null >> /tmp/monitor_status_$(date +%Y%m%d).txt
echo "--- 监控 PVC ---" >> /tmp/monitor_status_$(date +%Y%m%d).txt
kubectl get pvc -n monitoring -o wide 2>/dev/null >> /tmp/monitor_status_$(date +%Y%m%d).txt
cat /tmp/monitor_status_$(date +%Y%m%d).txt
​
# 3. 制定操作方案
cat > /tmp/monitor_operation_plan.md << 'EOF'
# 监控操作方案
## 一、操作目标
## 二、影响范围评估
## 三、操作步骤与时间窗口
## 四、回滚方案
## 五、验证标准
## 六、风险点与应对措施
EOF
echo "操作方案模板已创建"
​
# 4. 确认业务窗口
echo "当前时间: $(date)"
echo "建议在业务低峰期执行监控操作,避免影响业务监控"
​
# 5. 通知相关业务方
# echo "监控运维操作通知" | mail -s "监控运维通知" admin@example.com
​

3. 执行监控组件配置操作

# 1. 检查监控组件配置
# Prometheus 配置
kubectl get cm -n monitoring prometheus-config -o yaml 2>/dev/null | head -80
# Grafana 配置
kubectl get cm -n monitoring grafana-config -o yaml 2>/dev/null | head -50
# Alertmanager 配置
kubectl get cm -n monitoring alertmanager-config -o yaml 2>/dev/null | head -50
​
# 2. 检查监控组件日志
# Prometheus 日志
kubectl logs -n monitoring -l app=prometheus --tail=50 2>/dev/null | tail -30
# Grafana 日志
kubectl logs -n monitoring -l app=grafana --tail=30 2>/dev/null | tail -20
# Alertmanager 日志
kubectl logs -n monitoring -l app=alertmanager --tail=30 2>/dev/null | tail -20
​
# 3. 检查 Prometheus 配置语法
# kubectl exec -n monitoring prometheus-0 -- promtool check config /etc/prometheus/prometheus.yml
​
# 4. 检查 Alertmanager 配置语法
# kubectl exec -n monitoring alertmanager-0 -- amtool check-config /etc/alertmanager/alertmanager.yml
​
# 5. 执行具体监控配置操作(根据标题调整)
echo "执行监控组件具体配置操作..."
echo "请根据操作方案执行具体步骤"
​
# 6. 应用监控配置变更
# kubectl apply -f /tmp/monitor_config.yaml
# kubectl rollout restart deployment/prometheus -n monitoring
# kubectl rollout restart deployment/grafana -n monitoring
# kubectl rollout restart statefulset/alertmanager -n monitoring
​
# 7. 等待监控组件重启完成
kubectl rollout status deployment/prometheus -n monitoring --timeout=120s 2>/dev/null
kubectl rollout status deployment/grafana -n monitoring --timeout=120s 2>/dev/null
kubectl rollout status statefulset/alertmanager -n monitoring --timeout=120s 2>/dev/null
echo "监控组件重启完成"
​

4. 验证监控数据采集与业务无感知

# 1. 验证监控组件状态
kubectl get pods -n monitoring -o wide 2>/dev/null
# 预期:所有监控组件 Pod Running,READY 正常
​
# 2. 验证 Prometheus 数据采集
# 检查 Targets 状态
# kubectl port-forward -n monitoring svc/prometheus 9090:9090 &
# sleep 5
# curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | select(.health!="up") | {job, health, lastError}'
# 预期:所有 Targets 状态为 up,无异常
​
# 3. 验证 Prometheus 查询
# curl -s 'http://localhost:9090/api/v1/query?query=up' | jq '.data.result[] | {metric: .metric.job, value: .value[1]}' | head -20
# 预期:查询返回正常数据
​
# 4. 验证 Grafana 访问
# kubectl port-forward -n monitoring svc/grafana 3000:3000 &
# sleep 5
# curl -s http://admin:admin@localhost:3000/api/health
# 预期:Grafana 健康检查正常
​
# 5. 验证 Grafana 数据源
# curl -s http://admin:admin@localhost:3000/api/datasources | jq '.[].name'
# 预期:Prometheus 数据源已配置
​
# 6. 验证 Alertmanager 状态
# kubectl port-forward -n monitoring svc/alertmanager 9093:9093 &
# sleep 5
# curl -s http://localhost:9093/api/v2/status | jq '.cluster'
# 预期:Alertmanager 集群状态正常
​
# 7. 验证告警规则
# curl -s http://localhost:9090/api/v1/rules | jq '.data.groups[] | {name, rules: [.rules[] | {name, health}]}' | head -50
# 预期:告警规则已加载,状态健康
​
# 8. 清理 port-forward
# pkill -f "port-forward" 2>/dev/null
echo "验证完成"
​

5. 监控告警规则与面板配置

# 1. 配置监控告警规则
# 检查现有告警规则
# kubectl get cm -n monitoring prometheus-rules -o yaml 2>/dev/null | head -100
​
# 2. 配置 Alertmanager 告警路由
# 检查 Alertmanager 配置
# kubectl get cm -n monitoring alertmanager-config -o yaml 2>/dev/null
​
# 3. 配置监控告警渠道
# 企业微信/钉钉/邮件/短信告警渠道配置
# 检查 Secret 中的告警渠道配置
# kubectl get secret -n monitoring alertmanager-secret -o yaml 2>/dev/null
​
# 4. 配置监控面板
# 检查 Grafana 数据源和面板
# kubectl get cm -n monitoring grafana-dashboards -o yaml 2>/dev/null | head -50
​
# 5. 配置监控数据持久化
# 检查 PVC 绑定状态
kubectl get pvc -n monitoring -o wide 2>/dev/null
# 预期:PVC 已 Bound,数据持久化正常
​
# 6. 配置监控组件资源限制
# 检查 Deployment/StatefulSet 资源限制
kubectl get deployment -n monitoring -o jsonpath='{.items[*].spec.template.spec.containers[*].resources}' 2>/dev/null
kubectl get statefulset -n monitoring -o jsonpath='{.items[*].spec.template.spec.containers[*].resources}' 2>/dev/null
​
# 7. 配置监控组件高可用
# 检查副本数和反亲和性
kubectl get deployment -n monitoring -o jsonpath='{.items[*].spec.replicas}' 2>/dev/null
kubectl get statefulset -n monitoring -o jsonpath='{.items[*].spec.replicas}' 2>/dev/null
​
# 8. 配置监控组件日志轮转
# 检查日志配置
kubectl get cm -n monitoring -o name 2>/dev/null | head -20
​

6. 验证操作结果与生成报告

# 1. 验证监控组件状态
kubectl get pods -n monitoring -o wide 2>/dev/null
# 预期:所有监控组件 Pod Running,READY 正常
​
# 2. 验证监控数据采集
# 检查 Prometheus Targets
# kubectl port-forward -n monitoring svc/prometheus 9090:9090 &
# sleep 5
# curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets | length'
# 预期:Targets 数量符合预期
​
# 3. 验证告警规则
# curl -s http://localhost:9090/api/v1/rules | jq '.data.groups | length'
# 预期:告警规则组已加载
​
# 4. 验证 Grafana 面板
# curl -s http://admin:admin@localhost:3000/api/search | jq '.[].title' | head -20
# 预期:监控面板已配置
​
# 5. 验证 Alertmanager 告警
# curl -s http://localhost:9093/api/v2/alerts | jq 'length'
# 预期:告警状态正常
​
# 6. 验证监控数据持久化
kubectl get pvc -n monitoring -o wide 2>/dev/null
# 预期:PVC Bound,数据持久化正常
​
# 7. 验证监控组件资源使用
kubectl top pods -n monitoring 2>/dev/null
# 预期:资源使用在合理范围内
​
# 8. 生成操作报告
echo "=== 监控操作报告 ===" > /tmp/monitor_operation_report.txt
echo "操作时间: $(date)" >> /tmp/monitor_operation_report.txt
echo "监控组件 Pod 数: $(kubectl get pods -n monitoring --no-headers 2>/dev/null | wc -l)" >> /tmp/monitor_operation_report.txt
echo "异常 Pod: $(kubectl get pods -n monitoring --no-headers 2>/dev/null | grep -v Running | grep -v NAME | wc -l)" >> /tmp/monitor_operation_report.txt
echo "PVC 数: $(kubectl get pvc -n monitoring --no-headers 2>/dev/null | wc -l)" >> /tmp/monitor_operation_report.txt
echo "Service 数: $(kubectl get svc -n monitoring --no-headers 2>/dev/null | wc -l)" >> /tmp/monitor_operation_report.txt
echo "ConfigMap 数: $(kubectl get cm -n monitoring --no-headers 2>/dev/null | wc -l)" >> /tmp/monitor_operation_report.txt
cat /tmp/monitor_operation_report.txt
​
# 9. 清理 port-forward
# pkill -f "port-forward" 2>/dev/null
​

验证流程

# 1. 监控组件状态验证
kubectl get pods -n monitoring -o wide 2>/dev/null
# 预期:所有监控组件 Pod Running,READY 正常
​
# 2. Prometheus 数据采集验证
# kubectl port-forward -n monitoring svc/prometheus 9090:9090 &
# sleep 5
# curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | select(.health!="up") | {job, health}'
# 预期:所有 Targets 状态 up
​
# 3. Prometheus 查询验证
# curl -s 'http://localhost:9090/api/v1/query?query=up' | jq '.data.result | length'
# 预期:查询返回正常数据
​
# 4. Grafana 访问验证
# curl -s http://admin:admin@localhost:3000/api/health
# 预期:Grafana 健康
​
# 5. Alertmanager 状态验证
# curl -s http://localhost:9093/api/v2/status | jq '.cluster.status'
# 预期:Alertmanager 集群正常
​
# 6. 监控数据持久化验证
kubectl get pvc -n monitoring -o wide 2>/dev/null
# 预期:PVC Bound
​
# 7. 监控组件资源验证
kubectl top pods -n monitoring 2>/dev/null
# 预期:资源使用合理
​
# 8. 操作报告验证
cat /tmp/monitor_operation_report.txt
# 预期:报告包含操作前后对比
​

排错方案

  • 监控系统整体可用性问题:检查组件状态、网络连通性、资源限制、存储、配置、高可用、故障自愈

  • 监控数据质量问题:检查采集精度、完整性、时效性、一致性、降噪、去重、校验、治理

  • 告警质量问题:检查误报、漏报、迟报、重复告警、告警风暴、分级、阈值、静默、抑制、路由

  • 监控性能瓶颈:检查采集性能、存储性能、查询性能、网络带宽、资源限制、高基数、优化、扩容

  • 监控安全合规:检查 RBAC 权限、数据加密、访问审计、敏感数据、合规基线、漏洞修复、最小权限

  • 监控高可用容灾:检查组件冗余、数据备份、故障切换、容灾演练、跨机房、多集群、恢复机制

  • 监控自动化运维:检查自动部署、自动发现、自动告警、自动自愈、自动清理、脚本、CI/CD、SOP

  • 监控成本优化:检查资源利用率、存储成本、指标精简、采集频率、冷热分层、降配、归

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐