重新配置 kubeadm 集群
kubeadm 不支持自动重新配置部署在托管节点上的组件的方式。一种自动化方法是使用自定义 operator.
要修改组件配置,您必须手动编辑磁盘上的相关集群对象和文件。
本指南展示了实现 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 将控制平面组件作为位于 /etc/kubernetes/manifests
目录中的静态 Pod 清单进行管理。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 中。
此 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 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 部署和服务
kubeadm 将 CoreDNS 部署为名为 coredns
的部署,并使用名为 kube-dns
的服务,两者都在 kube-system
命名空间中。
要更新任何 CoreDNS 设置,您可以编辑部署和服务对象
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 可能会覆盖在集群创建后(重新配置)应用的配置。
持续节点对象重新配置
kubeadm 会在特定 Kubernetes 节点的节点对象上写入标签、污点、CRI 套接字和其他信息。要更改此节点对象的任何内容,您可以使用
kubectl edit no <node-name>
在 kubeadm upgrade
期间,此类节点的内容可能会被覆盖。如果您希望在升级后持续修改节点对象,您可以准备一个 kubectl patch 并将其应用于节点对象
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。