kubeadm 不支持自动重新配置已在受管节点上部署的组件。实现此自动化的一种方法是使用自定义 Operator。
要修改组件配置,必须手动编辑相关的集群对象以及磁盘上的文件。
本指南介绍了执行 kubeadm 集群重新配置所需执行的正确步骤序列。
/etc/kubernetes/admin.conf),并且从安装有 kubectl 的主机可以连接到集群中正在运行的 kube-apiserverkubeadm 将一系列集群范围的组件配置选项写入 ConfigMap 和其他对象中。这些对象必须手动编辑。可以使用 kubectl edit 命令来完成此操作。
kubectl edit 命令将打开一个文本编辑器,你可以直接在该编辑器中编辑并保存对象。
你可以使用环境变量 KUBECONFIG 和 KUBE_EDITOR 来指定 kubectl 所使用的 kubeconfig 文件路径以及首选的文本编辑器。
例如
KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>
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 - 需要编写带有更新后的使用者备用名称(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。请尝试一次在一台节点上进行这些更改,以使集群保持运行且无停机时间。KubeletConfiguration在集群创建和升级期间,kubeadm 会将其 KubeletConfiguration 写入 kube-system 命名空间中名为 kubelet-config 的 ConfigMap 中。
你可以使用此命令编辑该 ConfigMap
kubectl edit cm -n kube-system kubelet-config
配置位于 data.kubelet 键下。
要在 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。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 ConfigMap 更新,你就可以重启所有 kube-proxy Pod
使用以下命令删除 Pod
kubectl delete po -n kube-system -l k8s-app=kube-proxy
系统将创建使用已更新 ConfigMap 的新 Pod。
kubeadm 将 CoreDNS 部署为名为 coredns 的 Deployment,并配有一个 kube-dns 服务,两者均位于 kube-system 命名空间中。
要更新 CoreDNS 的任何设置,你可以编辑该 Deployment 和 Service 对象
kubectl edit deployment -n kube-system coredns
kubectl edit service -n kube-system kube-dns
一旦应用了 CoreDNS 的更改,你就可以重启 CoreDNS 部署
kubectl rollout restart deployment -n kube-system coredns
kubeadm upgrade apply,你对 CoreDNS 对象所做的更改将会丢失,必须重新应用。在受管节点上执行 kubeadm upgrade 期间,kubeadm 可能会覆盖在集群创建之后应用的配置(重配置)。
kubeadm 会将标签、污点、CRI 套接字和其他信息写入特定 Kubernetes 节点的节点对象上。要更改此节点对象的任何内容,你可以使用
kubectl edit no <node-name>
在 kubeadm upgrade 期间,此类节点的内容可能会被覆盖。如果你希望在升级后持久保留对节点对象的修改,你可以准备一个 kubectl patch 并将其应用到节点对象上
kubectl patch no <node-name> --patch-file <patch-file>
控制平面配置的主要来源是存储在集群中的 ClusterConfiguration 对象。要扩展静态 Pod 清单配置,可以使用 补丁(patches)。
这些补丁文件必须保留在控制平面节点上,以确保它们可供 kubeadm upgrade ... --patches <directory> 使用。
如果对 ClusterConfiguration 和磁盘上的静态 Pod 清单进行了重配置,则必须相应地更新节点特定的补丁集。
存储在 /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。