對 AKS 叢集中的記憶體飽和度進行疑難排解
本文討論針對記憶體飽和問題進行疑難解答的方法。 如果至少一個應用程式或進程需要比容器主機所能提供的記憶體還多,或主機耗盡其可用的記憶體,就會發生記憶體飽和。
必要條件
徵兆
下表概述記憶體飽和的常見徵兆。
徵兆 |
描述 |
無法設定的 Pod |
如果節點接近其設定的記憶體限制,就無法排程其他 Pod。 |
Pod 收回 |
如果節點記憶體不足,kubelet 就可以收回 Pod。 雖然控制平面嘗試在具有資源的其他節點上重新排程收回的Pod,但不保證其他節點有足夠的記憶體可執行這些Pod。 |
節點尚未就緒 |
記憶體飽和可能會導致 kubelet 和 containerd 變得沒有回應,最終導致節點整備問題。 |
記憶體不足(OOM) 終止 |
如果 Pod 收回無法防止節點問題,就會發生 OOM 問題。 |
疑難排解檢查清單
若要降低記憶體飽和度,請使用有效的監視工具並套用最佳做法。
步驟 1:識別記憶體飽和的節點
使用下列其中一種方法來識別記憶體飽和的節點:
Container Insights 是 AKS 中監視容器工作負載效能的功能。 如需詳細資訊,請參閱 啟用 Azure Kubernetes Service (AKS) 叢集的容器深入解析。
在 Azure 入口網站 上,搜尋並選取 [Kubernetes 服務]。
在 Kubernetes 服務清單中,選取叢集的名稱。
在叢集的瀏覽窗格中,尋找 [ 監視] 標題,然後選取 [ 深入解析]。
設定適當的 時間範圍 值。
選取 [ 節點] 索引標籤 。
在 [計量] 列表中,選取 [記憶體工作集] (從 Allocatable 計算)。
在百分位數選取器中,將範例設定為 Max,然後選取 [最大 %] 數據行卷標兩次。 此動作會將數據表節點依所用記憶體的百分比上限,從最高到最低排序。
因為第一個節點的記憶體使用量最高,請選取該節點來調查節點上執行的 Pod 記憶體使用量。
注意
Pod 的 CPU 或記憶體使用量百分比是以針對容器指定的 CPU 要求為基礎。 它不代表節點的CPU或記憶體使用量百分比。 因此,請查看實際的CPU或記憶體使用量,而不是Pod的CPU或記憶體使用量百分比。
此程式會在控制台中使用 kubectl 命令。 它只會顯示節點的目前狀態。
執行 kubectl top node 命令,以 取得節點 的記憶體使用量:
kubectl top node
這個指令輸出類似下列文字:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
aks-agentpool-30486455-vmss000003 239m 12% 3148Mi 69%
aks-agentpool-30486455-vmss000005 326m 17% 2143Mi 46%
aks-testmemory-30616462-vmss000000 66m 3% 1532Mi 28%
aks-testmemory-30616462-vmss000001 90m 4% 1689Mi 31%
aks-testmemory-30616462-vmss000002 74m 3% 1715Mi 31%
執行 kubectl get Pod 和 kubectl top pods 命令,以取得節點上執行的 Pod 及其記憶體使用量清單:
kubectl get pods --all-namespaces --output wide \
| grep <node-name> \
| awk '{print $1" "$2}' \
| xargs -n2 kubectl top pods --namespace \
| awk 'NR==1 || NR%2==0' \
| sort -k3n \
| column -t
注意
在此代碼段中,將 node-name> 取代<為實際的節點名稱。
代碼段的輸出類似下列文字:
NAME CPU(cores) MEMORY(bytes)
coredns-autoscaler-5655d66f64-9fp2k 1m 7Mi
shippingservice-7946db7679-qzplg 6m 15Mi
azure-ip-masq-agent-tb8xv 1m 16Mi
cloud-node-manager-wggqd 1m 16Mi
kube-proxy-c244z 1m 22Mi
coredns-59b6bf8b4f-5zg5s 3m 24Mi
coredns-59b6bf8b4f-5x62d 3m 25Mi
currencyservice-7977f668dc-rvbwm 12m 32Mi
csi-azurefile-node-9fcx8 2m 38Mi
metrics-server-5f8d84558d-frsq4 4m 42Mi
metrics-server-5f8d84558d-rc5nj 4m 43Mi
csi-azuredisk-node-9fh7h 2m 46Mi
adservice-795589cf6f-xs66r 4m 87Mi
ama-metrics-node-54sfj 16m 249Mi
ama-logs-rs-6db98d6dff-vj4xw 13m 259Mi
ama-logs-w5bmd 12m 403Mi
執行 kubectl 描述節點 命令,以檢閱節點上每個 Pod 的要求和限制:
kubectl describe node <node-name>
這個指令輸出類似下列文字:
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default adservice-795589cf6f-dgrx7 200m (10%) 300m (15%) 180Mi (3%) 300Mi (6%) 49m
default cartservice-6d994d9676-tcr6m 200m (10%) 300m (15%) 64Mi (1%) 128Mi (2%) 49m
default frontend-848d9f9dc9-x712b 100m (5%) 200m (10%) 64Mi (1%) 128Mi (2%) 49m
default loadgenerator-5c9656f8d6-7vmjr 300m (15%) 500m (26%) 256Mi (5%) 512Mi (11%) 38m
default redis-cart-799c85c644-vzpjl 70m (3%) 125m (6%) 200Mi (4%) 256Mi (5%) 49m
kube-system ama-logs-zs4qf 150m (7%) 1 (52%) 550Mi (12%) 1774Mi (38%) 16h
kube-system azure-ip-masq-agent-rqqpn 100m (5%) 500m (26%) 50Mi (1%) 250Mi (5%) 16h
kube-system cloud-node-manager-nbnrq 50m (2%) 0 (0%) 50Mi (1%) 512Mi (11%) 16h
kube-system coredns-59b6bf8b4f-m2prf 100m (5%) 3 (157%) 70Mi (1%) 500Mi (10%) 16h
kube-system csi-azuredisk-node-h445m 30m (1%) 0 (0%) 60Mi (1%) 400Mi (8%) 16h
kube-system csi-azurefile-node-489cp 30m (1%) 0 (0%) 60Mi (1%) 600Mi (13%) 16h
kube-system konnectivity-agent-665c7dfdb8-25p2f 20m (1%) 1 (52%) 20Mi (1%) 1Gi (22%) 15h
kube-system kube-proxy-v9gp4 100m (5%) 0 (0%) 0 (0%) 0 (0%) 16h
Allocated resources:
...
注意
節點的 CPU 或記憶體使用量百分比是以節點上的可配置資源為基礎,而不是實際的節點容量。
既然您已識別出使用高記憶體的 Pod,您可以識別在 Pod 上執行的應用程式。
步驟 2:檢閱避免記憶體飽和的最佳做法
請檢閱下表,瞭解如何實作避免記憶體飽和的最佳做法。
最佳做法 |
描述 |
使用記憶體 要求和限制 |
Kubernetes 提供選項來指定容器的最小記憶體大小(要求)和記憶體大小上限(限制)。 透過對 Pod 設定限制,可避免節點的記憶體壓力。 請確定所有正在執行的 Pod 彙總限制不會超過節點的可用記憶體。 這種情況稱為 過度認可。 Kubernetes 排程器會根據透過 服務品質 (QoS) 設定要求和限制來配置資源。 如果沒有適當限制,排程器可能會在單一節點上排程太多 Pod。 這最終可能導致節點關閉。 此外,當 kubelet 收回 Pod 時,會優先處理記憶體使用量超過其定義要求的 Pod。 建議您將記憶體要求設定為接近實際使用量。 |
啟用水準 Pod 自動調整程式 |
藉由調整叢集大小,您可以平衡多個 Pod 的要求,以防止記憶體飽和。 這項技術可以減少特定節點上的記憶體使用量。 |
使用 反親和性標籤 |
針對記憶體不受設計限制的場景,您可以使用節點選取器及親和性或反親和性標記,以便將工作負載隔離至特定節點。 藉由使用反親和性標記,即可防止其他工作負載在這些節點上排程 Pod。 這樣便能減少記憶體飽和度問題。 |
選擇 較高的 SKU VM |
具有較多隨機存取記憶體 (RAM) 的虛擬機器 (VM),更適合處理高記憶體使用量。 若要使用此選項,您必須建立新的節點集區、封鎖節點 (使其無法排程),並清空現有節點集區。 |
隔離 系統和使用者工作負載 |
建議您在使用者節點集區上執行您的應用程式。 此設定確保您可將 Kubernetes 特定 Pod 隔離至系統節點集區,並維護叢集效能。 |
協力廠商資訊免責聲明
本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。
協力廠商連絡資訊免責聲明
Microsoft 提供協力廠商連絡資訊,以協助您尋找有關此主題的其他資訊。 此連絡資訊可能會變更而不另行通知。 Microsoft 不保證協力廠商連絡資訊的準確性。
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。