重新配置 kubeadm 叢集
kubeadm 不支援自動化方式重新配置部署在託管節點上的元件。一種自動化此過程的方式是使用自定義操作器。
要修改元件配置,你必須手動編輯相關的叢集物件和磁碟上的檔案。
本指南展示了實現 kubeadm 叢集重新配置所需的正確步驟順序。
準備工作
- 你需要一個使用 kubeadm 部署的叢集。
- 擁有管理員憑據 (
/etc/kubernetes/admin.conf) 以及從安裝了 kubectl 的主機到叢集中正在執行的 kube-apiserver 的網路連線。 - 所有主機上都安裝了文字編輯器。
重新配置叢集
kubeadm 將一系列叢集範圍的元件配置選項寫入 ConfigMaps 和其他物件。這些物件必須手動編輯。可以使用命令 kubectl edit 來完成。
kubectl edit 命令將開啟一個文字編輯器,你可以在其中直接編輯和儲存物件。
你可以使用環境變數 KUBECONFIG 和 KUBE_EDITOR 來指定 kubectl 所使用的 kubeconfig 檔案的位置和首選的文字編輯器。
例如
KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>
注意
儲存對這些叢集物件的任何更改後,節點上執行的元件可能不會自動更新。以下步驟指導你如何手動執行此操作。警告
ConfigMaps 中的元件配置儲存為非結構化資料 (YAML 字串)。這意味著在更新 ConfigMap 內容時不會執行驗證。你必須仔細遵循特定元件配置的文件化 API 格式,並避免引入拼寫錯誤和 YAML 縮排錯誤。應用叢集配置更改
更新 ClusterConfiguration
在叢集建立和升級期間,kubeadm 將其 ClusterConfiguration 寫入 kube-system 名稱空間中名為 kubeadm-config 的 ConfigMap。
要更改 ClusterConfiguration 中的特定選項,你可以使用此命令編輯 ConfigMap
kubectl edit cm -n kube-system kubeadm-config
配置位於 data.ClusterConfiguration 鍵下。
注意
ClusterConfiguration 包含各種選項,這些選項會影響各個元件的配置,例如 kube-apiserver、kube-scheduler、kube-controller-manager、CoreDNS、etcd 和 kube-proxy。配置的更改必須手動反映在節點元件上。在控制平面節點上反映 ClusterConfiguration 更改
kubeadm 將控制平面元件作為靜態 Pod 清單管理,這些清單位於 /etc/kubernetes/manifests 目錄中。對 ClusterConfiguration 中 apiServer、controllerManager、scheduler 或 etcd 鍵下的任何更改都必須反映在控制平面節點上清單目錄中的相關檔案中。
此類更改可能包括:
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 控制平面元件的名稱(apiserver、controller-manager 或 scheduler)。
注意
更新/etc/kubernetes/manifests 中的檔案將告訴 kubelet 重新啟動相應元件的靜態 Pod。嘗試一次只更改一個節點,以避免叢集停機。應用 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-configConfigMap 內容到本地檔案/var/lib/kubelet/config.yaml - 編輯檔案
/var/lib/kubelet/kubeadm-flags.env以應用帶標誌的附加配置 - 使用
systemctl restart kubelet命令重啟 kubelet 服務。
注意
一次只更改一個節點,以便工作負載能夠正確地重新排程。注意
在kubeadm upgrade 期間,kubeadm 會從 kubelet-config ConfigMap 下載 KubeletConfiguration 並覆蓋 /var/lib/kubelet/config.yaml 的內容。這意味著節點本地配置必須在 kubeadm upgrade 後透過 /var/lib/kubelet/kubeadm-flags.env 中的標誌或手動更新 /var/lib/kubelet/config.yaml 的內容來應用,然後重新啟動 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。
注意
由於 kubeadm 將 kube-proxy 部署為 DaemonSet,因此不支援節點特定配置。應用 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 不允許在叢集建立和升級期間配置 CoreDNS。這意味著如果你執行kubeadm upgrade apply,你對 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。