Kubernetes 重新配置kubeadm集群

2022-06-02 10:50 更新

重新配置 kubeadm 集群

kubeadm 不支持自動重新配置部署在托管節(jié)點上的組件的方式。 一種自動化的方法是使用自定義的 operator。

要修改組件配置,你必須手動編輯磁盤上關(guān)聯(lián)的集群對象和文件。 本指南展示了實現(xiàn) kubeadm 集群重新配置所需執(zhí)行的正確步驟順序。

在開始之前

  • 你需要一個使用 kubeadm 部署的集群
  • 擁有管理員憑據(jù)(?/etc/kubernetes/admin.conf?) 和從安裝了 kubectl 的主機到集群中正在運行的 kube-apiserver 的網(wǎng)絡(luò)連接
  • 在所有主機上安裝文本編輯器

重新配置集群

kubeadm 在 ConfigMap 和其他對象中寫入了一組集群范圍的組件配置選項。 這些對象必須手動編輯,可以使用命令 ?kubectl edit?。

?kubectl edit? 命令將打開一個文本編輯器,你可以在其中直接編輯和保存對象。 你可以使用環(huán)境變量 ?KUBECONFIG ?和 ?KUBE_EDITOR ?來指定 kubectl 使用的 kubeconfig 文件和首選文本編輯器的位置。

例如:

KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>
Note:
保存對這些集群對象的任何更改后,節(jié)點上運行的組件可能不會自動更新。 以下步驟將指導你如何手動執(zhí)行該操作。
Warning:
ConfigMaps 中的組件配置存儲為非結(jié)構(gòu)化數(shù)據(jù)(YAML 字符串)。 這意味著在更新 ConfigMap 的內(nèi)容時不會執(zhí)行驗證。 你必須小心遵循特定組件配置的文檔化 API 格式, 并避免引入拼寫錯誤和 YAML 縮進錯誤。

應(yīng)用集群配置更改

更新 ClusterConfiguration

在集群創(chuàng)建和升級期間,kubeadm 將其 ?ClusterConfiguration ?寫入 ?kube-system? 命名空間中名為 ?kubeadm-config? 的 ConfigMap。

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

kubectl edit cm -n kube-system kubeadm-config

配置位于 ?data.ClusterConfiguration? 鍵下。

Note:
?ClusterConfiguration ?包括各種影響單個組件配置的選項, 例如 kube-apiserver、kube-scheduler、kube-controller-manager、 CoreDNS、etcd 和 kube-proxy。 對配置的更改必須手動反映在節(jié)點組件上。

在控制平面節(jié)點上反映 ClusterConfiguration 更改

kubeadm 將控制平面組件作為位于 ?/etc/kubernetes/manifests? 目錄中的靜態(tài) Pod 清單進行管理。 對 ?apiServer?、?controllerManager?、?scheduler ?或 ?etcd?鍵下的 ?ClusterConfiguration ?的任何更改都必須反映在控制平面節(jié)點上清單目錄中的關(guān)聯(lián)文件中。

此類更改可能包括:

  • ?extraArgs ?- 需要更新傳遞給組件容器的標志列表
  • ?extraMounts ?- 需要更新組件容器的卷掛載
  • ?*SANs? - 需要使用更新的主題備用名稱編寫新證書

在繼續(xù)進行這些更改之前,請確保你已備份目錄 ?/etc/kubernetes/?。

要編寫新證書,你可以使用:

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

要在 ?/etc/kubernetes/manifests? 中編寫新的清單文件,你可以使用:

kubeadm init phase control-plane <component-name> --config <config-file>

?<config-file>? 內(nèi)容必須與更新后的 ?ClusterConfiguration ?匹配。 ?<component-name>? 值必須是組件的名稱。

Note:
更新 ?/etc/kubernetes/manifests? 中的文件將告訴 kubelet 重新啟動相應(yīng)組件的靜態(tài) Pod。 嘗試一次對一個節(jié)點進行這些更改,以在不停機的情況下離開集群。

應(yīng)用 kubelet 配置更改

更新 KubeletConfiguration

在集群創(chuàng)建和升級期間,kubeadm 將其 ?KubeletConfiguration ?寫入 ?kube-system? 命名空間中名為 ?kubelet-config? 的 ConfigMap。 你可以使用以下命令編輯 ConfigMap:

kubectl edit cm -n kube-system kubelet-config

配置位于 ?data.kubelet? 鍵下。

反映 kubelet 的更改

