重新配置 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 清单进行管理,这些清单位于目录 /etc/kubernetes/manifests
中。对 ClusterConfiguration
中 apiServer
、controllerManager
、scheduler
或 etcd
键下的任何更改都必须反映在控制平面节点上 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 控制平面组件的名称(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 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 可能会覆盖在集群创建后应用的配置(重新配置)。
持久化 Node 对象重新配置
kubeadm 在特定 Kubernetes 节点的 Node 对象上写入 Labels、Taints、CRI socket 和其他信息。要更改此 Node 对象的任何内容,你可以使用
kubectl edit no <node-name>
在 kubeadm upgrade
期间,此类 Node 的内容可能会被覆盖。如果你希望在升级后持久化对 Node 对象的修改,可以准备一个 kubectl patch 并将其应用到 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。