本文討論針對記憶體飽和問題進行疑難解答的方法。 如果至少一個應用程式或進程需要比容器主機所能提供的記憶體還多,或主機耗盡其可用的記憶體,就會發生記憶體飽和。
必要條件
- Kubernetes kubectl 命令行工具。 若要使用 Azure CLI 安裝 kubectl,請執行 az aks install-cli 命令。
- 用於進階進程層級記憶體分析的開放原始碼專案 Inspektor 小工具 。 如需詳細資訊,請參閱 如何在 AKS 叢集中安裝 Inspektor 小工具。
徵兆
下表概述記憶體飽和的常見徵兆。
| 徵兆 | 描述 |
|---|---|
| 無法設定的 Pod | 如果節點接近其設定的記憶體限制,則無法排程更多 Pod。 |
| Pod 收回 | 如果節點記憶體不足,kubelet 就可以收回 Pod。 雖然控制平面嘗試在具有資源的其他節點上重新排程收回的Pod,但不保證其他節點有足夠的記憶體可執行這些Pod。 |
| 節點尚未就緒 | 記憶體飽和可能會導致 kubelet 和 containerd 變得沒有回應,最終導致節點整備問題。 |
| 記憶體不足(OOM) 終止 | 如果 Pod 收回無法防止節點問題,就會發生 OOM 問題。 如需詳細資訊,請參閱 針對 AKS 叢集中的 OOMkilled 進行疑難排解。 |
疑難排解檢查清單
若要降低記憶體飽和度,請使用有效的監視工具並套用最佳做法。
步驟 1:識別記憶體飽和的節點
使用下列其中一種方法來識別記憶體飽和的節點:
在網頁瀏覽器中,使用 Azure 入口網站 中 AKS 的 Container Insights 功能。
在控制台中,使用 Kubernetes 命令行工具 (kubectl)。
Container Insights 是 AKS 中監視容器工作負載效能的功能。 如需詳細資訊,請參閱 啟用 Azure Kubernetes Service (AKS) 叢集的容器深入解析。
在 Azure 入口網站中,搜尋並選取 Kubernetes 服務。
在 Kubernetes 服務清單中,選取叢集的名稱。
在叢集的瀏覽窗格中,尋找 [ 監視] 標題,然後選取 [ 深入解析]。
設定適當的 時間範圍 值。
選取 [ 節點] 索引標籤 。
在 [計量] 列表中,選取 [記憶體工作集] (從 Allocatable 計算)。
在百分位數選取器中,將範例設定為 Max,然後選取 [最大 %] 數據行卷標兩次。 此動作會將數據表節點依所用記憶體的百分比上限,從最高到最低排序。
因為第一個節點的記憶體使用量最高,請選取該節點來調查節點上執行的 Pod 記憶體使用量。
注意
Pod 的 CPU 或記憶體使用量百分比是以針對容器指定的 CPU 要求為基礎。 它不代表節點的CPU或記憶體使用量百分比。 因此,請查看實際的CPU或記憶體使用量,而不是Pod的CPU或記憶體使用量百分比。
現在您已經識別了使用高記憶體的 Pod,您可以識別在 Pod 上執行的應用程式,或識別可能耗用過多記憶體的處理程序。
步驟 2:識別進程層級記憶體使用量
如需進階進程層級記憶體分析,請使用 Inspektor 小工具 來監視 Pod 內進程層級的即時記憶體使用量:
使用檔中找到的指示安裝 Inspektor 小工具
執行 top_process小工具 ,以識別使用大量記憶體的進程。 您可以使用
--fields來選取特定欄位,並根據--filter特定欄位值篩選事件,例如先前識別出具有高記憶體耗用量的 Pod 名稱。 您也可以:識別叢集中前 10 個耗用記憶體的進程:
kubectl gadget run top_process --sort -memoryRelative --max-entries 10識別特定節點上最耗用記憶體的進程:
kubectl gadget run top_process --sort -memoryRelative --filter k8s.node==<node-name>識別特定命名空間中最耗用記憶體的進程:
kubectl gadget run top_process --sort -memoryRelative --filter k8s.namespace==<namespace>識別特定 Pod 中最耗用記憶體的進程:
kubectl gadget run top_process --sort -memoryRelative --filter k8s.podName==<pod-name>
Inspektor Gadget
top_process命令的輸出類似於以下輸出:K8S.NODE K8S.NAMESPACE K8S.PODNAME PID COMM MEMORYVIRTUAL MEMORYRSS MEMORYRELATIVE aks-agentpool-3…901-vmss000001 default memory-stress 21676 stress 944 MB 943 MB 5.6 aks-agentpool-3…901-vmss000001 default memory-stress 21678 stress 944 MB 943 MB 5.6 aks-agentpool-3…901-vmss000001 default memory-stress 21677 stress 944 MB 872 MB 5.2 aks-agentpool-3…901-vmss000001 default memory-stress 21679 stress 944 MB 796 MB 4.8
您可以使用此輸出來識別節點上耗用最多記憶體的進程。 輸出可以包括節點名稱、命名空間、Pod 名稱、容器名稱、進程 ID (PID)、命令名稱 (COMM)、CPU 和記憶體使用量。 如需詳細資訊,請參閱 文件。
步驟 3:檢閱避免記憶體飽和的最佳做法
請檢閱下表,瞭解如何實作避免記憶體飽和的最佳做法。
| 最佳做法 | 描述 |
|---|---|
| 使用記憶體 要求和限制 | Kubernetes 提供選項來指定容器的最小記憶體大小(要求)和記憶體大小上限(限制)。 透過對 Pod 設定限制,可避免節點的記憶體壓力。 請確定所有正在執行的 Pod 彙總限制不會超過節點的可用記憶體。 這種情況稱為 過度認可。 Kubernetes 排程器會根據透過 服務品質 (QoS) 設定要求和限制來配置資源。 如果沒有適當限制,排程器可能會在單一節點上排程太多 Pod。 這種情況最終可能會關閉節點。 此外,當 kubelet 收回 Pod 時,會優先處理記憶體使用量超過其定義要求的 Pod。 建議您將記憶體要求設定為接近實際使用量。 |
| 啟用水準 Pod 自動調整程式 | 藉由調整叢集大小,您可以平衡多個 Pod 的要求,以防止記憶體飽和。 這項技術可以減少特定節點上的記憶體使用量。 |
| 使用 反親和性標籤 | 針對記憶體不受設計限制的場景,您可以使用節點選取器及親和性或反親和性標記,以便將工作負載隔離至特定節點。 透過使用反親和性標籤,您可以防止其他工作負載在這些節點上排程 Pod,並減少記憶體飽和問題。 |
| 選擇 較高的 SKU VM | 具有更多隨機存取記憶體 (RAM) 的 VM 更適合處理高記憶體使用量。 若要使用此選項,您必須建立新的節點集區、封鎖節點 (使其無法排程),並清空現有節點集區。 |
| 隔離 系統和使用者工作負載 | 建議您在使用者節點集區上執行您的應用程式。 此設定確保您可將 Kubernetes 特定 Pod 隔離至系統節點集區,並維護叢集效能。 |
其他相關資訊
協力廠商資訊免責聲明
本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。
協力廠商連絡資訊免責聲明
Microsoft 提供協力廠商連絡資訊,以協助您尋找有關此主題的其他資訊。 此連絡資訊可能會變更而不另行通知。 Microsoft 不保證協力廠商連絡資訊的準確性。
與我們連絡,以取得說明
如果您有疑問,可以詢問 Azure 社群支援。 您也可以向 Azure 意見反應社群提交產品意見反應。