kubeadm init

此命令初始化 Kubernetes 控制平面节点。

运行此命令以设置 Kubernetes 控制平面

概要

运行此命令以设置 Kubernetes 控制平面

"init" 命令执行以下阶段

preflight                    Run pre-flight checks
certs                        Certificate generation
  /ca                          Generate the self-signed Kubernetes CA to provision identities for other Kubernetes components
  /apiserver                   Generate the certificate for serving the Kubernetes API
  /apiserver-kubelet-client    Generate the certificate for the API server to connect to kubelet
  /front-proxy-ca              Generate the self-signed CA to provision identities for front proxy
  /front-proxy-client          Generate the certificate for the front proxy client
  /etcd-ca                     Generate the self-signed CA to provision identities for etcd
  /etcd-server                 Generate the certificate for serving etcd
  /etcd-peer                   Generate the certificate for etcd nodes to communicate with each other
  /etcd-healthcheck-client     Generate the certificate for liveness probes to healthcheck etcd
  /apiserver-etcd-client       Generate the certificate the apiserver uses to access etcd
  /sa                          Generate a private key for signing service account tokens along with its public key
kubeconfig                   Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file
  /admin                       Generate a kubeconfig file for the admin to use and for kubeadm itself
  /super-admin                 Generate a kubeconfig file for the super-admin
  /kubelet                     Generate a kubeconfig file for the kubelet to use *only* for cluster bootstrapping purposes
  /controller-manager          Generate a kubeconfig file for the controller manager to use
  /scheduler                   Generate a kubeconfig file for the scheduler to use
etcd                         Generate static Pod manifest file for local etcd
  /local                       Generate the static Pod manifest file for a local, single-node local etcd instance
control-plane                Generate all static Pod manifest files necessary to establish the control plane
  /apiserver                   Generates the kube-apiserver static Pod manifest
  /controller-manager          Generates the kube-controller-manager static Pod manifest
  /scheduler                   Generates the kube-scheduler static Pod manifest
kubelet-start                Write kubelet settings and (re)start the kubelet
upload-config                Upload the kubeadm and kubelet configuration to a ConfigMap
  /kubeadm                     Upload the kubeadm ClusterConfiguration to a ConfigMap
  /kubelet                     Upload the kubelet component config to a ConfigMap
upload-certs                 Upload certificates to kubeadm-certs
mark-control-plane           Mark a node as a control-plane
bootstrap-token              Generates bootstrap tokens used to join a node to a cluster
kubelet-finalize             Updates settings relevant to the kubelet after TLS bootstrap
  /experimental-cert-rotation  Enable kubelet client certificate rotation
addon                        Install required addons for passing conformance tests
  /coredns                     Install the CoreDNS addon to a Kubernetes cluster
  /kube-proxy                  Install the kube-proxy addon to a Kubernetes cluster
show-join-command            Show the join command for control-plane and worker node
kubeadm init [flags]

选项

--apiserver-advertise-address string

API 服务器将宣传其正在监听的 IP 地址。如果未设置,将使用默认网络接口。

--apiserver-bind-port int32     默认值:6443

API 服务器要绑定到的端口。

--apiserver-cert-extra-sans strings

用于 API 服务器服务证书的可选额外主体备用名称 (SAN)。可以是 IP 地址和 DNS 名称。

--cert-dir string     默认值:"/etc/kubernetes/pki"

保存和存储证书的路径。

--certificate-key string

用于加密 kubeadm-certs 密钥中的控制平面证书的密钥。证书密钥是十六进制编码的字符串,它是一个大小为 32 字节的 AES 密钥。

--config string

指向 kubeadm 配置文件的路径。

--control-plane-endpoint string

指定控制平面的稳定 IP 地址或 DNS 名称。

--cri-socket string

要连接的 CRI 套接字的路径。如果为空,kubeadm 将尝试自动检测此值;仅当您安装了多个 CRI 或您具有非标准 CRI 套接字时才使用此选项。

--dry-run

不应用任何更改;只输出将要执行的操作。

--feature-gates string

一组描述各种功能的特征门的键值对。选项是
EtcdLearnerMode=true|false (BETA - 默认值=true)
PublicKeysECDSA=true|false (已弃用 - 默认值=false)
RootlessControlPlane=true|false (ALPHA - 默认值=false)
UpgradeAddonsBeforeControlPlane=true|false (已弃用 - 默认值=false)
WaitForAllControlPlaneComponents=true|false (ALPHA - 默认值=false)