要反映 kubeadm 節(jié)點上的更改,你必須執(zhí)行以下操作:

  • 登錄到 kubeadm 節(jié)點
  • 運行 ?kubeadm upgrade node phase kubelet-config? 下載最新的 ?kubelet-config? ConfigMap 內(nèi)容到本地文件 ?/var/lib/kubelet/config.conf ?
  • 編輯文件 ?/var/lib/kubelet/kubeadm-flags.env? 以使用標志來應(yīng)用額外的配置
  • 使用 ?systemctl restart kubelet? 重啟 kubelet 服務(wù)

Note:
一次執(zhí)行一個節(jié)點的這些更改,以允許正確地重新安排工作負載。
Note:
在 ?kubeadm upgrade? 期間,kubeadm 從 ?kubelet-config? ConfigMap 下載 ?KubeletConfiguration ?并覆蓋 ?/var/lib/kubelet/config.conf? 的內(nèi)容。 這意味著節(jié)點本地配置必須通過?/var/lib/kubelet/kubeadm-flags.env?中的標志或在 kubeadm upgrade 后手動更新/var/lib/kubelet/config.conf`的內(nèi)容來應(yīng)用,然后重新啟動 kubelet。

應(yīng)用 kube-proxy 配置更改

更新 KubeProxyConfiguration

在集群創(chuàng)建和升級期間,kubeadm 將其寫入 ?KubeProxyConfiguration ?在名為 ?kube-proxy? 的 ?kube-system? 命名空間中的 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 get po -n kube-system | grep kube-proxy

使用以下命令刪除 Pod:

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

將創(chuàng)建使用更新的 ConfigMap 的新 Pod。

Note:
由于 kubeadm 將 kube-proxy 部署為 DaemonSet,因此不支持特定于節(jié)點的配置。

應(yīng)用 CoreDNS 配置更改

更新 CoreDNS 的 Deployment 和 Service

kubeadm 將 CoreDNS 部署為名為 ?coredns ?的 Deployment,并使用 Service ?kube-dns?, 兩者都在 ?kube-system? 命名空間中。

要更新任何 CoreDNS 設(shè)置,你可以編輯 Deployment 和 Service:

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

反映 CoreDNS 的更改

應(yīng)用 CoreDNS 更改后,你可以刪除 CoreDNS Pod。

獲取 Pod 名稱:

kubectl get po -n kube-system | grep coredns

使用以下命令刪除 Pod:

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

將創(chuàng)建具有更新的 CoreDNS 配置的新 Pod。

Note:
kubeadm 不允許在集群創(chuàng)建和升級期間配置 CoreDNS。 這意味著如果執(zhí)行了 ?kubeadm upgrade apply?,你對 CoreDNS 對象的更改將丟失并且必須重新應(yīng)用。

持久化重新配置 

在受管節(jié)點上執(zhí)行 ?kubeadm upgrade? 期間,kubeadm 可能會覆蓋在創(chuàng)建集群(重新配置)后應(yīng)用的配置。

持久化 Node 對象重新配置

kubeadm 在特定 Kubernetes 節(jié)點的 Node 對象上寫入標簽、污點、CRI 套接字和其他信息。要更改此 Node 對象的任何內(nèi)容,你可以使用:

kubectl edit no <node-name>

在 ?kubeadm upgrade? 期間,此類節(jié)點的內(nèi)容可能會被覆蓋。 如果你想在升級后保留對 Node 對象的修改,你可以準備一個 kubectl patch 并將其應(yīng)用到 Node 對象:

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

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

控制平面配置的主要來源是存儲在集群中的 ?ClusterConfiguration ?對象。 要擴展靜態(tài) Pod 清單配置,可以使用 patches。

這些補丁文件必須作為文件保留在控制平面節(jié)點上,以確保它們可以被 ?kubeadm upgrade ... --patches <directory>? 使用。

如果對 ?ClusterConfiguration ?和磁盤上的靜態(tài) Pod 清單進行了重新配置,則必須相應(yīng)地更新節(jié)點特定補丁集。

持久化 kubelet 重新配置

對存儲在 ?/var/lib/kubelet/config.conf? 中的 ?KubeletConfiguration ?所做的任何更改都將在 ?kubeadm upgrade? 時因為下載集群范圍內(nèi)的 ?kubelet-config? ConfigMap 的內(nèi)容而被覆蓋。 要持久保存 kubelet 節(jié)點特定的配置,文件?/var/lib/kubelet/config.conf? 必須在升級后手動更新,或者文件?/var/lib/kubelet/kubeadm-flags.env? 可以包含標志。 kubelet 標志會覆蓋相關(guān)的 ?KubeletConfiguration ?選項,但請注意,有些標志已被棄用。

更改 ?/var/lib/kubelet/config.conf? 或 ?/var/lib/kubelet/kubeadm-flags.env? 后需要重啟 kubelet。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號