Kubernetes 系統元件的度量
系統元件指標可以更好地瞭解它們的內部情況。指標對於構建儀表盤和告警特別有用。
Kubernetes 元件以 Prometheus 格式 傳送指標。這種格式是結構化的純文字,設計目的是為了讓人和機器都能閱讀。
Kubernetes 中的指標
在大多數情況下,指標可以透過 HTTP 伺服器的 /metrics
端點獲取。對於預設不暴露端點的元件,可以使用 --bind-address
標誌啟用它。
這些元件的示例
在生產環境中,你可能需要配置 Prometheus Server 或其他指標收集器,以定期收集這些指標,並將其儲存在某種時間序列資料庫中。
請注意,kubelet 還在 /metrics/cadvisor
、/metrics/resource
和 /metrics/probes
端點暴露指標。這些指標的生命週期不同。
如果你的叢集使用 RBAC,讀取指標需要透過使用者、組或 ServiceAccount 的授權,該使用者、組或 ServiceAccount 具有允許訪問 /metrics
的 ClusterRole。例如:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- nonResourceURLs:
- "/metrics"
verbs:
- get
指標生命週期
Alpha 指標 → 穩定指標 → 棄用指標 → 隱藏指標 → 刪除指標
Alpha 指標沒有穩定性保證。這些指標可能隨時修改或刪除。
穩定指標保證不會改變。這意味著:
- 沒有棄用簽名的穩定指標不會被刪除或重新命名
- 穩定指標的型別不會被修改
棄用指標計劃刪除,但仍可使用。這些指標包含關於它們何時被棄用的版本資訊。
例如
棄用前
# HELP some_counter this counts things # TYPE some_counter counter some_counter 0
棄用後
# HELP some_counter (Deprecated since 1.15.0) this counts things # TYPE some_counter counter some_counter 0
隱藏指標不再發布用於抓取,但仍可使用。要使用隱藏指標,請參閱顯示隱藏指標部分。
刪除指標不再發布且無法使用。
顯示隱藏指標
如上所述,管理員可以透過在特定二進位制檔案上使用命令列標誌來啟用隱藏指標。這旨在用作管理員的應急措施,以防他們錯過了上次釋出中棄用指標的遷移。
標誌 show-hidden-metrics-for-version
接受一個版本,你希望顯示該版本中棄用的指標。版本以 x.y 形式表示,其中 x 是主版本,y 是次版本。即使指標可能在補丁釋出中被棄用,也不需要補丁版本,因為指標棄用策略是針對次要版本執行的。
該標誌只能將上一個次要版本作為其值。如果管理員將上一個版本設定為 show-hidden-metrics-for-version
,則所有以前隱藏的指標都將發出。不允許使用過舊的版本,因為這違反了指標棄用策略。
以指標 A
為例,假設 A
在 1.n 中被棄用。根據指標棄用策略,我們可以得出以下結論:
- 在版本
1.n
中,該指標已被棄用,並且可以預設發出。 - 在版本
1.n+1
中,該指標預設隱藏,可以透過命令列show-hidden-metrics-for-version=1.n
發出。 - 在版本
1.n+2
中,該指標應從程式碼庫中刪除。不再有應急措施。
如果你從版本 1.12
升級到 1.13
,但仍依賴於在 1.12
中棄用的指標 A
,則應透過命令列設定隱藏指標:--show-hidden-metrics=1.12
,並記住在升級到 1.14
之前刪除此指標依賴項。
元件指標
kube-controller-manager 指標
控制器管理器指標提供了關於控制器管理器效能和健康狀況的重要資訊。這些指標包括常見的 Go 語言執行時指標(如 go_routine 計數)和控制器特定指標(如 etcd 請求延遲或 Cloudprovider(AWS、GCE、OpenStack)API 延遲),可用於衡量叢集的健康狀況。
從 Kubernetes 1.7 開始,GCE、AWS、Vsphere 和 OpenStack 的儲存操作提供了詳細的 Cloudprovider 指標。這些指標可用於監控持久卷操作的健康狀況。
例如,對於 GCE,這些指標被稱為:
cloudprovider_gce_api_request_duration_seconds { request = "instance_list"}
cloudprovider_gce_api_request_duration_seconds { request = "disk_insert"}
cloudprovider_gce_api_request_duration_seconds { request = "disk_delete"}
cloudprovider_gce_api_request_duration_seconds { request = "attach_disk"}
cloudprovider_gce_api_request_duration_seconds { request = "detach_disk"}
cloudprovider_gce_api_request_duration_seconds { request = "list_disk"}
kube-scheduler 指標
Kubernetes v1.21 [beta]
排程器公開可選指標,報告所有正在執行的 Pod 的請求資源和所需限制。這些指標可用於構建容量規劃儀表板,評估當前或歷史排程限制,快速識別由於資源不足而無法排程的負載,以及將實際使用情況與 Pod 請求進行比較。
kube-scheduler 標識為每個 Pod 配置的資源請求和限制;當請求或限制不為零時,kube-scheduler 報告一個指標時間序列。時間序列的標籤包括:
- 名稱空間
- Pod 名稱
- Pod 排程到的節點,如果尚未排程則為空字串
- 優先順序
- 為該 Pod 分配的排程器
- 資源名稱(例如,
cpu
) - 如果已知資源的單位(例如,
cores
)
一旦 Pod 完成(restartPolicy
為 Never
或 OnFailure
且處於 Succeeded
或 Failed
Pod 階段,或者已被刪除且所有容器都處於終止狀態),該序列將不再報告,因為排程器現在可以自由排程其他 Pod 執行。這兩個指標被稱為 kube_pod_resource_request
和 kube_pod_resource_limit
。
這些指標在 HTTP 端點 /metrics/resources
上公開。它們需要對 /metrics/resources
端點進行授權,通常透過具有 get
動詞的 ClusterRole 授予對 /metrics/resources
非資源 URL 的訪問許可權。
在 Kubernetes 1.21 中,你必須使用 --show-hidden-metrics-for-version=1.20
標誌才能公開這些 Alpha 穩定性的指標。
kubelet 壓力停頓資訊 (PSI) 指標
Kubernetes v1.34 [beta]
作為一項 Beta 功能,Kubernetes 允許你配置 kubelet 來收集 CPU、記憶體和 I/O 使用情況的 Linux 核心壓力停頓資訊 (PSI)。資訊在節點、Pod 和容器級別收集。這些指標在 /metrics/cadvisor
端點上公開,名稱如下:
container_pressure_cpu_stalled_seconds_total
container_pressure_cpu_waiting_seconds_total
container_pressure_memory_stalled_seconds_total
container_pressure_memory_waiting_seconds_total
container_pressure_io_stalled_seconds_total
container_pressure_io_waiting_seconds_total
此功能透過設定 KubeletPSI
功能門預設啟用。這些資訊也暴露在彙總 API 中。
你可以在理解 PSI 指標中瞭解如何解釋 PSI 指標。
要求
壓力停頓資訊需要:
停用指標
你可以透過命令列標誌 --disabled-metrics
顯式關閉指標。如果一個指標導致效能問題,這可能是需要做的。輸入是一個被停用指標的列表(即 --disabled-metrics=metric1,metric2
)。
指標基數強制
具有無界維度的指標可能會導致它們所檢測的元件出現記憶體問題。為了限制資源使用,你可以使用 --allow-metric-labels
命令列選項動態配置指標的標籤值的允許列表。
在 Alpha 階段,該標誌只能接受一系列對映作為指標標籤允許列表。每個對映的格式為 <metric_name>,<label_name>=<allowed_labels>
,其中 <allowed_labels>
是可接受標籤名稱的逗號分隔列表。
整體格式如下:
--allow-metric-labels <metric_name>,<label_name>='<allow_value1>, <allow_value2>...', <metric_name2>,<label_name>='<allow_value1>, <allow_value2>...', ...
這是一個例子:
--allow-metric-labels number_count_metric,odd_number='1,3,5', number_count_metric,even_number='2,4,6', date_gauge_metric,weekend='Saturday,Sunday'
除了從 CLI 指定之外,這也可以在配置檔案中完成。你可以使用元件的 --allow-metric-labels-manifest
命令列引數指定該配置檔案的路徑。以下是該配置檔案內容的示例:
"metric1,label2": "v1,v2,v3"
"metric2,label1": "v1,v2,v3"
此外,cardinality_enforcement_unexpected_categorizations_total
元指標記錄了基數強制期間意外分類的計數,即每當遇到與允許列表約束不符的標籤值時。
下一步
- 閱讀有關指標的 Prometheus 文字格式
- 檢視 穩定 Kubernetes 指標列表
- 閱讀 Kubernetes 棄用策略