-h, --help

init 的帮助信息

--ignore-preflight-errors strings

将被视为警告显示其错误的检查列表。例如:'IsPrivilegedUser,Swap'。值 'all' 忽略来自所有检查的错误。

--image-repository string     默认值: "registry.k8s.io"

选择一个容器仓库来拉取控制平面镜像。

--kubernetes-version string     默认值: "stable-1"

选择控制平面的特定 Kubernetes 版本。

--node-name string

指定节点名称。

--patches string

指向包含名为 "target[suffix][+patchtype].extension" 的文件的目录的路径。例如,"kube-apiserver0+merge.yaml" 或只是 "etcd.json"。 "target" 可以是 "kube-apiserver"、"kube-controller-manager"、"kube-scheduler"、"etcd"、"kubeletconfiguration" 之一。 "patchtype" 可以是 "strategic"、"merge" 或 "json" 之一,它们与 kubectl 支持的补丁格式匹配。默认的 "patchtype" 是 "strategic"。 "extension" 必须是 "json" 或 "yaml"。 "suffix" 是一个可选的字符串,可用于根据字母数字顺序确定首先应用哪些补丁。

--pod-network-cidr string

指定 Pod 网络的 IP 地址范围。如果设置,控制平面将自动为每个节点分配 CIDR。

--service-cidr string     默认值: "10.96.0.0/12"

使用服务 VIP 的备用 IP 地址范围。

--service-dns-domain string     默认值: "cluster.local"

对服务使用备用域,例如 "myorg.internal"。

--skip-certificate-key-print

不打印用于加密控制平面证书的密钥。

--skip-phases strings

要跳过的阶段列表

--skip-token-print

跳过打印由 'kubeadm init' 生成的默认引导令牌。

--token string

用于在节点和控制平面节点之间建立双向信任的令牌。格式为 [a-z0-9]{6}.[a-z0-9]{16} - 例如 abcdef.0123456789abcdef

--token-ttl duration     默认值: 24h0m0s

令牌自动删除之前的持续时间(例如 1 秒、2 分钟、3 小时)。如果设置为 '0',令牌将永远不会过期

--upload-certs

将控制平面证书上传到 kubeadm-certs 密钥。

从父命令继承的选项

--rootfs string

[实验性] 指向“真实”主机根文件系统的路径。

Init 工作流程

kubeadm init 通过执行以下步骤引导 Kubernetes 控制平面节点

  1. 运行一系列预检,以在进行更改之前验证系统状态。有些检查只触发警告,另一些被认为是错误,并将退出 kubeadm,直到问题得到纠正或用户指定 --ignore-preflight-errors=<错误列表>

  2. 生成一个自签名 CA 以设置集群中每个组件的身份。用户可以通过将自己的 CA 证书和/或密钥放在通过 --cert-dir(默认情况下为 /etc/kubernetes/pki)配置的证书目录中来提供自己的 CA 证书和/或密钥。APIServer 证书将对任何 --apiserver-cert-extra-sans 参数(如果需要,则小写)具有额外的 SAN 条目。

  3. /etc/kubernetes/ 中写入 kubeconfig 文件,供 kubelet、controller-manager 和 scheduler 用于连接到 API 服务器,每个文件都有自己的身份。此外,还将写入其他 kubeconfig 文件,用于 kubeadm 作为管理实体 (admin.conf) 以及用于可以绕过 RBAC 的超级管理员用户 (super-admin.conf)。

  4. 生成 API 服务器、controller-manager 和 scheduler 的静态 Pod 清单。如果未提供外部 etcd,则会为 etcd 生成额外的静态 Pod 清单。

    静态 Pod 清单将写入 /etc/kubernetes/manifests;kubelet 在启动时会监视此目录以创建 Pod。

    控制平面 Pod 启动并运行后,kubeadm init 序列可以继续。

  5. 将标签和污点应用于控制平面节点,以便不会在其中运行其他工作负载。

  6. 生成额外的节点将来可以使用该令牌与控制平面注册的令牌。可选地,用户可以通过 --token 提供令牌,如 kubeadm 令牌 文档中所述。

  7. 进行必要的配置,以允许节点使用 引导令牌TLS 引导 机制加入。

    • 编写一个 ConfigMap,以提供加入所需的所有信息,并设置相关的 RBAC 访问规则。

    • 允许引导令牌访问 CSR 签名 API。

    • 配置对新的 CSR 请求的自动批准。

    有关更多信息,请参见 kubeadm join

  8. 通过 API 服务器安装 DNS 服务器 (CoreDNS) 和 kube-proxy 附加组件。在 Kubernetes 版本 1.11 及更高版本中,CoreDNS 是默认的 DNS 服务器。请注意,虽然 DNS 服务器已部署,但在安装 CNI 之前不会调度它。

