跳到主要内容

Kubernetes 集群监控

运维平台采集 Kubernetes 的节点资源容器资源(cAdvisor)集群对象状态 (kube-state-metrics),在前端「资源监控 → Kubernetes」面板展示节点、Pod、Deployment、容器等视图。

确认运维平台部署位置

运维平台部署位置决定 Kubernetes 指标采集方式:

场景配置方式
运维平台部署在 HAP/HDP Kubernetes 集群内(复用现有集群,无论 ops.yaml 还是 k8s-cluster/无需额外配置,部署完成后自动采集该集群数据。直接跳到 验证
运维平台在目标 HAP/HDP Kubernetes 集群外(例如运维平台单机部署,另有 Kubernetes 集群要监控)在被监控集群内部署 采集组件
要监控多个 Kubernetes 集群运维平台所在的 HAP/HDP Kubernetes 集群自动采集,其余每个被监控集群各部署一套采集组件,见 监控多个集群
采集动作永远发生在集群内部

无论采用哪种方式,抓取 kubelet/cAdvisor/kube-state-metrics 的采集进程都运行在被监控集群内部,并通过挂载的 ServiceAccount 访问 apiserver。因此不需要暴露任何 NodePort,Bearer Token 也不离开集群。

运维平台部署在 HAP/HDP Kubernetes 集群内:自动采集

Kubernetes 形态的部署清单已包含以下配置,无需额外操作:

组件在哪
ENV_K8S_MONITOR_MODE: "incluster"ConfigMap(ops.yaml 顶部/11-configmap.yaml
Prometheus 的 ServiceAccount + ClusterRole同一份 ops.yaml 末尾/20-rbac.yaml
kube-state-metrics同一份 ops.yaml 末尾/40-stateless.yamlops-ksm

运维平台内置 Prometheus 直接采集其所在的 HAP/HDP Kubernetes 集群,数据落本地 TSDB,无需配置 remote_write (配了等于自己推给自己,会增加不必要的写入链路)。

从 1.5.7 之前版本升级

1.5.7 之前的 ops.yaml 单文件清单里没有 RBAC 和 kube-state-metrics,Kubernetes 面板会无数据。 重新下载 ops.yaml 并覆盖 apply 后即可补齐,不影响已有数据 (新增的是 ServiceAccount/ClusterRole/kube-state-metrics 与三个 ConfigMap 键)。

如需关闭 Kubernetes 面板:将 ConfigMap 中的 ENV_K8S_MONITOR_MODE 改为 off,并移除 kube-state-metrics 相关对象。

采集组件模式:运维平台在目标集群外,或要监控多个集群

被监控集群内部署一套轻量采集组件:一个专用于采集 Kubernetes 指标的 Prometheus + RBAC + kube-state-metrics。它把指标 remote_write 推回运维平台,运维平台侧不需要能反向访问这个集群。

该模式仅要求被监控集群可出站访问运维平台,适合入站访问受限的客户环境。

⬇ 下载 k8s-addons.tar.gz

解压后先修改 30-prometheus-incluster.yaml 里的三个变量,再 apply:

- name: ENV_PROMETHEUS_REMOTE_WRITE_URL
value: "http://运维平台地址:30881/mdis/prometheus/server/api/v1/write"
- name: ENV_PROMETHEUS_REMOTE_WRITE_TOKEN
value: "运维平台的 ENV_OPS_TOKEN"
- name: ENV_K8S_CLUSTER_NAME
value: "prod-k8s" # 集群标识,面板按它区分,避免重名

写入地址按以下规则拼接,需包含三段:

http://<运维平台网关地址>:<端口> + <子路径> + /prometheus/server/api/v1/write
↑ ↑ ↑
Kubernetes 部署取 ops-gateway 运维平台的 运维平台 Prometheus 运行在
的 NodePort(默认 30881) ENV_OPS_ --web.external-url=
单机部署取 48881 SUB_PATH /prometheus/server/ 下
默认 /mdis
常见配置错误

① 不要填写运维平台的 :9090 运维平台的 ops-prometheus 是 ClusterIP,只在运维平台所在集群内可解析, 其它集群无法访问。要走网关的对外端口。

② 不要遗漏 /prometheus/server/ 少了这段返回 404

③ 必须填 token。 网关这条写入入口用 Bearer 鉴权,不填返回 401。填运维平台的 ENV_OPS_TOKEN(和登录运维平台用的是同一个)。

以上错误只会在采集端容器日志中持续重试,界面上通常表现为「无数据」。配置完成后先执行自检 (在采集组件的 Pod 里执行):

# 不带 token —— 应该 401,说明入口在、鉴权生效
curl -s -o /dev/null -w '%{http_code}\n' -X POST \
http://运维平台地址:30881/mdis/prometheus/server/api/v1/write

# 带 token —— 应该 400(端点存在,只是拒绝了空请求体)
curl -s -o /dev/null -w '%{http_code}\n' -X POST \
-H 'Authorization: Bearer 运维平台的ENV_OPS_TOKEN' \
http://运维平台地址:30881/mdis/prometheus/server/api/v1/write

返回 404 就是地址拼错了;两次都 401 就是 token 不对。

改完 apply:

kubectl apply \
-f k8s-addons/00-namespace.yaml \
-f k8s-addons/10-kube-state-metrics.yaml \
-f k8s-addons/30-prometheus-incluster.yaml

数据流:

┌─ 被监控集群 ──────────────────────────────┐
│ kubelet / cAdvisor ──┐ │
│ kube-state-metrics ──┼─→ 采集 Prometheus │
│ apiserver ───────────┘ (使用本集群 SA) │
└────────────────────────────────┬──────────┘
│ remote_write(仅需出站,带 Bearer token)

运维平台网关 :30881/mdis/prometheus/server/api/v1/write

运维平台 Prometheus(写入本地 TSDB)

Grafana「资源监控 → Kubernetes」面板
只推 Kubernetes 指标

采集器只把 kube_*/container_*/kubelet_*/machine_*/node_* 推回运维平台,它自身的 Prometheus 运行指标不会推过去占存储。

采集组件清单

文件作用是否必需
00-namespace.yaml命名空间 mdis-monitoring
10-kube-state-metrics.yamlkube-state-metrics + RBAC + Service
20-node-exporter.yamlnode_exporter DaemonSet + Service可选(节点/容器指标已由 kubelet+cAdvisor 覆盖)
30-prometheus-incluster.yaml集群内 ops-prometheus + RBAC + Service
40-alloy-logs.yaml容器日志采集 DaemonSet需要采集容器日志时部署,见服务日志接入

40-alloy-logs.yaml 负责日志采集,不负责指标采集,上述 apply 命令未包含该文件。使用前需先修改 ENV_LOKI_PUSH_URL。未部署该文件时 Kubernetes 面板仍有指标数据,但「容器控制台」无数据。

不要将采集组件部署到运维平台所在的 HAP/HDP Kubernetes 集群

运维平台已经自动采集其所在的 HAP/HDP Kubernetes 集群,再部署一套采集组件会造成重复采集:两份数据以不同集群名写入同一个 TSDB, 面板下拉里会出现难以对应的条目,并产生额外存储开销。

监控多个集群

每个集群的指标都会携带 origin_prometheus=<集群名> 标签进入运维平台,「资源监控 → Kubernetes」面板顶部 会显示**「集群」下拉**,可按集群切换,默认 All(合并展示)。

以下以「运维平台部署在集群 A,并纳管集群 B」为例说明配置过程。

第 1 步:给运维平台所在的集群 A 起个名字

集群 A 已经由运维平台自动采集,只需配置可识别的集群名称。修改运维平台的 ConfigMap:

kubectl -n hap-ops edit configmap ops-config

ENV_K8S_CLUSTER_NAME 从默认的 default 改成有意义的名字:

ENV_K8S_CLUSTER_NAME: "main-k8s"

重启 Prometheus 使配置生效(该值在启动时写入 Prometheus 的 external_labels):

kubectl -n hap-ops rollout restart deployment/ops-prometheus
改名会让历史数据分家

origin_prometheus 是打在指标上的标签,改名后新数据用新名字,旧数据仍是 default, 面板下拉里会同时出现两个条目。建议在上线初期完成命名确认,避免后期变更影响历史数据识别。

第 2 步:在集群 B 里装采集组件

先确认 B 能出站访问 A 的网关端口(默认 NodePort 30881),A 不需要能反向访问 B:

# 在集群 B 的任一节点上
curl -s -o /dev/null -w '%{http_code}\n' http://集群A地址:30881/mdis/web/

然后下载 k8s-addons.tar.gz,改 30-prometheus-incluster.yaml 的三个变量:

- name: ENV_PROMETHEUS_REMOTE_WRITE_URL
value: "http://集群A地址:30881/mdis/prometheus/server/api/v1/write"
- name: ENV_PROMETHEUS_REMOTE_WRITE_TOKEN
value: "集群A运维平台的 ENV_OPS_TOKEN"
- name: ENV_K8S_CLUSTER_NAME
value: "prod-k8s"

apply(在集群 B 的 kubeconfig 下执行):

kubectl apply \
-f k8s-addons/00-namespace.yaml \
-f k8s-addons/10-kube-state-metrics.yaml \
-f k8s-addons/30-prometheus-incluster.yaml

第 3 步:确认推送成功

在集群 B 看采集组件的日志,应无 remote_write 相关的重试报错:

kubectl -n mdis-monitoring logs deploy/ops-prometheus | grep -iE '\[k8s\]|remote|error' | tail

回到运维平台,「资源监控 → Kubernetes」面板顶部的「集群」下拉里应能看到 main-k8sprod-k8s 两项。也可直接查运维平台 Prometheus 有几个集群在报数据:

count by (origin_prometheus) (kube_node_info)

再加第三个、第四个集群

重复第 2 步即可。每个集群仅需修改 ENV_K8S_CLUSTER_NAME,写入地址和 token 都指向同一套运维平台:

集群配置方式ENV_K8S_CLUSTER_NAME
A(运维平台所在)已自采,改 ConfigMapmain-k8s
B一套采集组件prod-k8s
C一套采集组件test-k8s
集群名需具备可读性,避免使用 IP 或重复名称

面板下拉中显示的就是该名称。两个集群使用同一名称时,指标会混在一起且无法区分。

运维平台侧不需要任何额外配置。但要留意存储容量:N 个集群的指标都会写入运维平台的 TSDB, 集群多或规模大时,按需调大 ENV_PROMETHEUS_RETENTION_SIZE 或扩盘。

验证

ServiceAccount + apiserver proxy 会自动发现 kubelet、cAdvisor、kube-state-metrics 和 pods, 无需暴露 kubelet 端口、无需 kubeconfig。

运维平台自动采集其所在的 HAP/HDP Kubernetes 集群ops.yamlhap-opsk8s-cluster/ 同名):

kubectl -n hap-ops get deploy kube-state-metrics
kubectl -n hap-ops exec deploy/ops-prometheus -- \
curl -s localhost:9090/prometheus/server/api/v1/targets | grep -o '"job":"k8s-[^"]*"'

采集组件模式(部署在被监控集群的 mdis-monitoring):

kubectl -n mdis-monitoring get pods
kubectl -n mdis-monitoring logs deploy/ops-prometheus | grep '\[k8s\]'

启动日志里应有一行 [k8s] incluster 采集已启用,集群标识 origin_prometheus="..."; 配置 remote_write 后,日志中还会显示推送目标。地址前缀错误时,该日志会直接给出告警。

两种情况下 k8s-kubelet/k8s-cadvisor/k8s-kube-state-metrics 三个 job 都应为 UP, 随后进入前端「资源监控 → Kubernetes」面板,即可查看节点与 Pod 视图。