别等挂了才后悔!企业级 K8s 监控体系设计全攻略

ClayWangzhi 2025-09-12 10:47:50

一、系统架构全景解析

 

 
1、K8s 分层架构
 

 

架构层级
核心组件
控制平面层
etcd、API Server、Scheduler、Controller Manager
工作节点层
Kubelet、Kube-proxy、CRI(容器运行时接口)、CNI(网络插件)、CSI(存储插件)
资源对象层
Pod、Deployment、StatefulSet、Horizontal Pod Autoscaler
扩展插件层
CoreDNS、Ingress Controller、KEDA(事件驱动自动扩缩)、Argo Rollouts

 

 
2、监控体系架构

 

 

核心设计要点:

 

  • 高可用架构:Prometheus 双副本部署,通过 Remote Write 统一写入 VictoriaMetrics 集群

  • 告警中枢:外置 AlertManager 集群实现告警收敛,通过 Webhook 对接告警系统

  • 数据持久化:alertsnitch 组件实现告警事件存储,VictoriaMetrics 作为统一时序数据库

  • 可视化层:Grafana 统一对接 VictoriaMetrics 数据源,实现监控数据可视化

 

二、告警管理体系建设

 

 
1、告警分组策略

 

  •  
  •  
  •  
  •  
  •  
  •  
route:  group_by: [appid, alertname]  group_wait30s  group_interval5m  repeat_interval3h  receiver: 'default-receiver'

 

关键实践:

 

1)业务维度治理:通过 AppID 标签实现应用级告警归并,自动路由至对应研发团队

2)基础架构告警:系统组件告警统一配置 SRE 专属 AppID,保障基础设施稳定性

3)标签规范:所有资源对象(Pod/Deployment 等)强制携带 AppID 标签

4)告警溯源:通过 PromQL 实现告警事件与业务指标的关联分析

 

三、监控系统部署实践

 

 
1、Prometheus 高可用部署

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 添加 Helm 仓库helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 下载 Chart 包(注意 k8s 和 Prometheus-Operator 的对应关系)helm pull prometheus-community/kube-prometheus-stack --version 69.8.2tar -xvf kube-prometheus-stack-69.8.2.tgzcd kube-prometheus-stack/
# 镜像加速chmod +x update_registry.sh./update_registry.sh# 安装helm -n monitoring install kube-prometheus-stack ./ --create-namespace

 

镜像加速方案:

 

完整脚本见附录

 

  •  
  •  
  •  
  •  
  •  
  •  
#!/bin/bash# 自动化镜像地址替换脚本 demofind ./ -type f -name "*.yaml" -exec sed -i \    -e 's|registry.k8s.io|m.daocloud.io/registry.k8s.io|g' \    -e 's|quay.io|m.daocloud.io/quay.io|g' \    -e 's|docker.io|m.daocloud.io/docker.io|g' {} \;

 

 
2、指标采集体系

 

 

采集架构:

 

 

 

 

Prometheus
ServiceMonitor
Service
Endpoint
Pod

 

故障排查路径:

 

1)验证 ServiceMonitor 选择器标签匹配

2)检查对应 Service 的 Endpoints 状态

3)确认组件 Metric 端口可达性

4)验证网络策略(NetworkPolicy)配置

 

 
3、资源对象层 AppID 标签暴露

 

主要都是 kube-state-metrics 收集的, K8s 内置的资源对象 , 只需要添加启动参数即可

 

- --metric-labels-allowlist=nodes=[env],deployments=[appid],pods=[appid],services=[appid]

 

 
4、自定义crd 标签暴露

 

Argo Rollouts 指标采集配置:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# customresourcestate-argo.yamlresources:  - groupVersionKind:      group: argoproj.io      version: v1alpha1      kind: Rollout    metrics:      - name: argo_rollout_appid        help"Argo Rollout application identifier"        each:          type: Info          info:            labelsFromPath:              exported_namespace: [metadata, namespace]            metricLabels:              appid: .metadata.labels.appid

 

实施步骤:

 

1)创建 ConfigMap 存储采集配置

 

  •  
kubectl -n monitoring create configmap customresourcestate-config --from-file=customresourcestate-argo.yaml

 

2)扩展 Kube-State-Metrics RBAC 权限

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  name: kube-state-metrics-argorules:- apiGroups: ["apiextensions.k8s.io"]  resources: ["customresourcedefinitions"]  verbs: ["list""watch"]- apiGroups: ["argoproj.io"]  resources: ["rollouts"]  verbs: ["list""watch"]

 

3)挂载配置文件到 KSM Pod,添加启动参数 --custom-resource-state-config-file

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
containers:- args:  - --custom-resource-state-config-file=/etc/config/customresourcestate-argo.yaml  volumeMounts:  - name: config-volume    mountPath: /etc/configvolumes:- name: config-volume  configMap:    name: customresourcestate-config

 

关联查询示例:

 

  •  
  •  
  •  
  •  
# 获取带有 AppID 的 Rollout 副本可用率kube_argo_rollouts_status_replicas_available on(namespace, rollout_name) group_left(appid)kube_customresource_argo_rollout_appid

 

