全部產品
Search
文件中心

Container Service for Kubernetes:通過自建Prometheus採集控制面組件指標

更新時間:Oct 31, 2025

對於使用自建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大盤,也支援為監控任務建立警示,通過郵件、簡訊、DingTalk等渠道即時接收警示。

適用範圍

  • ACK One註冊叢集的ack-stub組件版本需為v1.15.0.4及以上

步驟一:安裝Metrics Aggregator組件

安裝Metrics Aggregator組件以啟用控制面組件的指標彙總功能。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  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          # 此標籤必須與下面的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
  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,則表示指標已成功採集。