重新配置 kubeadm 集群
kubeadm 不支持自动化方式重新配置部署在托管节点上的组件。一种自动化此过程的方式是使用自定义操作器。
要修改组件配置,你必须手动编辑相关的集群对象和磁盘上的文件。
本指南展示了实现 kubeadm 集群重新配置所需的正确步骤顺序。
准备工作
- 你需要一个使用 kubeadm 部署的集群。
- 拥有管理员凭据 (
/etc/kubernetes/admin.conf) 以及从安装了 kubectl 的主机到集群中正在运行的 kube-apiserver 的网络连接。 - 所有主机上都安装了文本编辑器。
重新配置集群
kubeadm 将一系列集群范围的组件配置选项写入 ConfigMaps 和其他对象。这些对象必须手动编辑。可以使用命令 kubectl edit 来完成。
kubectl edit 命令将打开一个文本编辑器,你可以在其中直接编辑和保存对象。
你可以使用环境变量 KUBECONFIG 和 KUBE_EDITOR 来指定 kubectl 所使用的 kubeconfig 文件的位置和首选的文本编辑器。
例如
KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>
注意
保存对这些集群对象的任何更改后,节点上运行的组件可能不会自动更新。以下步骤指导你如何手动执行此操作。警告
ConfigMaps 中的组件配置存储为非结构化数据 (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-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 的内容。这意味着节点本地配置必须在 kubeadm upgrade 后通过 /var/lib/kubelet/kubeadm-flags.env 中的标志或手动更新 /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 Pods
使用以下命令删除 Pods:
kubectl delete po -n kube-system -l k8s-app=kube-proxy
将创建使用更新后的 ConfigMap 的新 Pods。
注意
由于 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 可能会覆盖集群创建后应用的配置(重新配置)。
持久化节点对象重新配置
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。