对于使用自建Prometheus监控系统的混合云环境,为统一纳管ACK One注册集群的控制面健康状态,可安装Metrics Aggregator组件并配置ServiceMonitor,从而将核心组件指标集成到现有监控体系,实现统一告警与观测。
工作原理
在 ACK One注册集群中,控制面组件(如kube-scheduler、cloud-controller-manager等)运行在阿里云托管侧,无法直接访问。为了让自建的Prometheus能够采集这些组件的监控指标,ACK 提供了以下解决方案:
指标聚合与暴露:托管侧的 Metrics Aggregator 组件负责收集和聚合各个控制面组件的指标数据,并通过 API Server 的内网端点(SLB)向集群暴露一个统一的Metrics接口。
服务发现机制:在集群中部署一个Headless Service,其Endpoints指向托管侧 API Server 的内网 SLB IP 地址。通过 ServiceMonitor(Prometheus Operator 的 CRD 资源)配置服务发现规则,Prometheus 可以自动发现并监控该 Service。
采集流程:Prometheus 通过 ServiceMonitor 发现目标 Service,解析其 Endpoints,然后通过内网 SLB 访问托管侧的指标聚合接口,最终完成控制面组件指标的采集。
整个过程无需暴露公网端点,确保了安全性和网络性能。
推荐在集群中使用阿里云Prometheus监控。阿里云Prometheus会监控和自动采集数据,并提供实时的Grafana大盘,也支持为监控任务创建报警,通过邮件、短信、钉钉等渠道实时接收报警。
适用范围
ACK One注册集群的ack-stub组件版本需为v1.15.0.4及以上。
步骤一:安装Metrics Aggregator组件
安装Metrics Aggregator组件以启用控制面组件的指标聚合功能。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理。
在组件管理页面,搜索Metrics Aggregator,在组件卡片中单击安装,按提示完成安装操作。
步骤二:准备认证凭证
获取集群KubeConfig并通过kubectl工具连接集群。
推荐使用最小权限的KubeConfig。
从KubeConfig提取证书,Prometheus需要使用证书来与API Server建立安全的TLS连接。
# 1. 提取CA证书 (用于验证API Server) kubectl config view --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 -d > ca.crt # 2. 提取客户端证书 (用于向API Server表明身份) kubectl config view --raw -o jsonpath='{.users[0].user.client-certificate-data}' | base64 -d > client.crt # 3. 提取客户端私钥 kubectl config view --raw -o jsonpath='{.users[0].user.client-key-data}' | base64 -d > client.key创建Secret,存储证书及私钥。
kubectl create secret generic demo-metrics-tls \ --namespace monitoring \ --from-file=ca.crt=./ca.crt \ --from-file=tls.crt=./client.crt \ --from-file=tls.key=./client.key
步骤三:创建监控资源
在集群信息页面单击基本信息页签,然后找到API server 内网端点。获取Metrics访问地址
https://<YOUR_SLB_IP>:6443。为API Server创建Service,以便Prometheus对其进行服务发现和指标采集。
将以下
<YOUR_SLB_IP>替换为上一步获取的 API Server 内网端点 IP地址,将以下YAML内容保存为ack-metrics-monitoring.yaml文件。# 创建一个Endpoints,手动指向外部API Server的内网IP和端口 apiVersion: v1 kind: Endpoints metadata: name: demo-metrics-service # 此名称必须与下面的Service名称完全一致,以便关联 namespace: monitoring subsets: - addresses: - ip: <YOUR_SLB_IP> # 替换为实际API server内网端点IP ports: - port: 6443 name: https-metrics protocol: TCP --- # 创建一个Headless Service,使其与上面的Endpoints绑定,为ServiceMonitor提供一个稳定的服务发现目标 apiVersion: v1 kind: Service metadata: name: demo-metrics-service namespace: monitoring labels: app: demo-metrics # 此标签必须与下面的ServiceMonitor的selector匹配 spec: clusterIP: None # 定义一个Headless Service,它不会分配虚拟IP,而是直接解析到Endpoints中的IP ports: - name: https-metrics port: 6443 targetPort: 6443 protocol: TCP --- # 定义一个Prometheus采集任务 apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: demo-control-plane-metrics namespace: monitoring # 此标签应与自建Prometheus的serviceMonitorSelector匹配,以便被自动发现 labels: app: prometheus-operator spec: endpoints: - interval: 30s params: hosting: - 'true' path: /metrics port: https-metrics scheme: https # 引用步骤二中Secret tlsConfig: ca: secret: key: ca.crt name: demo-metrics-tls cert: secret: key: tls.crt name: demo-metrics-tls insecureSkipVerify: false keySecret: key: tls.key name: demo-metrics-tls selector: matchLabels: app: demo-metrics namespaceSelector: matchNames: - monitoring应用YAML文件以创建资源。
kubectl apply -f ack-metrics-monitoring.yaml
验证采集状态
检查资源是否创建成功。
# 检查Service,Endpoints,Secret kubectl get service,endpoints,secret -n monitoring | grep demo-metrics # 检查ServiceMonitor kubectl get servicemonitor -n monitoring将自建Prometheus服务映射到本地。
kubectl port-forward svc/ack-prometheus-operator-prometheus 9090 -n monitoring在浏览器打开http://localhost:9090,访问Prometheus UI。
导航到页面,找到
serviceMonitor/monitoring/demo-control-plane-metrics相关的采集指标,如果State列状态为UP,则表示指标已成功采集。