使用 kubeadm 修改 kubelet 和控制平面配置的正確方法是什麼?
我已經使用 and 安裝了一個 kubernetes (v1.20.0) 集群,其中包含 3 個主節點和 3 個節點
kubeadm init
,kubeadm join
所有這些都在 Ubuntu 20.04 上。現在我需要更新配置和
- 在所有節點上添加
--cloud-provider=external
kubelet 啟動標誌,因為我將使用vsphere-csi-driver--service-cidr
根據網路要求更改但是,我不完全確定進行這些更改的正確方法是什麼。
庫貝萊特
看著
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
有一個參考,/etc/default/kubelet
但它被認為是最後的手段,並建議更新.NodeRegistration.KubeletExtraArgs
:... # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. EnvironmentFile=-/etc/default/kubelet ...
這是在哪里
.NodeRegistration.KubeletExtraArgs
以及如何為集群中的所有節點更改它?控制平面
據我了解,apiserver 和控制器管理器在每個 master 上作為靜態 pod 執行,並從
/etc/kubernetes/manifests/kube-<type>.yaml
. 我的第一個想法是對這些文件進行必要的更改,但是根據 kubernetes docs on upgrade a kubeadm cluster,kubeadm 將:* Fetches the kubeadm ClusterConfiguration from the cluster. * Optionally backups the kube-apiserver certificate. * Upgrades the static Pod manifests for the control plane components.
因為我已經手動更改了清單,它們沒有在 ClusterConfiguration (
kubectl -n kube-system get cm kubeadm-config -o yaml
) 中更新,所以我的更改會以這種方式升級嗎?我想我也可以手動編輯 ClusterConfiguration ,kubeadm edit cm ...
但這似乎容易出錯,而且很容易忘記每次都更改它。根據文件,有一種方法可以自定義控制平面配置,但這似乎只在第一次安裝集群時才出現。例如,
kubeadm config print init-defaults
顧名思義,只給我預設值,而不是目前在集群中執行的值。嘗試從中提取 ClusterConfigurationkubectl -n kube-system get cm kubeadm-config -o yaml
並執行kubeadm init --config <config>
以各種方式失敗,因為集群已經初始化。Kubeadm 可以執行初始化階段控制平面來更新靜態 pod 清單但保持 ClusterConfiguration 不變,因此我也需要執行該
upload-config
階段。基於上述,工作流程似乎是
- 從中提取 ClusterConfiguration
kubeadm -n kube-system get cm kubeadm-config
並將其保存到 yaml 文件中- 使用您需要的任何更改修改 yaml 文件
- 應用更改
kubeadm init phase control-plane all --config <yaml>
- 上傳修改後的配置
kubeadm init phase upload-config all --config <yaml>
- 將修改後的 yaml 文件分發給所有 master
- 對於每個主人,申請
kubeadm init phase control-plane all --config <yaml>
我在這裡擔心的是靜態 pod 清單和 ClusterConfiguration 之間明顯的脫節。更改不是特別頻繁,因此很容易忘記在一個地方進行更改也需要在另一個地方進行更改 - 手動。
是否無法更新 kubelet 和控制平面設置以確保 kubernetes 組件和 kubeadm 之間的一致性?我對 Kubernetes 還是很陌生,並且有很多關於它的文件,所以如果我在這裡遺漏了一些明顯的東西,我很抱歉。
我將嘗試解決您的兩個問題。
1.在所有節點上添加–cloud-provider=external kubelet啟動標誌
這個 .NodeRegistration.KubeletExtraArgs 在哪裡?如何為集群中的所有節點更改它?
KubeletExtraArgs
是 kubelet 支持的任何參數和參數。它們被記錄在這裡。您需要使用kubelet
帶有適當標誌的命令才能對其進行修改。另外,請注意您將要使用的標誌將在 k8s v1.23 中刪除:
--cloud-provider string
雲服務提供商。設置為空字元串以在沒有云提供商的情況下執行。如果設置,雲提供商將確定節點的名稱(請參閱雲提供商文件以確定是否以及如何使用主機名)。(已棄用:將在 1.23 中刪除,以支持從 Kubelet 中刪除雲提供商程式碼。)編輯:
為了更好地解決您的問題:
.NodeRegistration.KubeletExtraArgs
這些也是kubeadm init 配置文件的元素:
可以
kubeadm init
使用配置文件而不是命令行標誌進行配置,並且一些更高級的功能可能僅作為配置文件選項提供。此文件使用--config
標誌傳遞,它必須包含一個結構,並且在某些情況下可能不允許使用與其他標誌混合ClusterConfiguration
分隔的更多結構。---\n``--config
您還可以找到有關NodeRegistrationOptions的更多詳細資訊以及有關配置的欄位和使用的更多資訊。
另外,請注意:
KubeletExtraArgs
將額外的參數傳遞給 kubelet。這裡的參數通過環境文件傳遞給 kubelet 命令行kubeadm 在執行時為 kubelet 寫入原始碼。這會覆蓋 kubelet-config-1.X 中的通用基礎級配置
ConfigMap
解析時標誌具有更高的優先級。這些值是本地的並且特定於 kubeadm 正在執行的節點。
編輯2:
kubeadm init
每當您將它與標誌或配置文件一起使用時,應該在創建集群時只使用一次。您不能通過使用不同的值再次執行來更改配置。在這裡,您將找到有關 kubeadm 及其用法的資訊。設置集群後,應刪除 kubeadm,並直接對靜態 pod 清單進行更改。2.根據網路需求更改–service-cidr
這更複雜。您可以嘗試像此處或此處類似地執行此操作,但這種方法容易出錯,因此不推薦。
更可行和更安全的方法是簡單地使用
kubeadm reset
和重新創建集群kubeadm init --service-cidr
。從 Kubernetes 的角度來看,甚至沒有預料到自動更改 CIDR 的選項。所以簡而言之,kubeadm 重置是這裡的方法。