diff --git a/content/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-reconfigure.md b/content/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-reconfigure.md new file mode 100644 index 0000000000..a9af9c080c --- /dev/null +++ b/content/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-reconfigure.md @@ -0,0 +1,509 @@ +--- +title: 重新配置 kubeadm 集群 +content_type: task +weight: 10 +--- + + + + +kubeadm 不支持自动重新配置部署在托管节点上的组件的方式。 +一种自动化的方法是使用自定义的 +[operator](/zh/docs/concepts/extend-kubernetes/operator/)。 + + +要修改组件配置,你必须手动编辑磁盘上关联的集群对象和文件。 +本指南展示了实现 kubeadm 集群重新配置所需执行的正确步骤顺序。 + +## {{% heading "prerequisites" %}} + + +- 你需要一个使用 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 +``` + +{{< note >}} + +保存对这些集群对象的任何更改后,节点上运行的组件可能不会自动更新。 +以下步骤将指导你如何手动执行该操作。 +{{< /note >}} + +{{< warning >}} + + +ConfigMaps 中的组件配置存储为非结构化数据(YAML 字符串)。 这意味着在更新 +ConfigMap 的内容时不会执行验证。 你必须小心遵循特定组件配置的文档化 API 格式, +并避免引入拼写错误和 YAML 缩进错误。 +{{< /warning >}} + + +### 应用集群配置更改 + +#### 更新 `ClusterConfiguration` + +在集群创建和升级期间,kubeadm 将其 +[`ClusterConfiguration`](/zh/docs/reference/config-api/kubeadm-config.v1beta3/) +写入 `kube-system` 命名空间中名为 `kubeadm-config` 的 ConfigMap。 + +要更改 `ClusterConfiguration` 中的特定选项,你可以使用以下命令编辑 ConfigMap: + +```shell +kubectl edit cm -n kube-system kubeadm-config +``` + +配置位于 `data.ClusterConfiguration` 键下。 + +{{< note >}} + +`ClusterConfiguration` 包括各种影响单个组件配置的选项, 例如 +kube-apiserver、kube-scheduler、kube-controller-manager、 +CoreDNS、etcd 和 kube-proxy。 对配置的更改必须手动反映在节点组件上。 +{{< /note >}} + + +#### 在控制平面节点上反映 `ClusterConfiguration` 更改 + +kubeadm 将控制平面组件作为位于 `/etc/kubernetes/manifests` +目录中的静态 Pod 清单进行管理。 +对 `apiServer`、`controllerManager`、`scheduler` 或 `etcd`键下的 +`ClusterConfiguration` 的任何更改都必须反映在控制平面节点上清单目录中的关联文件中。 + + + +此类更改可能包括: +- `extraArgs` - 需要更新传递给组件容器的标志列表 +- `extraMounts` - 需要更新组件容器的卷挂载 +- `*SANs` - 需要使用更新的主题备用名称编写新证书 + +在继续进行这些更改之前,请确保你已备份目录 `/etc/kubernetes/`。 + + + +要编写新证书,你可以使用: + +```shell +kubeadm init phase certs --config +``` + +要在 `/etc/kubernetes/manifests` 中编写新的清单文件,你可以使用: + +```shell +kubeadm init phase control-plane --config +``` + + +`` 内容必须与更新后的 `ClusterConfiguration` 匹配。 +`` 值必须是组件的名称。 + +{{< note >}} + +更新 `/etc/kubernetes/manifests` 中的文件将告诉 kubelet 重新启动相应组件的静态 Pod。 +尝试一次对一个节点进行这些更改,以在不停机的情况下离开集群。 +{{< /note >}} + + +### 应用 kubelet 配置更改 + +#### 更新 `KubeletConfiguration` + +在集群创建和升级期间,kubeadm 将其 +[`KubeletConfiguration`](/zh/docs/reference/config-api/kubelet-config.v1beta1/) +写入 `kube-system` 命名空间中名为 `kubelet-config` 的 ConfigMap。 +你可以使用以下命令编辑 ConfigMap: + +```shell +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.conf` +- 编辑文件 `/var/lib/kubelet/kubeadm-flags.env` 以使用标志来应用额外的配置 +- 使用 `systemctl restart kubelet` 重启 kubelet 服务 + +{{< note >}} + +一次执行一个节点的这些更改,以允许正确地重新安排工作负载。 +{{< /note >}} + +{{< note >}} + +在 `kubeadm upgrade` 期间,kubeadm 从 `kubelet-config` ConfigMap +下载 `KubeletConfiguration` 并覆盖 `/var/lib/kubelet/config.conf` 的内容。 +这意味着节点本地配置必须通过`/var/lib/kubelet/kubeadm-flags.env`中的标志或在 +kubeadm upgrade` 后手动更新`/var/lib/kubelet/config.conf`的内容来应用,然后重新启动 kubelet。 +{{< /note >}} + + +### 应用 kube-proxy 配置更改 + +#### 更新 `KubeProxyConfiguration` + +在集群创建和升级期间,kubeadm 将其写入 +[`KubeProxyConfiguration`](/zh/docs/reference/config-api/kube-proxy-config.v1alpha1/) +在名为 `kube-proxy` 的 `kube-system` 命名空间中的 ConfigMap 中。 + +此 ConfigMap 由 `kube-system` 命名空间中的 `kube-proxy` DaemonSet 使用。 + +要更改 `KubeProxyConfiguration` 中的特定选项,你可以使用以下命令编辑 ConfigMap: + +```shell +kubectl edit cm -n kube-system kube-proxy +``` + +配置位于 `data.config.conf` 键下。 + + +#### 反映 kube-proxy 的更改 + +更新 `kube-proxy` ConfigMap 后,你可以重新启动所有 kube-proxy Pod: + +获取 Pod 名称: + +```shell +kubectl get po -n kube-system | grep kube-proxy +``` + +使用以下命令删除 Pod: + +```shell +kubectl delete po -n kube-system +``` + +将创建使用更新的 ConfigMap 的新 Pod。 + +{{< note >}} + +由于 kubeadm 将 kube-proxy 部署为 DaemonSet,因此不支持特定于节点的配置。 +{{< /note >}} + + +### 应用 CoreDNS 配置更改 + +#### 更新 CoreDNS 的 Deployment 和 Service + +kubeadm 将 CoreDNS 部署为名为 `coredns` 的 Deployment,并使用 Service `kube-dns`, +两者都在 `kube-system` 命名空间中。 + +要更新任何 CoreDNS 设置,你可以编辑 Deployment 和 Service: + + +```shell +kubectl edit deployment -n kube-system coredns +kubectl edit service -n kube-system kube-dns +``` + + +#### 反映 CoreDNS 的更改 + +应用 CoreDNS 更改后,你可以删除 CoreDNS Pod。 + +获取 Pod 名称: + +```shell +kubectl get po -n kube-system | grep coredns +``` + +使用以下命令删除 Pod: + +```shell +kubectl delete po -n kube-system +``` + + +将创建具有更新的 CoreDNS 配置的新 Pod。 + +{{< note >}} + +kubeadm 不允许在集群创建和升级期间配置 CoreDNS。 +这意味着如果执行了 `kubeadm upgrade apply`,你对 +CoreDNS 对象的更改将丢失并且必须重新应用。 +{{< /note >}} + + +## 持久化重新配置 + +在受管节点上执行 `kubeadm upgrade` 期间,kubeadm +可能会覆盖在创建集群(重新配置)后应用的配置。 + + +### 持久化 Node 对象重新配置 + +kubeadm 在特定 Kubernetes 节点的 Node 对象上写入标签、污点、CRI +套接字和其他信息。要更改此 Node 对象的任何内容,你可以使用: + +```shell +kubectl edit no +``` + + +在 `kubeadm upgrade` 期间,此类节点的内容可能会被覆盖。 +如果你想在升级后保留对 Node 对象的修改,你可以准备一个 +[kubectl patch](/zh/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/) +并将其应用到 Node 对象: + +```shell +kubectl patch no --patch-file +``` + + +#### 持久化控制平面组件重新配置 + +控制平面配置的主要来源是存储在集群中的 `ClusterConfiguration` 对象。 +要扩展静态 Pod 清单配置,可以使用 +[patches](/zh/docs/setup/production-environment/tools/kubeadm/control-plane-flags/#patches)。 + +这些补丁文件必须作为文件保留在控制平面节点上,以确保它们可以被 +`kubeadm upgrade ... --patches ` 使用。 + +如果对 `ClusterConfiguration` 和磁盘上的静态 Pod 清单进行了重新配置,则必须相应地更新节点特定补丁集。 + + +#### 持久化 kubelet 重新配置 + +对存储在 `/var/lib/kubelet/config.conf` 中的 `KubeletConfiguration` +所做的任何更改都将在 `kubeadm upgrade` 时因为下载集群范围内的 `kubelet-config` +ConfigMap 的内容而被覆盖。 +要持久保存 kubelet 节点特定的配置,文件`/var/lib/kubelet/config.conf` +必须在升级后手动更新,或者文件`/var/lib/kubelet/kubeadm-flags.env` 可以包含标志。 +kubelet 标志会覆盖相关的 `KubeletConfiguration` 选项,但请注意,有些标志已被弃用。 + +更改 `/var/lib/kubelet/config.conf` 或 `/var/lib/kubelet/kubeadm-flags.env` +后需要重启 kubelet。 + +{{% heading "whatsnext" %}} + + + +- [升级 kubeadm 集群](/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade) +- [使用 kubeadm API 自定义组件](/zh/docs/setup/production-environment/tools/kubeadm/control-plane-flags) +- [使用 kubeadm 管理证书](/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-certs) \ No newline at end of file