Kubernetes

使用 kubeadm 修改 kubelet 和控制平面配置的正確方法是什麼?

  • September 23, 2021

我已經使用 and 安裝了一個 kubernetes (v1.20.0) 集群,其中包含 3 個主節點和 3 個節點kubeadm initkubeadm join所有這些都在 Ubuntu 20.04 上。現在我需要更新配置和

  • 在所有節點上添加--cloud-provider=externalkubelet 啟動標誌,因為我將使用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階段。

基於上述,工作流程似乎是

  • 從中提取 ClusterConfigurationkubeadm -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 重置是這裡的方法。

引用自:https://serverfault.com/questions/1050195