From 040c03124e035335b83b2102c875872120655e36 Mon Sep 17 00:00:00 2001 From: windsonsea Date: Tue, 7 May 2024 18:19:01 +0800 Subject: [PATCH] [zh] Sync kubeadm/implementation-details.md --- .../kubeadm/implementation-details.md | 337 ++++++++---------- 1 file changed, 150 insertions(+), 187 deletions(-) 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 c7059200ef..c5b0ad0c6b 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 @@ -17,17 +17,17 @@ weight: 100 {{< feature-state for_k8s_version="v1.10" state="stable" >}} -`kubeadm init` 和 `kubeadm join` 结合在一起提供了良好的用户体验, -因为从头开始创建实践最佳而配置最基本的 Kubernetes 集群。 +`kubeadm init` 和 `kubeadm join` 结合在一起为从头开始创建最基本的 Kubernetes +集群提供了良好的用户体验,这与最佳实践一致。 但是,kubeadm **如何**做到这一点可能并不明显。 本文档提供了更多幕后的详细信息,旨在分享有关 Kubernetes 集群最佳实践的知识。 @@ -38,7 +38,9 @@ knowledge on Kubernetes cluster best practices. --> ## 核心设计原则 {#core-design-principles} - + `kubeadm init` 和 `kubeadm join` 设置的集群该是: Kubernetes 目录 `/etc/kubernetes` 在应用程序中是一个常量, 因为在大多数情况下它显然是给定的路径,并且是最直观的位置;其他路径常量和文件名有: - `/etc/kubernetes/manifests` 作为 kubelet 查找静态 Pod 清单的路径。静态 Pod 清单的名称为: @@ -151,9 +153,8 @@ Kubernetes 目录 `/etc/kubernetes` 在应用程序中是一个常量, ## kubeadm init 工作流程内部设计 {#kubeadm-init-workflow-internal-design} `kubeadm init` [内部工作流程](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/#init-workflow) 包含一系列要执行的原子性工作任务,如 `kubeadm init` 中所述。 @@ -182,13 +183,13 @@ kubeadm 在启动 init 之前执行一组预检,目的是验证先决条件并 用户可以使用 `--ignore-preflight-errors` 选项跳过特定的预检或全部检查。 - [警告] 如果要使用的 Kubernetes 版本(由 `--kubernetes-version` 标志指定)比 kubeadm CLI 版本至少高一个小版本。 @@ -198,13 +199,13 @@ kubeadm 在启动 init 之前执行一组预检,目的是验证先决条件并 - [错误] 如果未设置所需的 Cgroups 子系统 - [错误] 如果 CRI 端点未应答 - [错误] 如果用户不是 root 用户 - [错误] 如果机器主机名不是有效的 DNS 子域 @@ -214,7 +215,7 @@ kubeadm 在启动 init 之前执行一组预检,目的是验证先决条件并 - [警告] 如果 kubelet 服务不存在或已被禁用 - [警告] 如果 firewalld 处于活动状态 - [警告] 如果命令路径中没有 `ebtables`、`ethtool`、`socat`、`tc`、`touch`、`crictl` 命令 - [警告] 如果 API 服务器、控制器管理器、调度程序的其他参数标志包含一些无效选项 @@ -258,18 +259,15 @@ kubeadm 在启动 init 之前执行一组预检,目的是验证先决条件并 - 如果授权方式为 Webhook - [错误] 如果 webhook_authz.conf 不存在 +{{< note >}} -请注意: - - -1. 可以使用 [`kubeadm init phase preflight`](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-preflight) - 命令单独触发预检。 +可以使用 [`kubeadm init phase preflight`](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-preflight) +命令单独触发预检。 +{{< /note >}} - 用于前端代理的证书颁发机构保存到 `front-proxy-ca.crt` 文件中,私钥保存到 @@ -351,12 +349,12 @@ Please note that: 请注意: 1. 如果证书和私钥对都存在,并且其内容经过评估符合上述规范,将使用现有文件, @@ -368,11 +366,10 @@ Please note that: 而不提供 `ca.key` 文件。 kubeadm 能够识别出这种情况并启用 ExternalCA,这也意味着了控制器管理器中的 `csrsigner` 控制器将不会启动。 ---> @@ -394,10 +391,10 @@ kubeadm 生成具有用于控制平面组件身份标识的 kubeconfig 文件: @@ -426,7 +423,7 @@ kubeadm 生成具有用于控制平面组件身份标识的 kubeconfig 文件: - 调度器的 kubeconfig 文件 —— `/etc/kubernetes/scheduler.conf`; @@ -440,7 +437,7 @@ in `/etc/kubernetes/admin.conf`. This file includes a certificate with `Subject: O = kubeadm:cluster-admins, CN = kubernetes-admin`. `kubeadm:cluster-admins` is a group managed by kubeadm. It is bound to the `cluster-admin` ClusterRole during `kubeadm init`, by using the `super-admin.conf` file, which does not require RBAC. -This `admin.conf` file must remain on control plane nodes and not be shared with additional users. +This `admin.conf` file must remain on control plane nodes and should not be shared with additional users. --> 此外,还会生成将 kubeadm 作为管理实体的 kubeconfig 文件并将其保存到 `/etc/kubernetes/admin.conf` 中。 该文件包含一个带有 `Subject: O = kubeadm:cluster-admins, CN = kubernetes-admin` @@ -452,9 +449,9 @@ This `admin.conf` file must remain on control plane nodes and not be shared with 在 `kubeadm init` 期间,会生成另一个 kubeconfig 文件并将其存储在 `/etc/kubernetes/super-admin.conf` 中。 该文件包含一个带有 `Subject: O = system:masters, CN = kubernetes-super-admin` 的证书。 @@ -464,23 +461,25 @@ The `super-admin.conf` file can be stored in a safe location and not shared with 有关 RBAC 和内置 ClusterRoles 和组的其他信息, 请参阅[面向用户的 RBAC 角色绑定](/zh-cn/docs/reference/access-authn-authz/rbac/#user-facing-roles)。 - + 请注意: 1. `ca.crt` 证书内嵌在所有 kubeconfig 文件中。 @@ -500,12 +499,14 @@ for additional information RBAC and built-in ClusterRoles and groups. kubeadm 将用于控制平面组件的静态 Pod 清单文件写入 `/etc/kubernetes/manifests` 目录。 kubelet 启动后会监视这个目录以便创建 Pod。 - + 静态 Pod 清单有一些共同的属性: - 所有静态 Pod 都部署在 `kube-system` 名字空间 - 所有静态 Pod 都打上 `tier:control-plane` 和 `component:{组件名称}` 标签 @@ -524,7 +525,7 @@ kubelet 启动后会监视这个目录以便创建 Pod。 - 所有静态 Pod 都设置了 `hostNetwork:true`,使得控制平面在配置网络之前启动;结果导致: * 控制器管理器和调度器用来调用 API 服务器的地址为 `127.0.0.1` - * 如果使用本地 etcd 服务器,则 `etcd-servers` 地址将设置为 `127.0.0.1:2379` + * 如果在本地设置 etcd 服务器,`etcd-servers` 地址将被设置为 `127.0.0.1:2379` #### API 服务器 {#api-server} @@ -570,7 +571,7 @@ API 服务器的静态 Pod 清单会受到用户提供的以下参数的影响 - 要绑定的 `apiserver-advertise-address` 和 `apiserver-bind-port`; @@ -579,15 +580,15 @@ API 服务器的静态 Pod 清单会受到用户提供的以下参数的影响 - 如果指定了外部 etcd 服务器,则应指定 `etcd-servers` 地址和相关的 TLS 设置 (`etcd-cafile`、`etcd-certfile`、`etcd-keyfile`); 如果未提供外部 etcd 服务器,则将使用本地 etcd(通过主机网络) -- 如果指定了云提供商,则配置相应的 `--cloud-provider`,如果该路径存在,则配置 `--cloud-config` +- 如果指定了云提供商,则配置相应的 `--cloud-provider` 参数,如果该路径存在,则配置 `--cloud-config` (这是实验性的,是 Alpha 版本,将在以后的版本中删除) @@ -732,8 +733,8 @@ the users: - 根据给定 CIDR 设置 `--cluster-cidr` 和 `--node-cidr-mask-size` 标志 - 如果指定了云提供商,则指定相应的 `--cloud-provider`,如果存在这样的配置文件, @@ -746,8 +747,8 @@ Other flags that are set unconditionally are: @@ -757,7 +758,6 @@ Other flags that are set unconditionally are: - `--use-service-account-credentials` 设为 `true` - #### 调度器 {#scheduler} @@ -788,7 +788,7 @@ The static Pod manifest for the scheduler is not affected by parameters provided ### 为本地 etcd 生成静态 Pod 清单 {#generate-static-pod-manifest-for-local-etcd} 如果你指定的是外部 etcd,则应跳过此步骤,否则 kubeadm 会生成静态 Pod 清单文件, @@ -812,9 +812,9 @@ Please note that: 1. The etcd container image will be pulled from `registry.gcr.io` by default. See [using custom images](/docs/reference/setup-tools/kubeadm/kubeadm-init/#custom-images) for customizing the image repository. -2. If you run kubeadm in `--dry-run` mode, the etcd static Pod manifest is written +1. If you run kubeadm in `--dry-run` mode, the etcd static Pod manifest is written into a temporary folder. -3. You can directly invoke static Pod manifest generation for local etcd, using the +1. You can directly invoke static Pod manifest generation for local etcd, using the [`kubeadm init phase etcd local`](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-etcd) command. --> @@ -831,7 +831,7 @@ Please note that: @@ -886,7 +886,7 @@ Please note that: ### 将节点标记为控制平面 {#mark-the-node-as-control-plane} 一旦控制平面可用,kubeadm 将执行以下操作: @@ -896,9 +896,6 @@ As soon as the control plane is available, kubeadm executes following actions: Please note that the phase to mark the control-plane phase can be invoked individually with the [`kubeadm init phase mark-control-plane`](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-mark-control-plane) command. - -- Taints the node with `node-role.kubernetes.io/master:NoSchedule` and - `node-role.kubernetes.io/control-plane:NoSchedule` --> - 给节点打上 `node-role.kubernetes.io/control-plane=""` 标签,标记其为控制平面 - 给节点打上 `node-role.kubernetes.io/control-plane:NoSchedule` 污点 @@ -907,23 +904,6 @@ individually with the [`kubeadm init phase mark-control-plane`](/docs/reference/ [`kubeadm init phase mark-control-plane`](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-mark-control-plane) 命令来实现。 -- 给节点打上 `node-role.kubernetes.io/master:NoSchedule` 和 - `node-role.kubernetes.io/control-plane:NoSchedule` 污点 - - -请注意: - - -1. `node-role.kubernetes.io/master` 污点是已废弃的,将会在 kubeadm 1.25 版本中移除 -2. 可以使用 [`kubeadm init phase mark-control-plane`](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-mark-control-plane) - 命令单独触发控制平面标记 - @@ -946,20 +926,17 @@ previous paragraphs. `kubeadm init` 确保为该过程正确配置了所有内容,这包括以下步骤以及设置 API 服务器和控制器标志,如前几段所述。 +{{< note >}} -请注意: - - -1. 可以使用 [`kubeadm init phase bootstrap-token`](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-bootstrap-token) - 命令配置节点的 TLS 引导,执行以下段落中描述的所有配置步骤; - 或者每个步骤都单独触发。 +可以使用 [`kubeadm init phase bootstrap-token`](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-bootstrap-token) +命令配置节点的 TLS 引导,执行以下段落中描述的所有配置步骤; +或者也可以单独执行各个步骤。 +{{< /note >}} `kubeadm init` 创建第一个引导令牌,该令牌是自动生成的或由用户提供的 `--token` 标志的值;如引导令牌规范文档中所述,令牌应保存在 `kube-system` 名字空间下名为 @@ -984,9 +961,9 @@ Please note that: 1. The default token created by `kubeadm init` will be used to validate temporary user during TLS bootstrap process; those users will be member of `system:bootstrappers:kubeadm:default-node-token` group -2. The token has a limited validity, default 24 hours (the interval may be changed with the `—token-ttl` flag) -3. Additional tokens can be created with the [`kubeadm token`](/docs/reference/setup-tools/kubeadm/kubeadm-token/) - command, that provide as well other useful functions for token management. +1. The token has a limited validity, default 24 hours (the interval may be changed with the `—token-ttl` flag) +1. Additional tokens can be created with the [`kubeadm token`](/docs/reference/setup-tools/kubeadm/kubeadm-token/) + command, that provide other useful functions for token management as well. --> 1. 由 `kubeadm init` 创建的默认令牌将用于在 TLS 引导过程中验证临时用户; 这些用户会成为 `system:bootstrappers:kubeadm:default-node-token` 组的成员。 @@ -1000,7 +977,7 @@ Please note that: #### 允许加入的节点调用 CSR API {#allow-joining-nodes-to-call-csr-api} kubeadm 确保 `system:bootstrappers:kubeadm:default-node-token` 组中的用户能够访问证书签名 API。 @@ -1025,7 +1002,7 @@ kubeadm 确保 csrapprover 控制器自动批准引导令牌的 CSR 请求。 这是通过在 `system:bootstrappers:kubeadm:default-node-token` 用户组和 @@ -1044,10 +1021,10 @@ well, granting POST permission to -#### 通过自动批准设置节点证书轮换 {#setup-nodes-certificate-rotation-with-auto-approval} +#### 通过自动批准设置节点证书轮换 {#setup-nodes-certificate-rotation-with-auto-approval} kubeadm 确保节点启用了证书轮换,csrapprover 控制器将自动批准节点的新证书的 CSR 请求。 @@ -1073,27 +1050,24 @@ This phase creates the `cluster-info` ConfigMap in the `kube-public` namespace. 本步骤在 `kube-public` 名字空间中创建名为 `cluster-info` 的 ConfigMap。 另外,它创建一个 Role 和一个 RoleBinding,为未经身份验证的用户授予对 ConfigMap 的访问权限(即 RBAC 组 `system:unauthenticated` 中的用户)。 +{{< note >}} -请注意: - - -1. 对 `cluster-info` ConfigMap 的访问**不受**速率限制。 - 如果你把 API 服务器暴露到外网,这可能是一个问题,也可能不是; - 这里最坏的情况是 DoS 攻击,攻击者使用 kube-apiserver 能够处理的所有动态请求来为 - `cluster-info` ConfigMap 提供服务。 +对 `cluster-info` ConfigMap 的访问**不受**速率限制。 +如果你把 API 服务器暴露到外网,这可能是一个问题,也可能不是; +这里最坏的情况是 DoS 攻击,攻击者使用 kube-apiserver 可处理的所有当前请求来为 +`cluster-info` ConfigMap 提供服务。 +{{< /note >}} kubeadm 通过 API 服务器安装内部 DNS 服务器和 kube-proxy 插件。 +{{< note >}} -请注意: - - -1. 此步骤可以调用 ['kubeadm init phase addon all'](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon) - 命令单独执行。 +此步骤可以通过 ['kubeadm init phase addon all'](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon) +命令单独执行。 +{{< /note >}} -- CoreDNS Service 的名称为 `kube-dns`。这样做是为了防止当用户将集群 DNS 从 kube-dns - 切换到 CoreDNS 时出现服务中断。`--config` 方法在 - [这里](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon) - 有描述。 +- CoreDNS Service 的名称为 `kube-dns`。 + 这样做是为了防止当用户通过[此处](/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon)描述的 + `--config` 方法将集群 DNS 从 kube-dns 切换到 CoreDNS 时出现服务中断。 - 在 `kube-system` 名字空间中创建 CoreDNS 的 ServiceAccount @@ -1206,7 +1176,7 @@ Please note that: 请注意: 如果带 `--discovery-token` 参数调用 `kubeadm join`,则使用了令牌发现功能; @@ -1254,9 +1224,9 @@ In order to prevent "man in the middle" attacks, several steps are taken: - 首先,通过不安全连接检索 CA 证书(这是可能的,因为 `kubeadm init` 授予 `system:unauthenticated` 的用户对 `cluster-info` 访问权限)。 @@ -1269,7 +1239,7 @@ In order to prevent "man in the middle" attacks, several steps are taken: in the output of `kubeadm init` or can be calculated using standard tools (the hash is calculated over the bytes of the Subject Public Key Info (SPKI) object as in RFC7469). The `--discovery-token-ca-cert-hash flag` may be repeated multiple times to allow more than one public key. - - As a additional validation, the CA certificate is retrieved via secure connection and then + - As an additional validation, the CA certificate is retrieved via secure connection and then compared with the CA retrieved initially --> - 基本验证:使用令牌 ID 而不是 JWT 签名 @@ -1278,17 +1248,14 @@ In order to prevent "man in the middle" attacks, several steps are taken: `--discovery-token-ca-cert-hash` 标志可以重复多次,以允许多个公钥。 - 作为附加验证,通过安全连接检索 CA 证书,然后与初始检索的 CA 进行比较。 +{{< note >}} -请注意: - - -1. 通过 `--discovery-token-unsafe-skip-ca-verification` 标志可以跳过公钥验证; - 这削弱了 kubeadm 安全模型,因为其他人可能冒充 Kubernetes 主控节点。 +通过设置 `--discovery-token-unsafe-skip-ca-verification` 标志可以跳过公钥验证; +这样做会削弱 kubeadm 安全模型,因为其他人可能冒充 Kubernetes 主控节点。 +{{< /note >}} 通过文件发现,集群 CA 证书是文件本身提供;事实上,这个发现文件是一个 kubeconfig 文件, @@ -1322,7 +1289,7 @@ reference doc; when the connection with the cluster is established, kubeadm try ## TLS 引导 {#tls-boostrap} 知道集群信息后,kubeadm 将写入文件 `bootstrap-kubelet.conf`,从而允许 kubelet 执行 @@ -1337,28 +1304,24 @@ TLS 引导机制使用共享令牌对 Kubernetes API 服务器进行临时身份 该请求会被自动批准,并且该操作保存 `ca.crt` 文件和 `kubelet.conf` 文件,用于 kubelet 加入集群,同时删除 `bootstrap-kubelet.conf`。 +{{< note >}} -请注意: - - -- 临时身份验证根据 `kubeadm init` 过程中保存的令牌进行验证(或者使用 `kubeadm token` - 创建的其他令牌) +- 临时身份验证根据 `kubeadm init` 过程中保存的令牌进行验证(或者使用 `kubeadm token` 命令创建的其他令牌) - 临时身份验证解析到 `system:bootstrappers:kubeadm:default-node-token` 组的一个用户成员, 该成员在 `kubeadm init` 过程中被授予对 CSR API 的访问权 -- 根据 `kubeadm init` 过程的配置,自动 CSR 审批由 csrapprover 控制器管理 +- 自动的 CSR 审批由 csrapprover 控制器基于 `kubeadm init` 过程中给出的配置来管理 +{{< /note >}}