重新配置 kubeadm 集群
kubeadm 不支持以自动化方式重新配置部署在托管节点上的组件。一种自动化的方法是使用自定义 操作器。
要修改组件配置,您必须手动编辑磁盘上关联的集群对象和文件。
本指南展示了实现 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
中。对 apiServer
、controllerManager
、scheduler
或 etcd
键下的 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 控制平面组件的名称(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 get po -n kube-system | grep kube-proxy
使用以下命令删除 Pod
kubectl delete po -n kube-system <pod-name>
将创建使用更新后的 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 补丁 并将其应用于 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。