Kubernetes 物件管理
kubectl
命令列工具支援幾種不同的方式來建立和管理 Kubernetes 物件。本文件概述不同的方法。如需透過 Kubectl 管理物件的詳細資訊,請參閱 Kubectl 書籍。
管理技術
警告
Kubernetes 物件應僅使用一種技術進行管理。對同一個物件混合和搭配使用多種技術會導致未定義的行為。管理技術 | 操作對象 | 建議環境 | 支援的寫入者 | 學習曲線 |
---|---|---|---|---|
命令式指令 | 即時物件 | 開發專案 | 1+ | 最低 |
命令式物件組態 | 個別檔案 | 生產專案 | 1 | 中等 |
宣告式物件組態 | 檔案目錄 | 生產專案 | 1+ | 最高 |
命令式指令
當使用命令式指令時,使用者直接在叢集中的即時物件上操作。使用者以引數或旗標的形式將操作提供給 kubectl
命令。
這是開始使用或在叢集中執行一次性任務的建議方式。由於此技術直接在即時物件上操作,因此不提供先前組態的歷史記錄。
範例
透過建立 Deployment 物件來執行 nginx 容器的執行個體
kubectl create deployment nginx --image nginx
權衡
與物件組態相比的優點
- 命令以單一動作字詞表示。
- 命令僅需單一步驟即可變更叢集。
與物件組態相比的缺點
- 命令不與變更審查流程整合。
- 命令不提供與變更相關聯的稽核追蹤。
- 命令不提供記錄來源,除非是即時的內容。
- 命令不提供建立新物件的範本。
命令式物件組態
在命令式物件組態中,kubectl 命令指定操作(建立、取代等等)、選用旗標和至少一個檔案名稱。指定的檔案必須包含 YAML 或 JSON 格式的物件完整定義。
如需物件定義的更多詳細資訊,請參閱 API 參考。
警告
命令式的replace
命令會將現有的規格取代為新提供的規格,並捨棄組態檔中遺失的物件的所有變更。此方法不應與規格獨立於組態檔更新的資源類型一起使用。例如,LoadBalancer
類型的服務,其 externalIPs
欄位會由叢集獨立於組態檔進行更新。範例
建立組態檔中定義的物件
kubectl create -f nginx.yaml
刪除兩個組態檔中定義的物件
kubectl delete -f nginx.yaml -f redis.yaml
透過覆寫即時組態來更新組態檔中定義的物件
kubectl replace -f nginx.yaml
權衡
與命令式指令相比的優點
- 物件組態可以儲存在來源控制系統中,例如 Git。
- 物件組態可以與流程整合,例如在推送和稽核追蹤之前審查變更。
- 物件組態提供建立新物件的範本。
與命令式指令相比的缺點
- 物件組態需要對物件綱要的基本理解。
- 物件組態需要編寫 YAML 檔案的額外步驟。
與宣告式物件組態相比的優點
- 命令式物件組態行為更簡單且更容易理解。
- 截至 Kubernetes 1.5 版,命令式物件組態更加成熟。
與宣告式物件組態相比的缺點
- 命令式物件組態最適用於檔案,而非目錄。
- 對即時物件的更新必須反映在組態檔中,否則在下次取代期間將會遺失。
宣告式物件組態
當使用宣告式物件組態時,使用者在本地儲存的物件組態檔上操作,但是使用者不定義要對檔案執行的操作。kubectl
會自動偵測每個物件的建立、更新和刪除操作。這使得可以在目錄上工作,其中不同的物件可能需要不同的操作。
注意
宣告式物件組態會保留其他寫入者所做的變更,即使這些變更未合併回物件組態檔。這是透過使用patch
API 操作來僅寫入觀察到的差異,而不是使用 replace
API 操作來取代整個物件組態來實現的。範例
處理 configs
目錄中的所有物件組態檔,並建立或修補即時物件。您可以先使用 diff
來查看將進行哪些變更,然後套用
kubectl diff -f configs/
kubectl apply -f configs/
遞迴處理目錄
kubectl diff -R -f configs/
kubectl apply -R -f configs/
權衡
與命令式物件組態相比的優點
- 直接對線上物件做的變更會被保留,即使它們沒有被合併回組態檔中。
- 宣告式物件組態對於操作目錄以及自動偵測每個物件的操作類型(建立、修補、刪除)有更好的支援。
與命令式物件組態相比的缺點
- 當結果出乎意料時,宣告式物件組態更難以除錯和理解結果。
- 使用差異進行部分更新會產生複雜的合併和修補操作。
接下來是什麼
上次修改時間為 2022 年 1 月 8 日下午 6:09 PST:重新組織 Kubernetes 物件操作章節 (634c17f61c)