重新配置 kubeadm 叢集

kubeadm 不支援自動化方式重新配置部署在託管節點上的元件。一種自動化此過程的方式是使用自定義操作器

要修改元件配置,你必須手動編輯相關的叢集物件和磁碟上的檔案。

本指南展示了實現 kubeadm 叢集重新配置所需的正確步驟順序。

準備工作

  • 你需要一個使用 kubeadm 部署的叢集。
  • 擁有管理員憑據 (/etc/kubernetes/admin.conf) 以及從安裝了 kubectl 的主機到叢集中正在執行的 kube-apiserver 的網路連線。
  • 所有主機上都安裝了文字編輯器。

重新配置叢集

kubeadm 將一系列叢集範圍的元件配置選項寫入 ConfigMaps 和其他物件。這些物件必須手動編輯。可以使用命令 kubectl edit 來完成。

kubectl edit 命令將開啟一個文字編輯器,你可以在其中直接編輯和儲存物件。

你可以使用環境變數 KUBECONFIGKUBE_EDITOR 來指定 kubectl 所使用的 kubeconfig 檔案的位置和首選的文字編輯器。

例如

KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>

應用叢集配置更改

更新 ClusterConfiguration

在叢集建立和升級期間,kubeadm 將其 ClusterConfiguration 寫入 kube-system 名稱空間中名為 kubeadm-config 的 ConfigMap。

要更改 ClusterConfiguration 中的特定選項,你可以使用此命令編輯 ConfigMap

kubectl edit cm -n kube-system kubeadm-config

配置位於 data.ClusterConfiguration 鍵下。

在控制平面節點上反映 ClusterConfiguration 更改

kubeadm 將控制平面元件作為靜態 Pod 清單管理,這些清單位於 /etc/kubernetes/manifests 目錄中。對 ClusterConfigurationapiServercontrollerManagerscheduleretcd 鍵下的任何更改都必須反映在控制平面節點上清單目錄中的相關檔案中。

此類更改可能包括:

  • extraArgs - 需要更新傳遞給元件容器的標誌列表。
  • extraVolumes - 需要更新元件容器的卷掛載。
  • *SANs - 需要使用更新的主題備用名稱寫入新證書。

在進行這些更改之前,請確保已備份 /etc/kubernetes/ 目錄。

要寫入新證書,你可以使用

kubeadm init phase certs <component-name> --config <config-file>

要在 /etc/kubernetes/manifests 中寫入新的清單檔案,你可以使用

# For Kubernetes control plane components
kubeadm init phase control-plane <component-name> --config <config-file>
# For local etcd
kubeadm init phase etcd local --config <config-file>

<config-file> 的內容必須與更新後的 ClusterConfiguration 匹配。<component-name> 的值必須是 Kubernetes 控制平面元件的名稱(apiservercontroller-managerscheduler)。

應用 kubelet 配置更改

更新 KubeletConfiguration

在叢集建立和升級期間,kubeadm 將其 KubeletConfiguration 寫入 kube-system 名稱空間中名為 kubelet-config 的 ConfigMap。

你可以使用此命令編輯 ConfigMap

kubectl edit cm -n kube-system kubelet-config

配置位於 data.kubelet 鍵下。

反映 kubelet 更改

要在 kubeadm 節點上反映更改,你必須執行以下操作:

  • 登入到 kubeadm 節點
  • 執行 kubeadm upgrade node phase kubelet-config 以下載最新的 kubelet-config ConfigMap 內容到本地檔案 /var/lib/kubelet/config.yaml
  • 編輯檔案 /var/lib/kubelet/kubeadm-flags.env 以應用帶標誌的附加配置
  • 使用 systemctl restart kubelet 命令重啟 kubelet 服務。

應用 kube-proxy 配置更改

更新 KubeProxyConfiguration

在叢集建立和升級期間,kubeadm 將其 KubeProxyConfiguration 寫入 kube-system 名稱空間中名為 kube-proxy 的 ConfigMap。

此 ConfigMap 由 kube-system 名稱空間中的 kube-proxy DaemonSet 使用。

要更改 KubeProxyConfiguration 中的特定選項,你可以使用此命令編輯 ConfigMap

kubectl edit cm -n kube-system kube-proxy

配置位於 data.config.conf 鍵下。

反映 kube-proxy 更改

kube-proxy ConfigMap 更新後,你可以重新啟動所有 kube-proxy Pods

使用以下命令刪除 Pods:

kubectl delete po -n kube-system -l k8s-app=kube-proxy

將建立使用更新後的 ConfigMap 的新 Pods。

應用 CoreDNS 配置更改

更新 CoreDNS Deployment 和 Service

kubeadm 部署 CoreDNS 為一個名為 coredns 的 Deployment 和一個名為 kube-dns 的 Service,兩者都在 kube-system 名稱空間中。

要更新任何 CoreDNS 設定,你可以編輯 Deployment 和 Service 物件

kubectl edit deployment -n kube-system coredns
kubectl edit service -n kube-system kube-dns

反映 CoreDNS 更改

CoreDNS 更改應用後,你可以重新啟動 CoreDNS Deployment。

kubectl rollout restart deployment -n kube-system coredns

持久化重新配置

在託管節點上執行 kubeadm upgrade 期間,kubeadm 可能會覆蓋叢集建立後應用的配置(重新配置)。

持久化節點物件重新配置

kubeadm 為特定 Kubernetes 節點的 Node 物件寫入標籤、汙點、CRI 套接字和其他資訊。要更改此 Node 物件的任何內容,你可以使用

kubectl edit no <node-name>

kubeadm upgrade 期間,此類 Node 的內容可能會被覆蓋。如果希望在升級後保留對 Node 物件的修改,可以準備一個 kubectl 補丁 並將其應用於 Node 物件。

kubectl patch no <node-name> --patch-file <patch-file>

持久化控制平面元件重新配置

控制平面配置的主要來源是叢集中儲存的 ClusterConfiguration 物件。為了擴充套件靜態 Pod 清單配置,可以使用補丁

這些補丁檔案必須保留在控制平面節點上,以確保 kubeadm upgrade ... --patches <directory> 可以使用它們。

如果對磁碟上的 ClusterConfiguration 和靜態 Pod 清單進行了重新配置,則必須相應地更新節點特定補丁集。

持久化 kubelet 重新配置

/var/lib/kubelet/config.yaml 中儲存的 KubeletConfiguration 的任何更改都將在 kubeadm upgrade 時透過下載叢集範圍的 kubelet-config ConfigMap 的內容而被覆蓋。要持久化 kubelet 節點特定配置,必須在升級後手動更新 /var/lib/kubelet/config.yaml 檔案,或者 /var/lib/kubelet/kubeadm-flags.env 檔案可以包含標誌。kubelet 標誌會覆蓋相關的 KubeletConfiguration 選項,但請注意,某些標誌已被棄用。

更改 /var/lib/kubelet/config.yaml/var/lib/kubelet/kubeadm-flags.env 後,需要重新啟動 kubelet。

下一步

上次修改時間:2024 年 12 月 17 日下午 1:45 PST:重啟 CoreDNS 部署以反映配置更改 (edc4dc7e49)