dbaplus社群 09月12日
构建全面的Kubernetes立体化监控体系
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了如何构建一个覆盖基础设施、Kubernetes核心组件及业务应用的立体化监控体系。文章从系统架构解析入手,阐述了K8s的分层架构及监控体系的核心设计要点,强调了高可用、告警中枢和数据持久化。接着,文章深入探讨了告警管理体系建设,包括告警分组策略和业务维度治理。在监控系统部署实践部分,提供了Prometheus高可用部署、指标采集、资源对象标签暴露及自定义CRD指标采集的详细步骤和示例。最后,文章阐述了监控可视化体系的设计原则,并总结了标签治理、采集优化、容量规划、告警收敛和版本管理等最佳实践,旨在为容器化业务提供全方位的可观测性保障。

📊 **立体化监控体系架构**:文章构建了一个多层次的监控体系,覆盖从基础设施到Kubernetes核心组件,再到业务应用。该体系采用高可用的Prometheus双副本部署,通过Remote Write统一写入VictoriaMetrics集群;告警通过外置AlertManager集群收敛,并对接至告警系统;数据持久化利用alertsnitch存储告警事件,VictoriaMetrics作为时序数据库;可视化层则由Grafana统一对接数据源,实现全面的监控数据展示。

🔔 **精细化告警管理**:通过`route`配置实现告警分组,利用`appid`标签进行业务维度治理,将告警自动路由至对应研发团队,同时为基础架构告警配置SRE专属`appid`。要求所有资源对象强制携带`appid`标签,并利用PromQL实现告警事件与业务指标的关联分析,便于告警溯源。

🚀 **部署实践与指标采集**:详细介绍了使用Helm部署高可用的kube-prometheus-stack,并提供了镜像加速脚本。在指标采集方面,阐述了`ServiceMonitor`、`Service`、`Endpoint`和`Pod`之间的关系,并提供了故障排查路径。同时,指导了如何通过修改`kube-state-metrics`启动参数和扩展RBAC权限,暴露资源对象和自定义CRD(如Argo Rollouts)的`appid`标签,实现更精细化的监控。

📈 **可视化与最佳实践**:设计了全局概览看板,包含全局筛选器、资源水位、集群健康度、异常监控等模块,并支持K8s架构图的交互式展示。同时,提出了应用级监控看板的设计原则,如分层展示、热力图、动态阈值告警和同比/环比数据。最后,总结了标签治理、采集优化、容量规划、告警收敛和版本管理等最佳实践,以确保监控体系的有效运行和长期可维护性。

ClayWangzhi 2025-09-12 07:16 广东

覆盖基础设施、Kubernetes 核心组件、业务应用的立体化监控体系。

一、系统架构全景解析

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、监控体系架构

核心设计要点:

二、告警管理体系建设

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.2
tar -xvf kube-prometheus-stack-69.8.2.tgz
cd kube-prometheus-stack/

# 镜像加速
chmod +x update_registry.sh
./update_registry.sh
# 安装
helm -n monitoring install kube-prometheus-stack ./ --create-namespace

镜像加速方案:

完整脚本见附录

#!/bin/bash
# 自动化镜像地址替换脚本 demo
find ./ -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.yaml
resources:
  - 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/v1
kind: ClusterRole
metadata:
  name: kube-state-metrics-argo
rules:
- 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/config
volumes:
- 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、全局概览看板

核心功能模块:

关键 PromQL 集锦:

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

2、应用级监控看板

监控维度:

可视化设计原则:

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

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Kubernetes 监控 Prometheus Grafana SRE 可观测性 告警管理 系统架构 Monitoring Observability Alerting System Architecture
相关文章