四、监控可视化体系

 

 
1、全局概览看板

 

 

核心功能模块:

 

  • 全局筛选器:集群(前端、后端、AI、大数据、中间件、流水线等)、区域(IDC-上海、IDC-北京、阿里云、腾讯云、华为云等)、环境(产线、UT、泳道等)

     

  • 资源水位:节点数量、CPU/Memory 总量、Pod 配额使用率

 

  • 集群健康度:Etcd 选举状态、API Server 可用性、资源请求率、K8s 架构图(Flow Charting):按照上面的K8s架构分层图进行绘制,分为 K8s 资源对象块、控制平面块、工作节点块(kubelet、kube-proxy、CNI、CSI、CRI)、插件块 (每个小图标都是一个超链, 显示组件目前的状态(通过是否有告警判断), 超链可以自动跳转到各自组建的监控大盘中)

 

  • 异常监控:Node 负载水位线、Pod Crash 事件流

 

关键 PromQL 集锦:

 

使用的关键 promql 函数 count、unless、sum、 group_left、sum、max、label_replace、rate、avg、min_over_time

 

 
2、应用级监控看板

 

监控维度:

 

  • 资源维度:CPU/Memory 限流分析、存储 IOPS、网络吞吐量

  • 运行时指标:FD 使用率、线程数统计、TCP 连接状态

  • 业务指标:QPS/TPS、错误率、健康检查成功率

  • 事件中心:Kubernetes 事件流、应用日志聚合

 

可视化设计原则:

 

1)采用分层展示结构:集群级 -> 节点级 -> 应用级

2)使用热力图展示资源分布密度

3)异常指标使用动态阈值告警

4)关键性能指标展示同比/环比数据

 

五、最佳实践总结

 

1、标签治理:严格执行 AppID 标签规范,确保监控-日志-追踪三位一体

2、采集优化:按需配置采集间隔,重要指标 15s 粒度,业务指标 1m 粒度

3、容量规划预估存储用量 每日数据量 = 指标数量 × 采集频率 × 24h × 保留天数

4、告警收敛:配置分级告警策略,关键告警立即通知,预警类告警延迟处理

5、版本管理:Chart 版本与 Kubernetes 版本严格对应,定期验证兼容性

 

通过以上架构设计和实践方案,可构建覆盖基础设施、Kubernetes 核心组件、业务应用的立体化监控体系,为容器化业务提供全方位可观测性保障。

 

附录:

 

镜像加速脚本

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#!/bin/bash
# 检测操作系统类型if [[ "$(uname)" == "Darwin" ]]; then  # macOS  SED_CMD="sed -i ''"else  # Linux 和其他  SED_CMD="sed -i"fi
# 查找当前目录及子目录下的所有 YAML 文件find . -type f -name "values.yaml" -o -name "values.yml" | while read yaml_file; do  echo "处理文件: $yaml_file"
  # 使用 awk 处理整个文件,以处理隔行的 registry 和 repository  awk -v file="$yaml_file" -v sed_cmd="$SED_CMD" '  BEGIN { registry = ""; in_block = 0; }
  /registry:/ {    # 提取 registry 值    for (i=1; i<=NF; i++) {      if ($i == "registry:") {        registry = $(i+1);        gsub(/[",]/, "", registry);  # 移除可能的引号和逗号        in_block = 1;        print "找到 registry:", registry, "在文件", file;      }    }  }
  /repository:/ {    if (in_block && registry != "") {      # 提取 repository 值      for (i=1; i<=NF; i++) {        if ($i == "repository:") {          repo = $(i+1);          gsub(/[",]/, "", repo);  # 移除可能的引号和逗号          print "找到匹配的 repository:", repo, "在文件", file;
          # 构建并执行 sed 命令          cmd = sed_cmd " '\''s|repository: " repo "|repository: " registry "/" repo "|g'\'' " file;          system(cmd);
          # 重置状态          in_block = 0;          registry = "";        }      }    }  }  # 如果遇到新的块开始,重置状态  /^[^ ]/ {    if ($1 != "registry:" && $1 != "repository:") {      in_block = 0;      registry = "";    }  }  ' "$yaml_file"  # 然后替换所有 registry 地址  $SED_CMD 's|registry: docker.io|registry: m.daocloud.io|g' "$yaml_file"  $SED_CMD 's|registry: registry.k8s.io|registry: m.daocloud.io|g' "$yaml_file"  $SED_CMD 's|registry: quay.io|registry: m.daocloud.io|g' "$yaml_file"  $SED_CMD 's|registry: ghcr.io|registry: m.daocloud.io|g' "$yaml_file"
  echo "完成处理: $yaml_file"done
echo "所有 YAML 文件处理完成!"

 

作者丨ClayWangzhi

来源丨公众号:SRE运维进阶之路(ID:sre-k8s)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

最新评论
访客 2024年04月08日

如果字段的最大可能长度超过255字节,那么长度值可能…

访客 2024年03月04日

只能说作者太用心了,优秀

访客 2024年02月23日

感谢详解

访客 2024年02月20日

一般干个7-8年(即30岁左右),能做到年入40w-50w;有…

访客 2023年08月20日

230721

活动预告