重新配置 kubeadm 叢集

kubeadm 不支援自動重新配置在受管節點上部署的元件。自動執行此操作的一種方法是使用自訂的 operator

若要修改元件組態,您必須手動編輯相關的叢集物件和磁碟上的檔案。

本指南說明達成 kubeadm 叢集重新配置所需的正確步驟順序。

開始之前

  • 您需要使用 kubeadm 部署的叢集
  • 擁有管理員憑證 (/etc/kubernetes/admin.conf) 和網路連線能力,從已安裝 kubectl 的主機連線到叢集中執行中的 kube-apiserver
  • 在所有主機上安裝文字編輯器

重新配置叢集

kubeadm 將一組叢集範圍的元件組態選項寫入 ConfigMap 和其他物件。必須手動編輯這些物件。指令 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 Manifest 檔案管理,這些檔案位於目錄 /etc/kubernetes/manifests 中。對 ClusterConfigurationapiServercontrollerManagerscheduleretcd 鍵下的任何變更都必須反映在控制平面節點上 Manifests 目錄中的相關檔案中。

此類變更可能包括

  • extraArgs - 需要更新傳遞至元件容器的旗標清單
  • extraVolumes - 需要更新元件容器的磁碟區掛載
  • *SANs - 需要寫入具有更新主體別名的新憑證

在繼續進行這些變更之前,請確保您已備份目錄 /etc/kubernetes/

若要寫入新憑證,您可以使用

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

若要將新的 Manifest 檔案寫入 /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 Pod

使用以下指令刪除 Pod:

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

將會建立使用更新後 ConfigMap 的新 Pod。

套用 CoreDNS 組態變更

更新 CoreDNS 部署和服務

kubeadm 將 CoreDNS 部署為名為 coredns 的部署,並使用服務 kube-dns,兩者都在 kube-system 命名空間中。

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

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

反映 CoreDNS 變更

一旦 CoreDNS 變更套用後,您可以刪除 CoreDNS Pod

取得 Pod 名稱

kubectl get po -n kube-system | grep coredns

刪除 Pod 使用

kubectl delete po -n kube-system <pod-name>

將會建立具有更新 CoreDNS 設定的新 Pod。

持續保存重新配置

在受管節點上執行 kubeadm upgrade 期間,kubeadm 可能會覆寫在叢集建立後套用的設定(重新配置)。

持續保存節點物件重新配置

kubeadm 會在特定 Kubernetes 節點的節點物件上寫入標籤 (Labels)、污點 (Taints)、CRI socket 和其他資訊。若要變更此節點物件的任何內容,您可以使用

kubectl edit no <node-name>

kubeadm upgrade 期間,此類節點的內容可能會被覆寫。如果您希望在升級後持續保存對節點物件的修改,您可以準備一個 kubectl patch 並將其套用到節點物件

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

持續保存控制平面元件重新配置

控制平面組態的主要來源是儲存在叢集中的 ClusterConfiguration 物件。若要擴充靜態 Pod manifest 設定,可以使用 patch

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

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

持續保存 kubelet 重新配置

對於儲存在 /var/lib/kubelet/config.yaml 中的 KubeletConfiguration 的任何變更,都會在 kubeadm upgrade 時被下載叢集範圍的 kubelet-config ConfigMap 的內容覆寫。若要持續保存 kubelet 節點特定組態,必須在升級後手動更新檔案 /var/lib/kubelet/config.yaml,或者檔案 /var/lib/kubelet/kubeadm-flags.env 可以包含標flag。kubelet flag 會覆寫相關聯的 KubeletConfiguration 選項,但請注意,某些 flag 已被棄用。

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

接下來

最後修改於 2024 年 12 月 08 日下午 5:49 PST:簡化 `kube-proxy` ConfigMap 更新後的 kube-proxy 重新整理 (672c2a70ff)