通过自建Prometheus采集控制面组件指标

对于使用自建Prometheus监控系统的混合云环境,为统一纳管ACK One注册集群的控制面健康状态,可安装Metrics Aggregator组件并配置ServiceMonitor,从而将核心组件指标集成到现有监控体系,实现统一告警与观测。

工作原理

在 ACK One注册集群中,控制面组件(如kube-schedulercloud-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大盘,也支持为监控任务创建报警,通过邮件、短信、钉钉等渠道实时接收报警。
image

适用范围

  • ACK One注册集群的ack-stub组件版本需为v1.15.0.4及以上

步骤一:安装Metrics Aggregator组件

安装Metrics Aggregator组件以启用控制面组件的指标聚合功能。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  3. 组件管理页面,搜索Metrics Aggregator,在组件卡片中单击安装,按提示完成安装操作。

步骤二:准备认证凭证

  1. 获取集群KubeConfig并通过kubectl工具连接集群

    推荐使用最小权限的KubeConfig。
  2. 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
  3. 创建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

步骤三:创建监控资源

  1. 集群信息页面单击基本信息页签,然后找到API server 内网端点。获取Metrics访问地址https://<YOUR_SLB_IP>:6443

  2. 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          # 此标签必须与下面的ServiceMonitorselector匹配
    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
      # 此标签应与自建PrometheusserviceMonitorSelector匹配,以便被自动发现
      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
  3. 应用YAML文件以创建资源。

    kubectl apply -f ack-metrics-monitoring.yaml

验证采集状态

  1. 检查资源是否创建成功。

    # 检查Service,Endpoints,Secret
    kubectl get service,endpoints,secret -n monitoring | grep demo-metrics
    # 检查ServiceMonitor
    kubectl get servicemonitor -n monitoring
  2. 将自建Prometheus服务映射到本地。

    kubectl port-forward svc/ack-prometheus-operator-prometheus 9090 -n monitoring
  3. 在浏览器打开http://localhost:9090,访问Prometheus UI。

  4. 导航到Status > Targets页面,找到serviceMonitor/monitoring/demo-control-plane-metrics相关的采集指标,如果State列状态为UP,则表示指标已成功采集。