ACK叢集預設相容阿里雲Prometheus監控和開源Prometheus監控。當Prometheus預設指標無法滿足您的業務需求時,您可以使用自訂PromQL來建立警示規則,監控叢集節點、宿主機、容器副本、工作負載等資源的健康情況。警示規則可以在給定的資料指標達到關注閾值或條件滿足時觸發警示,並給您發送通知。
前提條件
已在ACK叢集中啟用Prometheus監控。具體操作,請參見阿里雲Prometheus監控(推薦)、開源Prometheus監控。
通過自訂PromQL配置Prometheus警示規則
ACK叢集預設相容阿里雲Prometheus監控和開源Prometheus監控。您可以基於Prometheus監控自訂PromQL配置警示規則,當警示規則設定的條件滿足後,系統會產生對應的警示事件發送通知。
阿里雲Prometheus監控
在阿里雲Prometheus監控自訂PromQL配置警示規則的具體操作,請參見Prometheus警示規則。
開源Prometheus監控
配置警示通知策略。
開源Prometheus監控支援Webhook地址、DingTalk機器人、Email等警示通知方式。您可以通過配置ack-prometheus-operator應用中
receiver
參數來設定Prometheus警示通知方式。具體操作,請參見警示配置。建立警示規則。
在叢集中部署PrometheusRule CRD,定義警示規則。更多資訊,請參見Deploying Prometheus Rules。
apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: labels: # labels與Prometheus CRD中match ruleSelector -> matchLabels保持一致。 prometheus: example role: alert-rules name: prometheus-example-rules spec: groups: - name: example.rules rules: - alert: ExampleAlert # expr為PromQL對資料的查詢和觸發條件,此處可參考本文警示規則說明列表中PromQL配置列。 expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 90
查看警示規則是否生效。
執行以下命令,將叢集中的Prometheus映射到本地9090連接埠。
kubectl port-forward svc/ack-prometheus-operator-prometheus 9090:9090 -n monitoring
在瀏覽器輸入localhost:9090,查看Prometheus Server控制台。
在開源Prometheus頁面頂部,選擇
。在Rules頁面查看警示規則,如果已顯示目標警示規則,表明該警示規則已生效。
警示規則說明
ACK從叢集穩定性、叢集節點異常、叢集節點水位、應用程式容器副本異常、工作負載異常、儲存異常、網路異常等多個方面,通過叢集、應用的營運經驗沉澱,總結梳理出以下Prometheus重要警示規則配置。
警示規則包含容器副本異常、工作負載異常等內容,分為以下層級。
Critical:造成叢集、應用、甚至業務影響,需要立即處理。
Warning:造成叢集、應用、甚至業務影響,需要儘快排查。
Normal:涉及重要功能變更。
規則說明中的操作入口指警示配置頁面的警示規則管理頁簽。您可以登入Container Service管理主控台,在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇在警示配置頁面,單擊警示規則管理頁簽,進行對應警示規則的更新。 。
容器副本異常
詳細描述 | 重要層級 | PromQL配置 | 規則說明 | 常見處理SOP流程 |
Pod狀態異常 | Critical | min_over_time(sum by (namespace, pod, phase) (kube_pod_status_phase{phase=~"Pending|Unknown|Failed"})[5m:1m]) > 0 | 最近5分鐘內,Pod的狀態有異常時,觸發警示。 在操作入口,單擊叢集容器副本異常警示規則集,設定Pod狀態異常警示規則。更多資訊,請參見Container Service警示管理。 | 關於Pod狀態異常的處理方法,請參見Pod異常問題排查。 |
Pod啟動失敗 | Critical | sum_over_time(increase(kube_pod_container_status_restarts_total{}[1m])[5m:1m]) > 3 | 最近5分鐘內,Pod啟動異常累計3次以上時,觸發警示。 在操作入口,單擊叢集容器副本異常警示規則集,設定Pod啟動失敗的警示規則。更多資訊,請參見Container Service警示管理。 | 關於Pod啟動失敗的處理方法,請參見Pod異常問題排查。 |
超1000個Pod調度失敗異常 | Critical | sum(sum(max_over_time(kube_pod_status_phase{ phase=~"Pending"}[5m])) by (pod)) > 1000 | 最近5分鐘內,累計有1000個Pod處於調度失敗Pending狀態時,觸發警示。 | 可能是大規模叢集調度情境下任務壓力過大引起的。ACK叢集Pro版增強了叢集調度等核心能力,並提供SLA保障。推薦您使用ACK叢集Pro版,請參見ACK叢集Pro版概述。 |
容器CPU限流頻繁 | Warning | rate(container_cpu_cfs_throttled_seconds_total[3m]) * 100 > 25 | 容器CPU被頻繁限流。最近3分鐘內,被限流的CPU時間片大於25%時,觸發警示。 | CPU時間片限流(CPU Throttling)會減少容器內進程獲得的CPU時間片,影響容器內進程運行時間長度,有可能導致容器進程的業務行為變慢。 針對這種情況,請評估Pod的CPU的資源Limit是否配置過小。推薦使用CPU Burst效能最佳化策略,最佳化CPU限流現象,請參見CPU Burst效能最佳化策略。如果您的叢集節點使用多核機型的伺服器,推薦使用CPU拓撲感知調度,以最大化地利用片段化CPU,請參見CPU拓撲感知調度。 |
容器副本Pod的CPU資源水位高於85% | Warning | sum(irate(container_cpu_usage_seconds_total{pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*",container!="",container!="POD"}[1m])) by (namespace,pod) / sum(container_spec_cpu_quota{pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*",container!="",container!="POD"}/100000) by (namespace,pod) * 100 <= 100 or on() vector(0) >= 85 | 在指定命名空間或Pod下,容器副本Pod的CPU資源水位超過Pod Limit的85%時,會觸發警示。 若此Pod未配置Limit,值為0。 85%的預設閾值為推薦的參考值,實際取值可以以您的業務情況為準。 如需篩選指定Pod、命名空間的資料,請替換 | 當Pod的CPU資源水位較高時,會造成CPU資源限流,導致CPU時間片分派不足,最終影響Pod中進程的執行。 針對這種情況,請評估Pod的CPU |
容器副本Pod的記憶體資源水位高於85% | Warning | (sum(container_memory_working_set_bytes{pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*",container !="",container!="POD"}) by (pod,namespace)/ sum(container_spec_memory_limit_bytes{pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*",container !="",container!="POD"}) by (pod, namespace) * 100) <= 100 or on() vector(0) >= 85 | 容器副本Pod的記憶體資源水位高於Pod Limit的85%時,觸發警示。 若未配置此Pod的Limit,值為0。 85%的預設閾值為推薦的參考值,實際取值可以以您的業務情況為準。 如需篩選指定Pod、命名空間的資料,請替換 | 當Pod的記憶體資源水位較高時,會造成Pod被OOMKilled,繼而導致Pod重啟。 針對這種情況,您需要確定Pod的記憶體 |
工作負載異常
詳細描述 | 重要層級 | PromQL配置 | 規則說明 | 常見處理SOP流程 |
Deployment可用副本狀態異常 | Critical | kube_deployment_spec_replicas{} != kube_deployment_status_replicas_available{} | Deployment可用副本數未達到預期時,觸發警示。 在操作入口,單擊叢集應用工作負載警示規則集,設定Deployment可用副本狀態異常警示規則。更多資訊,請參見Container Service警示管理。 | 確定是否有Deployment的Pod啟動失敗。 |
DaemonSet副本狀態異常 | Critical | ((100 - kube_daemonset_status_number_ready{} / kube_daemonset_status_desired_number_scheduled{} * 100) or (kube_daemonset_status_desired_number_scheduled{} - kube_daemonset_status_current_number_scheduled{})) > 0 | DaemonSet的可用副本數未達到預期時,觸發警示。 在操作入口,單擊叢集應用工作負載警示規則集,設定Deployment可用副本狀態異常警示規則。更多資訊,請參見Container Service警示管理。 | 確定是否有Deployment的Pod啟動失敗。 |
DaemonSet副本調度異常 | Critical | kube_daemonset_status_number_misscheduled{job} > 0 | DaemonSet的副本調度異常時,觸發警示。 在操作入口,單擊叢集應用工作負載警示規則集,設定Daemonset副本調度異常警示規則。更多資訊,請參見Container Service警示管理。 | 確定是否有Deployment的Pod啟動失敗。 |
Job運行失敗 | Critical | kube_job_status_failed{} > 0 | Job執行失敗時,觸發警示。 在操作入口,單擊叢集應用工作負載警示規則集,設定Job運行失敗警示規則。更多資訊,請參見Container Service警示管理。 | 在對應Job下的Pod的日誌中查看詳細失敗資訊。 |
儲存異常
詳細描述 | 重要層級 | PromQL配置 | 規則說明 | 常見處理SOP流程 |
PersistentVolume狀態異常 | Critical | kube_persistentvolume_status_phase{phase=~"Failed|Pending"} > 0 | 儲存卷PV狀態異常時,觸發警示。 在操作入口,單擊叢集儲存例外狀況事件警示規則集,設定PersistentVolume狀態異常警示規則。更多資訊,請參見Container Service警示管理。 | 關於PersistentVolume狀態異常的處理方法,請參見雲端硬碟儲存卷FAQ的雲端硬碟掛載內容。 |
節點磁碟空間不足10% | Critical | ((node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes) < 10 | 節點某磁碟塊裝置可用空間不足10%時,觸發警示。 在操作入口,單擊叢集資源異常警示規則集,設定叢集節點 - 磁碟使用率 >=85%警示規則。更多資訊,請參見Container Service警示管理。 | 建議擴容節點和節點磁碟。更多資訊,請參見雲端硬碟儲存卷FAQ的雲端硬碟掛載內容。 |
節點狀態異常
詳細描述 | 重要層級 | PromQL配置 | 規則說明 | 常見處理SOP流程 |
節點NotReady狀態持續3分鐘 | Critical | (sum(max_over_time(kube_node_status_condition{condition="Ready",status="true"}[3m]) <= 0) by (node)) or (absent(kube_node_status_condition{condition="Ready",status="true"})) > 0 | 叢集節點NotReady狀態持續3分鐘時,觸發警示。 在操作入口,單擊叢集節點異常警示規則集,設定叢集節點下線警示規則。更多資訊,請參見Container Service警示管理。 |
|
宿主機水位異常
宿主機資源指標和節點資源指標的區別如下:
此指標為宿主機資源的指標,是對節點所在的物理機或虛擬機器等宿主機資源的統計。
水位計算公式中,分子為宿主機上所有進程使用的資源(Usage),分母為宿主機的最大規格(Capacity)。
詳細描述 | 重要層級 | PromQL配置 | 規則說明 | 常見處理SOP流程 |
宿主機記憶體水位高於85% | Warning | (100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) >= 85 | 該叢集的宿主機記憶體水位高於85%時,觸發警示。 在操作入口,單擊叢集資源異常警示規則集,設定叢集節點 - 記憶體使用量率 >= 85%警示規則。更多資訊,請參見Container Service警示管理。 說明 ACK警示配置中規則由CloudMonitor提供,與此Prometheus規則的指標含義一致。 85%的預設閾值為推薦的參考值,實際取值可以以您的業務情況為準。 |
|
宿主機記憶體水位高於90% | Critical | (100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) >= 90 | 該叢集的宿主機記憶體水位高於90%。 |
|
宿主機CPU水位高於85% | Warning | 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) >= 85 | 該叢集的宿主機CPU水位高於85%時,觸發警示, 在操作入口,單擊叢集資源異常警示規則集,設定叢集節點 - CPU使用率 >= 85%警示規則。 說明 ACK警示配置中規則由CloudMonitorECS監控提供,與Prometheus此規則的指標含義一致。 85%的預設閾值為推薦的參考值,實際取值可以以您的業務情況為準。 更多資訊,請參見Container Service警示管理。 |
|
宿主機CPU水位高於90% | Critical | 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) >= 90 | 該叢集的宿主機CPU水位高於90%時,觸發警示。 |
|
節點資源異常
節點資源指標和宿主機資源指標的區別如下:
此指標為節點資源的指標,是對節點內的容器引擎層消耗和可分配資源的統計,即節點上容器已經消耗的資源(分子)與未被消耗的資源(分母)的比例。
以記憶體為例進行說明:
已消耗資源:一個節點使用的記憶體總資源,即該節點上所有運行容器的工作記憶體。工作記憶體包括容器已指派和已使用的記憶體、容器分配的Page Cache等。
未消耗資源:容器可分配的資源量,將排除宿主機的容器引擎層資源消耗,即ACK的節點預留資源。更多資訊,請參見節點資源預留策略。
水位計算公式中,分子為節點上所有容器的資源使用量(Usage,決定容器Pod調度的資源指標),分母為節點可為容器分配的資源量(Allocatable)。
詳細描述 | 重要層級 | PromQL配置 | 規則說明 | 常見處理SOP流程 |
節點CPU使用水位高於85% | Warning | sum(irate(container_cpu_usage_seconds_total{pod!=""}[1m])) by (node) / sum(kube_node_status_allocatable{resource="cpu"}) by (node) * 100 >= 85 | 該叢集節點的CPU水位高於85%時,觸發警示。 計算公式為
|
|
節點CPU資源分派率高於85% | Normal | (sum(sum(kube_pod_container_resource_requests{resource="cpu"}) by (pod, node) * on (pod) group_left max(kube_pod_status_ready) by (pod, node)) by (node)) / sum(kube_node_status_allocatable{resource="cpu"}) by (node) * 100 >= 85 | 該叢集節點的CPU已指派水位高於85%時,觸發警示。 計算公式為 |
|
節點CPU超賣率高於300% | Warning | (sum(sum(kube_pod_container_resource_limits{resource="cpu"}) by (pod, node) * on (pod) group_left max(kube_pod_status_ready) by (pod, node)) by (node)) / sum(kube_node_status_allocatable{resource="cpu"}) by (node) * 100 >= 300 | 該叢集節點的CPU超賣水位高於300%時,觸發警示。 計算公式為 300%的預設閾值為推薦的參考值,實際取值可以以您的業務情況為準。 |
|
節點記憶體使用量水位高於85% | Warning | sum(container_memory_working_set_bytes{pod!=""}) by (node) / sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 >= 85 | 該叢集節點的記憶體水位高於85%時,觸發警示。 計算公式為
|
|
節點記憶體資源分派率高於85% | Normal | (sum(sum(kube_pod_container_resource_requests{resource="memory"}) by (pod, node) * on (pod) group_left max(kube_pod_status_ready) by (pod, node)) by (node)) / sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 >= 85 | 該叢集節點的記憶體已指派水位高於85%時,觸發警示。 計算公式為 |
|
節點記憶體超賣率高於300% | Warning | (sum(sum(kube_pod_container_resource_limits{resource="memory"}) by (pod, node) * on (pod) group_left max(kube_pod_status_ready) by (pod, node)) by (node)) / sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 >= 300 | 該叢集節點的記憶體超賣水位高於300%時,觸發警示。 計算公式為 300%的預設閾值為推薦的參考值,實際取值可以以您的業務情況為準。 |
|
網路異常
詳細描述 | 重要層級 | PromQL配置 | 規則說明 | 常見處理SOP流程 |
叢集CoreDNS可用性異常-請求跌零 | Critical | (sum(rate(coredns_dns_request_count_total{}[1m]))by(server,zone)<=0) or (sum(rate(coredns_dns_requests_total{}[1m]))by(server,zone)<=0) | 僅ACK託管叢集(Pro版、基礎版)支援檢測該異常。 | 檢查叢集中CoreDNS Pod是否正常。 |
叢集CoreDNS可用性異常-panic異常 | Critical | sum(rate(coredns_panic_count_total{}[3m])) > 0 | 僅ACK託管叢集(Pro版、基礎版)支援檢測該異常。 | 檢查叢集中CoreDNS Pod是否正常。若CoreDNS行為不符合預期,請提交工單諮詢。 |
叢集IngressController認證即將到期 | Warning | ((nginx_ingress_controller_ssl_expire_time_seconds - time()) / 24 / 3600) < 14 | 您需要安裝部署ACK Ingress Controller組件,並開啟Ingress功能。 | 重新簽發Ingress Controller認證。 |
Auto Scaling異常
詳細描述 | 重要層級 | PromQL配置 | 規則說明 | 常見處理SOP流程 |
HPA當前副本數已達最大副本設定數 | Warning | max(kube_horizontalpodautoscaler_spec_max_replicas) by (namespace, horizontalpodautoscaler) - max(kube_horizontalpodautoscaler_status_current_replicas) by (namespace, horizontalpodautoscaler) <= 0 | 您需要在阿里雲Prometheus啟用 | 請檢查HPA策略是否符合預期。 |
相關文檔
關於如何通過控制台或API擷取Prometheus監控資料,請參見通過PromQL查詢Prometheus監控資料。
您可以通過ACK Net Exporter快速發現和定位容器網路問題,請參見使用ACK Net Exporter定位網路問題。
關於使用阿里雲Prometheus可能遇到的問題及對應解決方案,請參見可觀測性FAQ。