使用 kubeadm 的 init 阶段

Kubeadm 允许您使用 kubeadm init phase 命令分阶段创建控制平面节点。

要查看阶段和子阶段的有序列表,您可以调用 kubeadm init --help。该列表将位于帮助屏幕的顶部,每个阶段旁边都会有一个描述。请注意,通过调用 kubeadm init,所有阶段和子阶段将按此确切顺序执行。

某些阶段具有唯一的标志,因此,如果您想查看可用选项的列表,请添加 --help,例如

sudo kubeadm init phase control-plane controller-manager --help

您还可以使用 --help 查看特定父阶段的子阶段列表

sudo kubeadm init phase control-plane --help

kubeadm init 还公开了一个名为 --skip-phases 的标志,可用于跳过某些阶段。该标志接受阶段名称列表,这些名称可以从上面的有序列表中获取。

一个例子

sudo kubeadm init phase control-plane all --config=configfile.yaml
sudo kubeadm init phase etcd local --config=configfile.yaml
# you can now modify the control plane and etcd manifest files
sudo kubeadm init --skip-phases=control-plane,etcd --config=configfile.yaml

此示例将基于 configfile.yaml 中的配置,在 /etc/kubernetes/manifests 中写入控制平面和 etcd 的清单文件。这使您能够修改文件,然后使用 --skip-phases 跳过这些阶段。通过调用最后一个命令,您将使用自定义清单文件创建一个控制平面节点。

功能状态: Kubernetes v1.22 [beta]

或者,您也可以使用 InitConfiguration 下的 skipPhases 字段。

使用配置文件运行 kubeadm init

可以使用配置文件而不是命令行标志配置 kubeadm init,而某些更高级的功能可能仅作为配置文件选项可用。此文件使用 --config 标志传递,它必须包含一个 ClusterConfiguration 结构,并且可以选择由 ---\n 分隔的更多结构。在某些情况下,将 --config 与其他标志混合使用可能不被允许。

可以使用 kubeadm config print 命令打印出默认配置。

如果您的配置没有使用最新版本,建议您使用 kubeadm config migrate 命令进行迁移。

有关配置字段和用法的更多信息,您可以导航到我们的 API 参考页面

使用特征门运行 kubeadm init

Kubeadm 支持一组特定于 kubeadm 的特征门,这些特征门只能在使用 kubeadm init 创建集群时应用。这些功能可以控制集群的行为。在功能升级到 GA 后,特征门将被删除。

要传递特征门,您可以使用 kubeadm init--feature-gates 标志,或者在使用 --config 传递 配置文件 时,将项目添加到 featureGates 字段中。

不支持直接将 核心 Kubernetes 组件的特征门 传递到 kubeadm。相反,可以通过 使用 kubeadm API 自定义组件 传递它们。

特征门列表

kubeadm 特征门
功能默认值AlphaBetaGA
ControlPlaneKubeletLocalModefalse1.31--
EtcdLearnerModetrue1.271.29-
PublicKeysECDSAfalse1.19--
WaitForAllControlPlaneComponentsfalse1.30--

特性开关描述

