使用配置檔案命令式管理 Kubernetes 物件
Kubernetes 物件可以使用 `kubectl` 命令列工具以及 YAML 或 JSON 編寫的物件配置檔案進行建立、更新和刪除。本文件解釋瞭如何使用配置檔案定義和管理物件。
準備工作
安裝 kubectl
。
你需要擁有一個 Kubernetes 叢集,並且 `kubectl` 命令列工具必須配置為與你的叢集通訊。建議在至少有兩個不是控制平面主機的節點組成的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 操場中的一個
要檢查版本,請輸入 kubectl version
。
權衡
kubectl
工具支援三種物件管理方式
- 命令式命令
- 命令式物件配置
- 宣告式物件配置
有關每種物件管理的優缺點討論,請參閱Kubernetes 物件管理。
如何建立物件
你可以使用 `kubectl create -f` 從配置檔案建立物件。有關詳細資訊,請參閱 Kubernetes API 參考。
kubectl create -f <filename|url>
如何更新物件
警告
使用 `replace` 命令更新物件時,配置檔案中未指定的所有部分都將被刪除。這不應與其規約部分由叢集管理的物件一起使用,例如 `LoadBalancer` 型別的 Service,其中 `externalIPs` 欄位獨立於配置檔案進行管理。獨立管理的欄位必須複製到配置檔案中,以防止 `replace` 將它們刪除。你可以使用 `kubectl replace -f` 根據配置檔案更新活動物件。
kubectl replace -f <filename|url>
如何刪除物件
你可以使用 `kubectl delete -f` 刪除配置檔案中描述的物件。
kubectl delete -f <filename|url>
注意
如果配置檔案在 `metadata` 部分指定了 `generateName` 欄位而不是 `name` 欄位,你不能使用 `kubectl delete -f <filename|url>` 刪除物件。你必須使用其他標誌來刪除物件。例如:
kubectl delete <type> <name>
kubectl delete <type> -l <label>
如何檢視物件
你可以使用 `kubectl get -f` 檢視配置檔案中描述的物件的詳細資訊。
kubectl get -f <filename|url> -o yaml
`-o yaml` 標誌指定列印完整的物件配置。使用 `kubectl get -h` 檢視選項列表。
限制
當每個物件的配置都完全定義並記錄在其配置檔案中時,`create`、`replace` 和 `delete` 命令非常有效。但是,當活動物件被更新且更新未合併到其配置檔案中時,下次執行 `replace` 時,這些更新將丟失。如果控制器(例如 HorizontalPodAutoscaler)直接對活動物件進行更新,就可能發生這種情況。下面是一個示例:
- 你從配置檔案建立一個物件。
- 另一個源透過更改某些欄位來更新物件。
- 你從配置檔案替換物件。步驟 2 中另一個源所做的更改將丟失。
如果需要支援對同一物件的多個寫入器,可以使用 `kubectl apply` 來管理物件。
從 URL 建立和編輯物件而不儲存配置
假設你有一個物件配置檔案的 URL。你可以使用 `kubectl create --edit` 在物件建立之前更改配置。這對於指向可能被讀者修改的配置檔案的教程和任務特別有用。
kubectl create -f <url> --edit
從命令式命令遷移到命令式物件配置
從命令式命令遷移到命令式物件配置涉及幾個手動步驟。
將活動物件匯出到本地物件配置檔案中。
kubectl get <kind>/<name> -o yaml > <kind>_<name>.yaml
手動從物件配置檔案中刪除 status 欄位。
對於後續的物件管理,請專門使用 `replace`。
kubectl replace -f <kind>_<name>.yaml
定義控制器選擇器和 PodTemplate 標籤
警告
強烈不建議更新控制器上的選擇器。建議的方法是定義一個單一的、不可變的 PodTemplate 標籤,該標籤僅由控制器選擇器使用,沒有其他語義含義。
示例標籤
selector:
matchLabels:
controller-selector: "apps/v1/deployment/nginx"
template:
metadata:
labels:
controller-selector: "apps/v1/deployment/nginx"