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

Kubernetes 1.27:kubectl apply 中更安全、更高效能的修剪

使用 kubectl apply 命令進行宣告式配置管理是建立或修改 Kubernetes 資源的首選方法。然而,它帶來的一個挑戰是刪除不再需要的資源。在 Kubernetes 1.5 版本中,引入了 --prune 標誌來解決這個問題,允許 kubectl apply 自動清理從當前配置中移除的、先前已應用的資源。

不幸的是,現有的 --prune 實現存在設計缺陷,降低了其效能並可能導致意外行為。主要問題源於上一次 apply 操作沒有明確地編碼先前應用的物件集合,因此需要容易出錯的動態發現機制。物件洩漏、無意中過度選擇資源以及與自定義資源的有限相容性是此實現的一些顯著缺點。此外,它與客戶端 apply 的耦合阻礙了使用者升級到更優越的伺服器端 apply 機制。

kubectl 的 1.27 版本引入了一個經過改進的修剪功能的 Alpha 版本,解決了這些問題。這個新的實現基於一個名為 ApplySet 的概念,承諾提供更好的效能和安全性。

ApplySet 是一組與叢集上的一個**父**物件相關聯的資源,透過標準化的標籤和註解來識別和配置。額外的標準化元資料允許在叢集內準確識別 ApplySet 的**成員**物件,簡化了修剪等操作。

要利用基於 ApplySet 的修剪功能,請設定 KUBECTL_APPLYSET=true 環境變數,並在你的 kubectl apply 呼叫中包含 --prune--applyset 標誌。

KUBECTL_APPLYSET=true kubectl apply -f <directory/> --prune --applyset=<name>

預設情況下,ApplySet 使用一個 Secret 作為父物件。但是,你也可以使用 ConfigMap,格式為 --applyset=configmaps/<name>。如果你期望的 Secret 或 ConfigMap 物件尚不存在,kubectl 會為你建立它。此外,還可以啟用自定義資源作為 ApplySet 的父物件。

ApplySet 的實現基於一個新的低階規範,該規範可以透過提高互操作性來支援更高級別的生態系統工具。該規範的輕量級特性使這些工具能夠繼續使用現有的物件分組系統,同時選擇性地採用 ApplySet 的元資料約定,以防止被其他工具(如 kubectl)意外更改。

基於 ApplySet 的修剪功能為 kubectl 中舊版 --prune 實現的缺點提供了一個有前景的解決方案,並可以幫助簡化你的 Kubernetes 資源管理。請嘗試這個新功能,並與社群分享你的經驗——ApplySet 正在積極開發中,你的反饋非常寶貴!

其他資源

  • 有關如何使用基於 ApplySet 的修剪功能的更多資訊,請閱讀 Kubernetes 文件中的使用配置檔案對 Kubernetes 物件進行宣告式管理
  • 要更深入地瞭解此功能的技術設計,或學習如何在自己的工具中實現 ApplySet 規範,請參閱 KEP 3659:*ApplySet: kubectl apply --prune 重新設計和畢業策略*。

我如何參與?

如果你想參與 ApplySet 的開發,可以透過 SIG CLI 與開發人員聯絡。要提供有關該功能的反饋,請在 kubernetes/kubectl 倉庫中提交一個 Bug請求一個功能增強