重新配置 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 将控制平面组件作为位于 /etc/kubernetes/manifests 目录中的静态 Pod 清单进行管理。对 ClusterConfiguration 下的 apiServer、controllerManager、scheduler 或 etcd 键所做的任何更改都必须反映在控制平面节点上清单目录中的相应文件中。
这些更改可能包括
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 控制平面组件的名称(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-configConfigMap 内容下载到本地文件/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 命名空间中的 ConfigMap,名为 kube-proxy。
此 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 部署和 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 部署
kubectl rollout restart deployment -n kube-system coredns
说明
kubeadm 不允许在集群创建和升级期间进行 CoreDNS 配置。这意味着如果你执行kubeadm upgrade apply,你对 CoreDNS 对象所做的更改将会丢失并必须重新应用。持久化重新配置
在托管节点上执行 kubeadm upgrade 时,kubeadm 可能会覆盖在集群创建后应用(重新配置)的配置。
持久化节点对象重新配置
kubeadm 将标签、污点、CRI socket 和其他信息写入特定 Kubernetes 节点的 Node 对象。要更改此 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。