本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes v1.22 的新功能:使用交換記憶體的 alpha 支援

1.22 版本引入了對按節點配置 Kubernetes 工作負載交換記憶體使用的 Alpha 支援。

在之前的版本中,Kubernetes 不支援在 Linux 上使用交換記憶體,因為當涉及交換時,很難提供保障並對 Pod 記憶體使用情況進行核算。作為 Kubernetes 早期設計的一部分,交換支援被認為超出範圍,如果節點上檢測到交換,kubelet 預設會啟動失敗。

然而,有許多用例將受益於 Kubernetes 節點支援交換,包括提高節點穩定性、更好地支援具有高記憶體開銷但工作集較小的應用程式、使用記憶體受限裝置以及記憶體靈活性。

因此,在過去兩個版本中,SIG Node 一直致力於收集適當的用例和反饋,並提出一種以受控、可預測的方式向節點新增交換支援的設計,以便 Kubernetes 使用者可以執行測試並提供資料以繼續在交換之上構建叢集功能。節點交換記憶體支援的 Alpha 畢業是我們實現此目標的第一個里程碑!

它是如何工作的?

可以設想在節點上使用交換的多種可能方式。為了使初始實現的範圍易於管理,當節點上已配置並可用交換時,我們建議 kubelet 應能夠配置為:

  • 它可以在交換開啟的情況下啟動。
  • 預設情況下,它將指示容器執行時介面(Container Runtime Interface)為 Kubernetes 工作負載分配零交換記憶體。
  • 您可以配置 kubelet 以指定整個節點的交換使用。

節點上的交換配置透過 KubeletConfiguration 中的 memorySwap 暴露給叢集管理員。作為叢集管理員,您可以透過設定 memorySwap.swapBehavior 來指定節點在存在交換記憶體時的行為。

這可以透過向容器執行時介面 (CRI) 新增 memory_swap_limit_in_bytes 欄位來實現。kubelet 的配置將控制 kubelet 透過 CRI 指示容器執行時為每個容器分配多少交換記憶體。然後容器執行時會將交換設定寫入容器級別的 cgroup。

我該如何使用它?

在已配置交換記憶體的節點上,可以透過在 kubelet 上啟用 NodeSwap 功能門,並停用 failSwapOn 配置設定--fail-swap-on 命令列標誌來啟用 Kubernetes 在節點上使用交換。

您還可以選擇配置 memorySwap.swapBehavior 以指定節點將如何使用交換記憶體。例如,

memorySwap:
  swapBehavior: LimitedSwap

swapBehavior 的可用配置選項是

  • LimitedSwap(預設):Kubernetes 工作負載的交換使用受到限制。未由 Kubernetes 管理的節點上的工作負載仍可使用交換。
  • UnlimitedSwap:Kubernetes 工作負載可以使用其請求的任意數量的交換記憶體,直至系統限制。

如果未指定 memorySwap 的配置且已啟用功能門,則 kubelet 預設將應用與 LimitedSwap 設定相同的行為。

LimitedSwap 設定的行為取決於節點是使用 v1 還是 v2 的控制組(也稱為“cgroups”)執行

  • cgroups v1:如果設定了 Pod 的記憶體限制,Kubernetes 工作負載可以使用任意組合的記憶體和交換,直至 Pod 的記憶體限制。
  • cgroups v2:Kubernetes 工作負載不能使用交換記憶體。

注意事項

系統上存在交換會降低可預測性。交換的效能比常規記憶體差,有時甚至差幾個數量級,這可能導致意外的效能迴歸。此外,交換會改變系統在記憶體壓力下的行為,應用程式無法直接控制其記憶體使用的哪些部分被交換出去。由於啟用交換允許 Kubernetes 中工作負載使用更多記憶體,而這些記憶體無法可預測地核算,因此它也增加了出現“嘈雜鄰居”和意外打包配置的風險,因為排程器無法核算交換記憶體使用情況。

啟用交換記憶體的節點效能取決於底層物理儲存。當使用交換記憶體時,在每秒 I/O 操作 (IOPS) 受限的環境中,例如具有 I/O 節流的雲虛擬機器,效能將顯著低於固態硬碟或 NVMe 等更快的儲存介質。

因此,我們不建議在某些效能受限的工作負載或環境中啟用交換。叢集管理員和開發人員應在生產場景中使用交換之前對其節點和應用程式進行基準測試,而這方面需要您的幫助

展望未來

Kubernetes 1.22 版本引入了對節點交換記憶體的 Alpha 支援,我們將繼續努力在 1.23 版本中實現 Beta 畢業。這將包括

  • 新增透過 cgroups 在 Pod 級別控制交換消耗的支援。
    • 這將包括設定 kubelet 在主機上檢測到的系統保留交換量的能力。
  • 確定一組用於節點 QoS 的指標,以評估啟用和未啟用交換的節點的效能和穩定性。
  • 收集測試用例的反饋。
    • 我們將考慮引入新的交換配置模式,例如工作負載的節點範圍交換限制。

我如何瞭解更多資訊?

您可以檢視 Kubernetes 網站上當前的文件

有關更多資訊,以及協助測試和提供反饋,請參閱 KEP-2400 及其設計提案

我如何參與?

我們始終歡迎您的反饋!SIG Node 定期舉行會議,並且可以透過 Slack(頻道 #sig-node)或 SIG 的郵件列表聯絡。如果您想提供幫助,請隨時聯絡我,Elana Hashman(Slack 和 GitHub 上的 @ehashman)。