重新配置 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
键的任何更改都必须反映在控制平面节点清单目录中的相关文件中。
此类更改可能包括
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 中。
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 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 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 可能会覆盖在创建集群后应用的配置(重新配置)。
持久化 Node 对象重新配置
kubeadm 在特定 Kubernetes 节点的 Node 对象上写入标签、污点、CRI 套接字和其他信息。要更改此 Node 对象的任何内容,您可以使用
kubectl edit no <node-name>
在 kubeadm upgrade
期间,此类 Node 的内容可能会被覆盖。如果您希望在升级后保留对 Node 对象所做的修改,您可以准备一个 kubectl patch 并将其应用于 Node 对象
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。