ControlPlaneKubeletLocalMode
启用此特性开关后,加入新的控制平面节点时,kubeadm 将配置 kubelet 连接到本地 kube-apiserver。这确保了在滚动升级期间不会违反版本偏差策略。
EtcdLearnerMode
启用此特性开关后,加入新的控制平面节点时,将创建一个新的 etcd 成员作为学习者,并在 etcd 数据完全对齐后才提升为投票成员。
PublicKeysECDSA
可用于创建使用 ECDSA 证书而不是默认 RSA 算法的集群。还支持使用 kubeadm certs renew 续订现有 ECDSA 证书,但不能在运行时或升级过程中在 RSA 和 ECDSA 算法之间切换。Kubernetes 1.31 中存在一个错误,即生成的 kubeconfig 文件中的密钥被设置为使用 RSA,即使启用了特性开关。在 v1.31 之前的 Kubernetes 版本中存在一个错误,即生成的 kubeconfig 文件中的密钥被设置为使用 RSA,即使启用了 PublicKeysECDSA 特性开关。
WaitForAllControlPlaneComponents
启用此特性开关后,kubeadm 将等待控制平面节点上所有控制平面组件 (kube-apiserver、kube-controller-manager、kube-scheduler) 在其 /healthz 端点上报告状态 200。这些检查在 https://127.0.0.1:PORT/healthz 上执行,其中 PORT 来自组件的 --secure-port。如果在 kubeadm 配置中指定了自定义 --secure-port 值,则将予以遵守。如果不启用特性开关,kubeadm 将只等待控制平面节点上的 kube-apiserver 准备好。等待过程从 kubeadm 启动主机上的 kubelet 后立即开始。建议在 kubeadm initkubeadm join 命令执行期间希望观察所有控制平面组件的准备状态的情况下启用此特性开关。

已弃用特性开关列表

kubeadm 已弃用特性开关
功能默认值AlphaBetaGA已弃用
RootlessControlPlanefalse1.22--1.31

特性开关描述

RootlessControlPlane
设置此标志配置 kubeadm 部署的控制平面组件静态 Pod 容器 (kube-apiserverkube-controller-managerkube-scheduleretcd) 以非 root 用户身份运行。如果未设置此标志,则这些组件将以 root 用户身份运行。您可以在升级到更新版本的 Kubernetes 之前更改此特性开关的值。

已移除特性开关列表

kubeadm 已移除特性开关
功能AlphaBetaGA已移除
IPv6DualStack1.161.211.231.24
UnversionedKubeletConfigMap1.221.231.251.26
UpgradeAddonsBeforeControlPlane1.28--1.31

特性开关描述

IPv6DualStack
此标志有助于在该功能进行时配置组件双栈。有关 Kubernetes 双栈支持的更多详细信息,请参见 使用 kubeadm 进行双栈支持
UnversionedKubeletConfigMap
此标志控制 ConfigMap 的名称,kubeadm 在其中存储 kubelet 配置数据。如果未指定此标志或设置为 true,则 ConfigMap 的名称为 kubelet-config。如果将此标志设置为 false,则 ConfigMap 的名称将包含 Kubernetes 的主版本和次版本(例如:kubelet-config-1.31)。Kubeadm 确保用于读取和写入该 ConfigMap 的 RBAC 规则适合您设置的值。当 kubeadm 写入此 ConfigMap 时(在 kubeadm initkubeadm upgrade apply 期间),kubeadm 会尊重 UnversionedKubeletConfigMap 的值。当读取该 ConfigMap 时(在 kubeadm joinkubeadm resetkubeadm upgrade ... 期间),kubeadm 首先尝试使用未版本化的 ConfigMap 名称;如果失败,kubeadm 将回退到使用该 ConfigMap 的旧版(版本化)名称。
UpgradeAddonsBeforeControlPlane
此特性开关已被移除。它在 v1.28 中作为已弃用功能引入,并在 v1.31 中移除。有关旧版本的文档,请切换到相应的网站版本。

添加 kube-proxy 参数

有关 kubeadm 配置中的 kube-proxy 参数的信息,请参见

有关使用 kubeadm 启用 IPVS 模式的的信息,请参见

将自定义标志传递给控制平面组件

有关将标志传递给控制平面组件的信息,请参见

在没有互联网连接的情况下运行 kubeadm

要运行没有互联网连接的 kubeadm,您必须预先提取所需的控制平面映像。

您可以使用 kubeadm config images 子命令列出和提取映像

kubeadm config images list
kubeadm config images pull

您可以将 --configkubeadm 配置文件 一同传递给以上命令,以控制 kubernetesVersionimageRepository 字段。

kubeadm 需要的所有默认 registry.k8s.io 映像都支持多种架构。

使用自定义映像

默认情况下,kubeadm 从 registry.k8s.io 提取映像。如果请求的 Kubernetes 版本是 CI 标签(如 ci/latest),则使用 gcr.io/k8s-staging-ci-images

您可以使用 带有配置文件的 kubeadm 覆盖此行为。允许的自定义是

  • 提供 kubernetesVersion,它会影响映像的版本。
  • 提供替代的 imageRepository 用于代替 registry.k8s.io
  • 为 etcd 或 CoreDNS 提供特定的 imageRepositoryimageTag

