重新配置 kubeadm 集群

kubeadm 不支持以自动化方式重新配置部署在托管节点上的组件。一种自动化的方法是使用自定义 操作器

要修改组件配置,您必须手动编辑磁盘上关联的集群对象和文件。

本指南展示了实现 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 清单进行管理,这些清单位于目录 /etc/kubernetes/manifests 中。对 apiServercontrollerManagerscheduleretcd 键下的 ClusterConfiguration 所做的任何更改都必须反映在控制平面节点上 manifests 目录中的关联文件中。

此类更改可能包括

  • 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 中。

kube-system 命名空间中的 kube-proxy DaemonSet 使用此 ConfigMap。

要更改 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>

将创建使用更新后的 ConfigMap 的新 Pod。

应用 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 Pod

获取 Pod 名称

kubectl get po -n kube-system | grep coredns

使用以下命令删除 Pod

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

将使用更新后的 CoreDNS 配置创建新的 Pod。

持久化重新配置

在托管节点上执行 kubeadm upgrade 期间,kubeadm 可能会覆盖在集群创建后应用的配置(重新配置)。

持久化 Node 对象重新配置

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 年 7 月 3 日下午 4:31 PST:修复错字:extraMounts -> extraVolumes (b56a4f4e43)