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

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

1.22 版本引入了 Alpha 支援,可針對每個節點為 Kubernetes 工作負載配置交換記憶體使用量。

在先前的版本中,Kubernetes 不支援在 Linux 上使用交換記憶體,因為當涉及交換時,很難提供保證和計算 Pod 記憶體使用率。作為 Kubernetes 早期設計的一部分,交換支援被認為超出範圍,如果節點上偵測到交換,kubelet 預設將無法啟動。

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

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

它是如何運作的?

關於節點上的交換使用,有許多可能的方式可以設想。為了使初始實作的範圍可管理,當交換已在節點上佈建和可用時,我們已提出 應該可以配置 kubelet,以便

  • 它可以啟動並啟用交換。
  • 它將指示容器執行階段介面預設為 Kubernetes 工作負載分配零交換記憶體。
  • 您可以配置 kubelet 以指定整個節點的交換利用率。

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

這可以透過將 memory_swap_limit_in_bytes 欄位新增到容器執行階段介面 (CRI) 來實現。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 設定的行為取決於節點是否使用控制群組(也稱為「cgroups」)的 v1 或 v2 版本執行

  • cgroups v1: Kubernetes 工作負載可以使用記憶體和交換的任意組合,最高可達 Pod 的記憶體限制(如果已設定)。
  • cgroups v2: Kubernetes 工作負載無法使用交換記憶體。

注意事項

系統上可用的交換會降低可預測性。交換的效能比一般記憶體差,有時差幾個數量級,這可能會導致意外的效能衰退。此外,交換會改變系統在記憶體壓力下的行為,應用程式無法直接控制其記憶體使用量的哪些部分被換出。由於啟用交換允許 Kubernetes 中工作負載使用更多的記憶體,而這些記憶體是無法預測地計算的,因此它也增加了吵雜鄰居和意外封裝配置的風險,因為排程器無法計算交換記憶體使用量。

啟用交換記憶體的節點效能取決於底層實體儲存裝置。當交換記憶體在使用中時,在每秒 I/O 運算次數 (IOPS) 受限的環境中,例如具有 I/O 節流的雲端 VM,效能會明顯更差,而與更快的儲存媒體(如固態硬碟或 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)聯絡。