重新配置 kubeadm 叢集
kubeadm 不支援自動重新配置在受管節點上部署的元件。自動執行此操作的一種方法是使用自訂的 operator。
若要修改元件組態,您必須手動編輯相關的叢集物件和磁碟上的檔案。
本指南說明達成 kubeadm 叢集重新配置所需的正確步驟順序。
開始之前
- 您需要使用 kubeadm 部署的叢集
- 擁有管理員憑證 (
/etc/kubernetes/admin.conf
) 和網路連線能力,從已安裝 kubectl 的主機連線到叢集中執行中的 kube-apiserver - 在所有主機上安裝文字編輯器
重新配置叢集
kubeadm 將一組叢集範圍的元件組態選項寫入 ConfigMap 和其他物件。必須手動編輯這些物件。指令 kubectl edit
可用於此目的。
kubectl edit
指令將開啟文字編輯器,您可以在其中直接編輯和儲存物件。
您可以使用環境變數 KUBECONFIG
和 KUBE_EDITOR
來指定 kubectl 使用的 kubeconfig 檔案位置和偏好的文字編輯器。
例如
KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>
注意
儲存對這些叢集物件的任何變更後,節點上執行的元件可能不會自動更新。以下步驟指示您如何手動執行更新。警告
ConfigMap 中的元件組態以非結構化資料 (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 Manifest 檔案管理,這些檔案位於目錄 /etc/kubernetes/manifests
中。對 ClusterConfiguration
中 apiServer
、controllerManager
、scheduler
或 etcd
鍵下的任何變更都必須反映在控制平面節點上 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 控制平面元件 (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-config
ConfigMap 內容下載到本機檔案/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
的內容。這表示節點本機組態必須透過 /var/lib/kubelet/kubeadm-flags.env
中的旗標或在 kubeadm upgrade
後手動更新 /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 Pod
使用以下指令刪除 Pod:
kubectl delete po -n kube-system -l k8s-app=kube-proxy
將會建立使用更新後 ConfigMap 的新 Pod。
注意
由於 kubeadm 將 kube-proxy 部署為 DaemonSet,因此不支援節點特定的組態。套用 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 不允許在叢集建立和升級期間設定 CoreDNS。這表示如果您執行kubeadm upgrade apply
,您對 CoreDNS 物件的變更將會遺失,而且必須重新套用。持續保存重新配置
在受管節點上執行 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。