重新配置 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>

说明

保存对这些集群对象的任何更改后,节点上运行的组件可能不会自动更新。下方的步骤将指导你如何手动执行这些操作。

警告

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 清单管理,这些清单位于目录 /etc/kubernetes/manifests 中。对 ClusterConfiguration 下的 apiServercontrollerManagerscheduleretcd 键的任何更改,都必须反映在控制平面节点上清单目录中的相关文件中。

此类更改可能包括

  • extraArgs - 需要更新传递给组件容器的标志列表
  • extraVolumes - 需要更新组件容器的卷挂载
  • *SANs - 需要编写带有更新后的使用者备用名称(Subject Alternative Names)的新证书

在继续进行这些更改之前,请确保已备份 /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)。

说明

更新 /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 的 Deployment,并配有一个 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 部署

kubectl rollout restart deployment -n kube-system coredns

说明

kubeadm 不允许在集群创建和升级期间进行 CoreDNS 配置。这意味着如果你执行 kubeadm upgrade apply,你对 CoreDNS 对象所做的更改将会丢失,必须重新应用。

持久化重配置

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

持久化节点对象的重配置

kubeadm 会将标签、污点、CRI 套接字和其他信息写入特定 Kubernetes 节点的节点对象上。要更改此节点对象的任何内容,你可以使用

kubectl edit no <node-name>

kubeadm upgrade 期间,此类节点的内容可能会被覆盖。如果你希望在升级后持久保留对节点对象的修改,你可以准备一个 kubectl patch 并将其应用到节点对象上

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

持久化控制平面组件重配置

控制平面配置的主要来源是存储在集群中的 ClusterConfiguration 对象。要扩展静态 Pod 清单配置,可以使用 补丁(patches)

这些补丁文件必须保留在控制平面节点上,以确保它们可供 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年12月17日下午1:45 (PST): 重启 CoreDNS 部署以反映配置更改 (edc4dc7e49)