出于向后兼容性的原因,默认 registry.k8s.io 和使用 imageRepository 指定的自定义存储库之间的映像路径可能不同。例如,一个映像可能在 registry.k8s.io/subpath/image 处有一个子路径,但在使用自定义存储库时默认为 my.customrepository.io/image

要确保您将映像推送到 kubeadm 可以使用的路径中的自定义存储库,您必须

  • 使用 kubeadm config images {list|pull}registry.k8s.io 处的默认路径提取映像。
  • 将映像推送到 kubeadm config images list --config=config.yaml 中的路径,其中 config.yaml 包含自定义 imageRepository 和/或 etcd 和 CoreDNS 的 imageTag
  • 将相同的 config.yaml 传递给 kubeadm init

自定义沙箱 (pause) 映像

要为此设置自定义映像,您需要在 容器运行时 中配置此设置以使用该映像。请查阅您的容器运行时的文档以了解如何更改此设置;对于选定的容器运行时,您也可以在 容器运行时 主题中找到建议。

将控制平面证书上传到集群

通过将标志 --upload-certs 添加到 kubeadm init,您可以暂时将控制平面证书上传到集群中的 Secret 中。请注意,此 Secret 将在 2 小时后自动过期。证书使用 32 字节的密钥进行加密,可以使用 --certificate-key 指定该密钥。在加入其他控制平面节点时,可以使用相同的密钥下载证书,方法是将 --control-plane--certificate-key 传递给 kubeadm join

以下阶段命令可用于在过期后重新上传证书

kubeadm init phase upload-certs --upload-certs --config=SOME_YAML_FILE

如果未将预定义的证书密钥传递给 kubeadm initkubeadm init phase upload-certs,则将自动生成新的密钥。

以下命令可用于按需生成新密钥

kubeadm certs certificate-key

使用 kubeadm 进行证书管理

有关使用 kubeadm 进行证书管理的详细信息,请参见 使用 kubeadm 进行证书管理。该文档包含有关使用外部 CA、自定义证书和证书续订的信息。

管理 kubelet 的 kubeadm drop-in 文件

kubeadm 包附带一个配置文件,用于由 systemd 运行 kubelet。请注意,kubeadm CLI 永远不会触碰此 drop-in 文件。此 drop-in 文件是 kubeadm DEB/RPM 包的一部分。

有关更多信息,请参见 管理 systemd 的 kubeadm drop-in 文件

将 kubeadm 与 CRI 运行时一起使用

默认情况下,kubeadm 会尝试检测您的容器运行时。有关此检测的更多详细信息,请参见 kubeadm CRI 安装指南

设置节点名称

默认情况下,kubeadm 会根据机器的主机地址分配节点名称。您可以使用 --node-name 标志覆盖此设置。该标志将适当的 --hostname-override 值传递给 kubelet。

请注意,覆盖主机名可能会 干扰云提供商

自动化 kubeadm

与在 基本 kubeadm 教程 中一样,您不必将从 kubeadm init 获得的令牌复制到每个节点,而是可以并行化令牌分发以简化自动化。要实现此自动化,您必须知道控制平面节点启动后的 IP 地址,或者使用 DNS 名称或负载均衡器的地址。

  1. 生成一个令牌。此令牌必须采用 <6 个字符的字符串>.<16 个字符的字符串> 格式。更正式地说,它必须与正则表达式匹配:[a-z0-9]{6}\.[a-z0-9]{16}

    kubeadm 可以为您生成令牌

     kubeadm token generate
    
  2. 使用此令牌同时启动控制平面节点和工作节点。当它们启动时,它们应该相互找到并形成集群。相同的 --token 参数可用于 kubeadm initkubeadm join

  3. 加入其他控制平面节点时,--certificate-key 也类似。可以使用以下命令生成密钥

    kubeadm certs certificate-key
    

集群启动后,您可以使用控制平面节点上的 /etc/kubernetes/admin.conf 文件以管理员凭据与集群对话,或者 为其他用户生成 kubeconfig 文件

请注意,这种引导方式的安全保证有所放宽,因为它不允许使用 --discovery-token-ca-cert-hash 验证根 CA 哈希值(因为在配置节点时不会生成)。有关详细信息,请参见 kubeadm join

下一步

最后修改时间:2024 年 7 月 5 日 下午 4:06 PST: kubeadm:在所有文档示例中使用 v1beta4 (efc1133fa4)