diff --git a/content/zh-cn/docs/reference/setup-tools/kubeadm/implementation-details.md b/content/zh-cn/docs/reference/setup-tools/kubeadm/implementation-details.md index c5b0ad0c6b..8dc3bc26b7 100644 --- a/content/zh-cn/docs/reference/setup-tools/kubeadm/implementation-details.md +++ b/content/zh-cn/docs/reference/setup-tools/kubeadm/implementation-details.md @@ -65,7 +65,7 @@ The cluster that `kubeadm init` and `kubeadm join` set up should be: - **User-friendly**: The user should not have to run anything more than a couple of commands: - `kubeadm init` - `export KUBECONFIG=/etc/kubernetes/admin.conf` - - `kubectl apply -f ` + - `kubectl apply -f ` - `kubeadm join --token :` - **Extendable**: - It should _not_ favor any particular network provider. Configuring the cluster network is out-of-scope @@ -74,7 +74,7 @@ The cluster that `kubeadm init` and `kubeadm join` set up should be: - **用户友好**:用户只需要运行几个命令即可: - `kubeadm init` - `export KUBECONFIG=/etc/kubernetes/admin.conf` - - `kubectl apply -f <所选网络.yaml>` + - `kubectl apply -f <所选网络插件.yaml>` - `kubeadm join --token <令牌> <端点>:<端口>` - **可扩展的**: - **不**应偏向任何特定的网络提供商,不涉及配置集群网络 @@ -147,6 +147,41 @@ Kubernetes 目录 `/etc/kubernetes` 在应用程序中是一个常量, - `front-proxy-ca.crt`、`front-proxy-ca.key` 用于前端代理证书颁发机构 - `front-proxy-client.crt`、`front-proxy-client.key` 用于前端代理客户端 + +## kubeadm 配置文件格式 + +大多数 kubeadm 命令支持 `--config` 标志,允许将磁盘上的配置文件传递给命令。 +配置文件格式遵循常见的 Kubernetes API `apiVersion` / `kind` 方案, +但被视为组件配置格式。包括 kubelet 在内的几个 Kubernetes 组件也支持基于文件的配置。 + + +不同的 kubeadm 子命令需要不同 `kind` 的配置文件。 +例如,`kubeadm init` 需要 `InitConfiguration`,`kubeadm join` 需要 `JoinConfiguration`, +`kubeadm upgrade` 需要 `UpgradeConfiguration`,而 `kubeadm reset` 需要 `ResetConfiguration`。 + + +命令 `kubeadm config migrate` 可用于将旧格式的配置文件迁移到更新(当前)的配置格式。 +kubeadm 工具仅支持从已弃用的配置格式迁移到当前格式。 + +更多详情,请参阅 [kubeadm 配置参考](/zh-cn/docs/reference/config-api/kubeadm-config.v1beta4/)页面。 + @@ -218,20 +253,20 @@ kubeadm 在启动 init 之前执行一组预检,目的是验证先决条件并 - [Error] if API server bindPort or ports 10250/10251/10252 are used - [Error] if `/etc/kubernetes/manifest` folder already exists and it is not empty - [Error] if swap is on -- [Error] if `conntrack`, `ip`, `iptables`, `mount`, `nsenter` commands are not present in the command path +- [Error] if `ip`, `iptables`, `mount`, `nsenter` commands are not present in the command path --> - [错误] 如果 API 服务器绑定的端口或 10250/10251/10252 端口已被占用 - [错误] 如果 `/etc/kubernetes/manifest` 文件夹已经存在并且不为空 - [错误] 如果启用了交换分区 -- [错误] 如果命令路径中没有 `conntrack`、`ip`、`iptables`、`mount`、`nsenter` 命令 +- [错误] 如果命令路径中没有 `ip`、`iptables`、`mount`、`nsenter` 命令 -- [警告] 如果命令路径中没有 `ebtables`、`ethtool`、`socat`、`tc`、`touch`、`crictl` 命令 +- [警告] 如果命令路径中没有 `ethtool`、`tc`、`touch` 命令 - [警告] 如果 API 服务器、控制器管理器、调度程序的其他参数标志包含一些无效选项 - [警告] 如果与 https://API.AdvertiseAddress:API.BindPort 的连接通过代理 - [警告] 如果服务子网的连接通过代理(仅检查第一个地址) @@ -391,7 +426,7 @@ kubeadm 生成具有用于控制平面组件身份标识的 kubeconfig 文件: -请注意: +你可以运行 [`kubeadm kubeconfig user`](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-kubeconfig/#cmd-kubeconfig-user) +来为额外的用户生成 kubeconfig 文件。 + +{{< caution >}} + +生成的配置文件包含嵌入的认证密钥,你应当将其视为机密内容。 +{{< /caution >}} + + +另外请注意: - 如果指定了外部 etcd 服务器,则应指定 `etcd-servers` 地址和相关的 TLS 设置 (`etcd-cafile`、`etcd-certfile`、`etcd-keyfile`); 如果未提供外部 etcd 服务器,则将使用本地 etcd(通过主机网络) -- 如果指定了云提供商,则配置相应的 `--cloud-provider` 参数,如果该路径存在,则配置 `--cloud-config` - (这是实验性的,是 Alpha 版本,将在以后的版本中删除) - 如果指定了云提供商,则指定相应的 `--cloud-provider`,如果存在这样的配置文件, - 则指定 `--cloud-config` 路径(此为试验性功能,是 Alpha 版本,将在以后的版本中删除)。 + 则指定 `--cloud-config` 路径(此为试验性特性,是 Alpha 版本,将在以后的版本中删除)。 #### 调度器 {#scheduler} @@ -830,21 +875,15 @@ Please note that: ### 等待控制平面启动 {#wait-for-the-control-plane-to-come-up} -kubeadm 等待(最多 4m0s),直到 `localhost:6443/healthz`(kube-apiserver 存活)返回 `ok`。 -但是为了检测死锁条件,如果 `localhost:10255/healthz`(kubelet 存活)或 -`localhost:10255/healthz/syncloop`(kubelet 就绪)未能在 40s 和 60s 内未返回 `ok`, -则 kubeadm 会快速失败。 +On control plane nodes, kubeadm waits up to 4 minutes for the control plane components +and the kubelet to be available. It does that by performing a health check on the respective +component `/healthz` or `/livez` endpoints. - -kubeadm 依靠 kubelet 拉取控制平面镜像并将其作为静态 Pod 正确运行。 +在控制平面节点上,kubeadm 会等待最多4分钟,以确保控制平面组件和 kubelet 可用。 +它通过检查相应组件的 `/healthz` 或 `/livez` 端点来进行健康检查。 + 控制平面启动后,kubeadm 将完成以下段落中描述的任务。 -- CoreDNS Service 的名称为 `kube-dns`。 - 这样做是为了防止当用户通过[此处](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon)描述的 - `--config` 方法将集群 DNS 从 kube-dns 切换到 CoreDNS 时出现服务中断。 +- 出于与旧版 `kube-dns` 插件的兼容性考虑,CoreDNS 服务被命名为 `kube-dns`。 - 在 `kube-system` 名字空间中创建 CoreDNS 的 ServiceAccount @@ -1146,11 +1182,11 @@ atomic work tasks to perform. 与 `kubeadm init` 类似,`kubeadm join` 内部工作流由一系列待执行的原子工作任务组成。 -这分为发现(让该节点信任 Kubernetes 的主控节点)和 TLS 引导 -(让 Kubernetes 的主控节点信任该节点)。 +工作流分为发现(让该节点信任 Kubernetes 的 API 服务器)和 TLS 引导 +(让 Kubernetes 的 API 服务器信任该节点)等步骤。 -请注意: +另外请注意: -1. `kubeadm join` 预检基本上是 `kubeadm init` 预检的一个子集。 -2. 从 1.24 开始,kubeadm 使用 crictl 与所有已知的 CRI 端点进行通信。 -3. 从 1.9 开始,kubeadm 支持加入在 Windows 上运行的节点;在这种情况下, - 将跳过 Linux 特定的控制参数。 -4. 在任何情况下,用户都可以通过 `--ignore-preflight-errors` +1. 如果你要加入一个 Windows 节点,工作流将跳过特定于 Linux 的一些控制设置。 +2. 在任何情况下,用户都可以通过 `--ignore-preflight-errors` 选项跳过特定的预检(或者进而跳过所有预检)。 -通过设置 `--discovery-token-unsafe-skip-ca-verification` 标志可以跳过公钥验证; -这样做会削弱 kubeadm 安全模型,因为其他人可能冒充 Kubernetes 主控节点。 +你可以通过在命令行上指定 `--discovery-token-unsafe-skip-ca-verification` +标志来跳过 CA 验证。这会削弱 kubeadm 的安全模型,因为其他人可能冒充 Kubernetes API 服务器。 {{< /note >}} +## kubeadm 升级工作流的内部设计 + +`kubeadm upgrade` 包含若干子命令,用来处理由 kubeadm 创建的 Kubernetes 集群的升级。 +你必须在控制平面节点上运行 `kubeadm upgrade apply`(你可以选择使用哪个节点),以启动升级过程。 +然后,在所有剩余节点(包括工作节点和控制平面节点)上运行 `kubeadm upgrade node`。 + + +`kubeadm upgrade apply` 和 `kubeadm upgrade node` 都有一个 `phase` 子命令, +用于提供对升级过程内部阶段的访问。更多详情,请参阅 +[`kubeadm upgrade phase`](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-upgrade-phase/)。 + +额外的实用升级命令包括 `kubeadm upgrade plan` 和 `kubeadm upgrade diff`。 + +所有升级子命令都支持传递配置文件。 + + +### kubeadm upgrade plan + +你可以选择在运行 `kubeadm upgrade apply` 之前运行 `kubeadm upgrade plan`。 +`plan` 子命令会检查有哪些版本可以用来升级,并验证你当前的集群是否可升级。 + + +### kubeadm upgrade diff + +这条命令会显示将对控制平面节点的现有静态 Pod 清单作哪些修改。 +获得更详细信息的一种做法是运行 `kubeadm upgrade apply --dry-run` +或 `kubeadm upgrade node --dry-run`。 + + +### kubeadm upgrade apply + +`kubeadm upgrade apply` 为所有节点的升级做准备,同时也会升级运行此命令时所在的控制平面节点。 +它所执行的步骤包括: + + +- 类似于 `kubeadm init` 和 `kubeadm join`,运行预检操作,确保容器镜像已被下载且集群处于可升级的良好状态。 +- 升级位于磁盘上 `/etc/kubernetes/manifests` 的控制平面清单文件,并在文件发生更改时等待 kubelet 重启组件。 +- 将更新的 kubeadm 和 kubelet 配置上传到 `kubeadm-config` 和 `kubelet-config` ConfigMap + 中(都在 `kube-system` 命名空间内)。 +- 在 `/var/lib/kubelet/config.yaml` 中为此节点写入更新的 kubelet 配置。 +- 配置引导令牌和 `cluster-info` ConfigMap 以用于 RBAC 规则。这一操作与 `kubeadm init` + 阶段相同,确保集群继续支持使用引导令牌加入的节点。 +- 如果集群中所有现有的 kube-apiserver 已经升级到目标版本,则根据情况升级 kube-proxy 和 CoreDNS 插件。 +- 执行所有剩下的升级后任务,例如清理特定发布版本中废弃的功能。 + + +### kubeadm upgrade node + +`kubeadm upgrade node` 在集群升级启动后(通过运行 `kubeadm upgrade apply`)升级单个控制平面或工作节点。 +此命令通过检查文件 `/etc/kubernetes/manifests/kube-apiserver.yaml` 是否存在来检测节点是否为控制平面节点。 +如果找到该文件,kubeadm 工具会推断此节点上正在运行 kube-apiserver Pod。 + + +- 类似于 `kubeadm upgrade apply`,运行预检操作。 +- 对于控制平面节点,升级位于磁盘上 `/etc/kubernetes/manifests` 的控制平面清单文件, + 并在文件发生更改时等待 kubelet 重启组件。 +- 在 `/var/lib/kubelet/config.yaml` 中为此节点写入更新的 kubelet 配置。 +- (针对控制平面节点)如果集群中所有现有的 API 服务器已经升级到目标版本,则根据情况升级 + kube-proxy 和 CoreDNS {{< glossary_tooltip text="插件" term_id="addons" >}}。 +- 执行剩下的所有升级后任务,例如清理特定发布版本中废弃的特性。 + + +## kubeadm reset 工作流的内部设计 + +你可以在之前执行过 kubeadm 命令的节点上使用 `kubeadm reset` 子命令。 +此子命令对节点执行**尽力而为**的清理。如果某些操作失败,你必须介入并执行手动清理。 + + +此命令支持多个阶段。更多详情,请参阅 +[`kubeadm reset phase`](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-reset-phase/)。 + +此命令支持配置文件。 + +另外: + +- IPVS、iptables 和 nftables 规则**不会**被清理。 +- CNI(网络插件)配置**不会**被清理。 +- 用户主目录下的 `.kube/` 文件夹**不会**被清理。 + + +此命令包含以下阶段: + +- 在节点上运行预检操作,以确定其是否健康。 +- 对于控制平面节点,移除本地 etcd 成员的所有数据。 +- 停止 kubelet。 +- 停止运行中的容器。 +- 卸载 `/var/lib/kubelet` 中挂载的任何目录。 +- 删除 `/var/lib/kubelet` 和 `/etc/kubernetes` 中由 kubeadm 管理的所有文件和目录。