ClayWangzhi 2025-09-12 07:16 广东
覆盖基础设施、Kubernetes 核心组件、业务应用的立体化监控体系。

📊 **立体化监控体系架构**:文章构建了一个多层次的监控体系,覆盖从基础设施到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 核心组件、业务应用的立体化监控体系。
架构层级 | 核心组件 |
控制平面层 | etcd、API Server、Scheduler、Controller Manager |
工作节点层 | Kubelet、Kube-proxy、CRI(容器运行时接口)、CNI(网络插件)、CSI(存储插件) |
资源对象层 | Pod、Deployment、StatefulSet、Horizontal Pod Autoscaler |
扩展插件层 | CoreDNS、Ingress Controller、KEDA(事件驱动自动扩缩)、Argo Rollouts |
关键实践:1)业务维度治理:通过 AppID 标签实现应用级告警归并,自动路由至对应研发团队2)基础架构告警:系统组件告警统一配置 SRE 专属 AppID,保障基础设施稳定性3)标签规范:所有资源对象(Pod/Deployment 等)强制携带 AppID 标签4)告警溯源:通过 PromQL 实现告警事件与业务指标的关联分析route:group_by:group_wait: 30sgroup_interval: 5mrepeat_interval: 3hreceiver: 'default-receiver'
镜像加速方案:完整脚本见附录# 添加 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
# 自动化镜像地址替换脚本 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' {} \;
实施步骤:1)创建 ConfigMap 存储采集配置# customresourcestate-argo.yamlresources:- groupVersionKind:group: argoproj.ioversion: v1alpha1kind: Rolloutmetrics:- name: argo_rollout_appidhelp: "Argo Rollout application identifier"each:type: Infoinfo:labelsFromPath:exported_namespace: [metadata, namespace]metricLabels:appid: .metadata.labels.appid
kubectl -n monitoring create configmap customresourcestate-config --from-file=customresourcestate-argo.yaml2)扩展 Kube-State-Metrics RBAC 权限3)挂载配置文件到 KSM Pod,添加启动参数 --custom-resource-state-config-fileapiVersion: 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"]
关联查询示例:containers:- args:- --custom-resource-state-config-file=/etc/config/customresourcestate-argo.yamlvolumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: customresourcestate-config
四、监控可视化体系# 获取带有 AppID 的 Rollout 副本可用率kube_argo_rollouts_status_replicas_available* on(namespace, rollout_name) group_left(appid)kube_customresource_argo_rollout_appid
# 检测操作系统类型if [[ "$(uname)" == "Darwin" ]]; then# macOSSED_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; doecho "处理文件: $yaml_file"# 使用 awk 处理整个文件,以处理隔行的 registry 和 repositoryawk -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"doneecho "所有 YAML 文件处理完成!"
作者丨ClayWangzhi
来源丨公众号:SRE运维进阶之路(ID:sre-k8s)
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。
鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