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

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

我已經使用kubeadm init和安裝了一個具有 3 個主節點和 3 個節點的 kubernetes (v1.20.0) 集群kubeadm join,全部在 Ubuntu 20.04 上。現在我需要更新配置並

  • --cloud-provider=external在我將要使用的所有節點上新增kubelet 啟動標誌vSphere-CSI 驅動程式
  • --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 和controller-manager 在每個 master 上作為靜態 Pod 運行,並從/etc/kubernetes/manifests/kube-<type>.yaml.我的第一個想法是對這些文件進行必要的更改,但根據 kubernetes 文檔升級 kubeadm 集群,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

我將盡力回答你的兩個問題。


1. 在所有節點上新增 --cloud-provider=external kubelet 啟動標誌

.NodeRegistration.KubeletExtraArgs 在哪裡以及如何為叢集中的所有節點更改它?

KubeletExtraArgs是 kubelet 支援的任何參數和參數。他們被記錄在案這裡。您需要使用kubelet帶有適當標誌的命令才能修改它。另外,請注意,您將要使用的標誌將在 k8s v1.23 中刪除:

--cloud-provider string雲端服務提供者。設定為空字串以便在沒有雲端提供者的情況下運行。如果設置,雲端提供者將確定節點的名稱(請參閱雲端提供者文件以確定是否以及如何使用主機名稱)。 (已棄用:將在 1.23 中刪除,以支援從 Kubelet 中刪除雲端提供者代碼。)

編輯:

為了更好地解決您的問題:.NodeRegistration.KubeletExtraArgs

這些也是其中的要素kubeadm 初始化設定檔

可以kubeadm init使用設定檔而不是命令列標誌進行配置,並且一些更高級的功能可能只能作為設定檔選項提供。該文件使用標誌傳遞--config,並且它必須包含一個ClusterConfiguration 結構,並且可選地由更多結構分隔,在某些情況下可能不允許與其他標誌---\n混合 。--config

您還可以找到有關以下內容的更多詳細信息節點註冊選項以及有關配置的欄位和用法的更多資訊。

另請注意:

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 重置是去這裡的路。

答案2

關於

我知道 KubletExtraArgs 指的是 kubelet 命令列參數,我不明白的是這個屬性在哪裡以及如何修改它。

多個來源,例如這個指向添加到

/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

像這樣的線

Environment="KUBELET_EXTRA_ARGS=--pod-manifest-path=/etc/kubelet.d/"

例如,在此處為靜態 Pod 的自訂目錄設定環境,而不是使用 cli

kubelet --pod-manifest-path=/etc/kubelet.d

正如文檔中所建議的那樣。

如果你用谷歌搜索,$KUBELET_EXTRA_ARGS你會發現很多關於上述10-kubeadm.conf文件的例子。

相關內容