對於使用自建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大盤,也支援為監控任務建立警示,通過郵件、簡訊、DingTalk等渠道即時接收警示。
適用範圍
ACK One註冊叢集的ack-stub組件版本需為v1.15.0.4及以上。
步驟一:安裝Metrics Aggregator組件
安裝Metrics Aggregator組件以啟用控制面組件的指標彙總功能。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在組件管理頁面,搜尋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,則表示指標已成功採集。