kubeadm 配置 (v1beta3)

    从 v1beta2 版本以来的变更列表:

    • 已弃用的字段 “ClusterConfiguration.useHyperKubeImage” 现在被移除。 kubeadm 不再支持 hyperkube 镜像。
    • 字段 “ClusterConfiguration.dns.type” 已经被移除,因为 CoreDNS 是 kubeadm 所支持 的唯一 DNS 服务器类型。
    • 保存私密信息的字段现在包含了 “datapolicy” 标记(tag)。 这一标记会导致 API 结构通过 klog 打印输出时,会忽略这些字段的值。
    • 添加了 “InitConfiguration.nodeRegistration.imagePullPolicy” 和 “JoinConfiguration.nodeRegistration.imagePullPolicy” 以允许在 kubeadm init 和 kubeadm join 期间指定镜像拉取策略。 这两个字段的值必须是 “Always”、”Never” 或 “IfNotPresent” 之一。 默认值是 “IfNotPresent”,也是添加此字段之前的默认行为。
    • 添加了 “InitConfiguration.patches.directory”, “JoinConfiguration.patches.directory” 以允许用户配置一个目录, kubeadm 将从该目录中提取组件的补丁包。
    • BootstrapToken* API 和相关的工具被从 “kubeadm” API 组中移出, 放到一个新的 “bootstraptoken” 组中。kubeadm API 版本 v1beta3 不再包含 BootstrapToken* 结构。

    从老的 kubeadm 配置版本迁移:

    • kubeadm v1.15.x 及更新的版本可以用来从 v1beta1 迁移到 v1beta2 版本;
    • kubeadm v1.22.x 及更新的版本不再支持 v1beta1 和更老的 API,但可以用来 从 v1beta2 迁移到 v1beta3。

    基础知识

    配置 kubeadm 的推荐方式是使用 --config 选项向其传递一个 YAML 配置文件。 kubeadm 配置文件中定义的某些配置选项也可以作为命令行标志来使用,不过这种 方法所支持的都是一些最常见的、最简单的使用场景。

    一个 kubeadm 配置文件中可以包含多个配置类型,使用三根横线(---)作为分隔符。

    kubeadm 支持以下配置类型:

    要输出 “init” 和 “join” 动作的默认值,可以使用下面的命令:

    1. kubeadm config print init-defaults
    2. kubeadm config print join-defaults

    配置文件中必须包含的配置类型列表取决于你在执行的动作(initjoin), 也取决于你要使用的配置选项(默认值或者高级定制)。

    如果某些配置类型没有提供,或者仅部分提供,kubeadm 将使用默认值; kubeadm 所提供的默认值在必要时也会保证其在多个组件之间是一致的 (例如控制器管理器上的 --cluster-cidr 参数和 kube-proxy 上的 clusterCIDR)。

    用户总是可以重载默认配置值,唯一的例外是一小部分与安全性相关联的配置 (例如在 API 服务器上强制实施 Node 和 RBAC 鉴权模式)。

    如果用户所提供的配置类型并非你所执行的操作需要的,kubeadm 会忽略这些配置类型 并打印警告信息。

    kubeadm init 配置类型

    当带有 --config 选项来执行 kubeadm init 命令时,可以使用下面的配置类型: InitConfigurationClusterConfigurationKubeProxyConfigurationKubeletConfiguration, 但 InitConfigurationClusterConfiguration 之间只有一个是必须提供的。

    类型 InitConfiguration 用来配置运行时设置,就 kubeadm init 命令而言,包括 启动引导令牌以及所有与 kubeadm 所在节点相关的设置,包括:

    • nodeRegistration:其中包含与向集群注册新节点相关的字段;使用这个类型来 定制节点名称、要使用的 CRI 套接字或者其他仅对当前节点起作用的设置 (例如节点 IP 地址)。
    • localAPIEndpoint:代表的是要部署到此节点上的 API 服务器示例的端点; 使用这个类型可以完成定制 API 服务器公告地址这类操作。
    1. apiVersion: kubeadm.k8s.io/v1beta3
    2. kind: ClusterConfiguration
    3. networking:
    4. ...
    5. etcd:
    6. ...
    7. apiServer:
    8. extraArgs:
    9. ...
    10. extraVolumes:
    11. ...
    12. ...

    类型 ClusterConfiguration 用来定制集群范围的设置,具体包括以下设置:

    • networking:其中包含集群的网络拓扑配置。使用这一部分可以定制 Pod 的 子网或者 Service 的子网。

    • etcd:etcd 数据库的配置。例如使用这个部分可以定制本地 etcd 或者配置 API 服务器 使用一个外部的 etcd 集群。

    • kube-apiserverkube-schedulerkube-controller-manager 配置:这些部分可以通过添加定制的设置或者重载 kubeadm 的默认设置来定制控制面组件。

    KubeProxyConfiguration 类型用来更改传递给在集群中部署的 kube-proxy 实例 的配置。如果此对象没有提供,或者仅部分提供,kubeadm 使用默认值。

    关于 kube-proxy 的官方文档,可参阅 或者 https://pkg.go.dev/k8s.io/kube-proxy/config/v1alpha1#KubeProxyConfiguration。

    1. apiVersion: kubelet.config.k8s.io/v1beta1
    2. kind: KubeletConfiguration
    3. ...

    KubeletConfiguration 类型用来更改传递给在集群中部署的 kubelet 实例的配置。 如果此对象没有提供,或者仅部分提供,kubeadm 使用默认值。

    关于 kubelet 的官方文档,可参阅 或者 https://pkg.go.dev/k8s.io/kubelet/config/v1beta1#KubeletConfiguration。

    下面是一个为执行 kubeadm init 而提供的、包含多个配置类型的单一 YAML 文件, 其中填充了很多部分。

    kubeadm join 配置类型

    当带有 --config 选项来执行 kubeadm join 操作时, 需要提供 JoinConfiguration 类型。

    1. apiVersion: kubeadm.k8s.io/v1beta3
    2. kind: JoinConfiguration

    JoinConfiguration 类型用来配置运行时设置,就 kubeadm join 而言包括 用来访问集群信息的发现方法,以及所有特定于 kubeadm 执行所在节点的设置,包括:

    • nodeRegistration:其中包含向集群注册新节点相关的配置字段; 使用这个类型可以定制节点名称、用使用的 CRI 套接字和所有其他仅适用于当前节点的设置 (例如节点 IP 地址)。
    • apiEndpoint:用来代表最终要部署到此节点上的 API 服务器实例的端点。

    资源类型

    BootstrapToken

    出现在:

    BootstrapToken 描述的是一个启动引导令牌,以 Secret 形式存储在集群中。

    BootstrapTokenString

    出现在:

    BootstrapTokenString 形式为 abcdef.abcdef0123456789 的一个令牌, 用来从加入集群的节点角度验证 API 服务器的身份,或者 “kubeadm join” 在节点启动引导是作为一种身份认证方法。 此令牌的生命期是短暂的,并且应该如此。

    字段描述
    - [必需]
    string
    无描述。
    - [必需]
    string
    无描述。

    ClusterConfiguration

    ClusterConfiguration 包含一个 kubadm 集群的集群范围配置信息。

    字段描述
    apiVersion
    string
    kubeadm.k8s.io/v1beta3
    kind
    string
    ClusterConfiguration
    etcd

    etcd 中包含 etcd 服务的配置。

    networking
    Networking

    networking 字段包含集群的网络拓扑配置。

    kubernetesVersion
    string

    kubernetesVersion 设置控制面的目标版本。

    controlPlaneEndpoint
    string

    controlPlaneEndpoint 为控制面设置一个稳定的 IP 地址或 DNS 名称。 取值可以是一个合法的 IP 地址或者 RFC-1123 形式的 DNS 子域名,二者均可以带一个 可选的 TCP 端口号。 如果 controlPlaneEndpoint 未设置,则使用 advertiseAddress + bindPort。 如果设置了 controlPlaneEndpoint,但未指定 TCP 端口号,则使用 bindPort

    可能的用法有:

    • 在一个包含不止一个控制面实例的集群中,该字段应该设置为放置在控制面 实例之前的外部负载均衡器的地址。
    apiServer

    apiServer 包含 API 服务器的一些额外配置。

    controllerManager
    ControlPlaneComponent

    controllerManager 中包含控制器管理器的额外配置。

    scheduler

    scheduler 包含调度器的额外配置。

    dns
    DNS

    dns 定义在集群中安装的 DNS 插件的选项。

    certificatesDir
    string

    certificatesDir 设置在何处存放或者查找所需证书。

    imageRepository
    string

    imageRepository 设置用来拉取镜像的容器仓库。 如果此字段为空,默认使用 registry.k8s.io。 当 Kubernetes 用来执行 CI 构造时(Kubernetes 版本以 ci/ 开头), 将默认使用 gcr.io/k8s-staging-ci-images 来拉取控制面组件镜像, 而使用 registry.k8s.io 来拉取所有其他镜像。

    featureGates
    map[string]bool

    featureGates 包含用户所启用的特性门控。

    clusterName
    string

    InitConfiguration 包含一组特定于 “kubeadm init” 的运行时元素。 这里的字段仅用于第一次运行 kubeadm init 命令。 之后,此结构中的字段信息不会再被上传到 kubeadm upgrade 所要使用的 kubeadm-config ConfigMap 中。 这些字段必须设置 “omitempty”

    字段描述
    apiVersion
    string
    kubeadm.k8s.io/v1beta3
    kind
    string
    InitConfiguration
    bootstrapTokens
    []BootstrapToken

    bootstrapTokenskubeadm init 执行时会被用到, 其中描述了一组要创建的启动引导令牌(Bootstrap Tokens)。 这里的信息不会被上传到 kubeadm 在集群中保存的 ConfigMap 中,部分原因是由于信息 本身比较敏感。

    nodeRegistration

    nodeRegistration 中包含与向集群中注册新的控制面节点相关的字段。

    localAPIEndpoint
    APIEndpoint

    localAPIEndpoint 所代表的的是在此控制面节点上要部署的 API 服务器 的端点。在高可用(HA)配置中,此字段与 ClusterConfiguration.controlPlaneEndpoint 的取值不同:后者代表的是整个集群的全局端点,该端点上的请求会被负载均衡到每个 API 服务器。 此配置对象允许你定制本地 API 服务器所公布的、可访问的 IP/DNS 名称和端口。 默认情况下,kubeadm 会尝试自动检测默认接口上的 IP 并使用该地址。 不过,如果这种检测失败,你可以在此字段中直接设置所期望的值。

    certificateKey
    string

    certificateKey 用来设置一个秘钥,该秘钥将对 uploadcerts init 阶段上传到集群中某 Secret 内的秘钥和证书加密。

    skipPhases
    []string

    skipPhases 是命令执行过程中药略过的阶段(Phases)。 通过执行命令 kubeadm init —help 可以获得阶段的列表。 参数标志 “—skip-phases” 优先于此字段的设置。

    patches

    patches 包含与 kubeadm init 阶段 kubeadm 所部署 的组件上要应用的补丁相关的信息。

    JoinConfiguration

    JoinConfiguration 包含描述特定节点的元素。

    字段描述
    apiVersion
    string
    kubeadm.k8s.io/v1beta3
    kind
    string
    JoinConfiguration
    nodeRegistration

    nodeRegistration 包含与向集群注册控制面节点相关的字段。

    caCertPath
    string

    caCertPath 是指向 SSL 证书机构的路径,该证书包用来加密 节点与控制面之间的通信。默认值为 “/etc/kubernetes/pki/ca.crt”。

    discovery [必需]
    Discovery

    discovery 设置 TLS 引导过程中 kubelet 要使用的选项。

    controlPlane

    controlPlane 定义要在正被加入到集群中的节点上部署的额外 控制面实例。此字段为 null 时,不会再上面部署额外的控制面实例。

    skipPhases
    []string

    此字段包含在命令执行过程中要略过的阶段。通过 kubeadm join —help 命令可以查看阶段的列表。参数 —skip-phases 优先于此字段。

    patches
    Patches

    此字段包含 kubeadm join 阶段向 kubeadm 所部署的组件打补丁 的选项。

    APIEndpoint

    出现在:

    APIEndpoint 结构包含某节点上部署的 API 服务器的配置元素。

    字段描述
    advertiseAddress
    string

    advertiseAddress 设置 API 服务器要公布的 IP 地址。

    bindPort
    int32

    bindPort 设置 API 服务器要绑定到的安全端口。默认值为 6443。

    APIServer

    出现在:

    APIServer 包含集群中 API 服务器部署所必需的设置。

    字段描述
    ControlPlaneComponent [必需]
    ControlPlaneComponent
    ControlPlaneComponent 结构的字段被嵌入到此类型中。) 无描述。
    certSANs
    []string

    certSANs 设置 API 服务器签署证书所用的额外主题替代名(Subject Alternative Name,SAN)。

    timeoutForControlPlane

    timeoutForControlPlane 用来控制我们等待 API 服务器开始运行的超时时间。

    BootstrapTokenDiscovery

    出现在:

    BootstrapTokenDiscovery 用来设置基于引导令牌的服务发现选项。

    ControlPlaneComponent

    出现在:

    ControlPlaneComponent 中包含对集群中所有控制面组件都适用的设置。

    字段描述
    extraArgs
    map[string]string

    extraArgs 是要传递给控制面组件的一组额外的参数标志。 此映射中的每个键对应命令行上使用的标志名称,只是没有其引导连字符。

    extraVolumes

    extraVolumes 是一组额外的主机卷,需要挂载到控制面组件中。

    DNS

    出现在:

    DNS 结构定义要在集群中使用的 DNS 插件。

    字段描述
    ImageMeta [必需]
    ImageMeta
    ImageMeta 的成员被内嵌到此类型中)。

    imageMeta 允许对 DNS 组件所使用的的镜像作定制。

    Discovery

    出现在:

    Discovery 设置 TLS 启动引导过程中 kubelet 要使用的配置选项。

    字段描述
    bootstrapToken

    bootstrapToken 设置基于启动引导令牌的服务发现选项。 bootstrapTokenfile 是互斥的。

    file
    FileDiscovery

    tlsBootstrapToken
    string

    tlsBootstrapToken 是 TLS 启动引导过程中使用的令牌。 如果设置了 bootstrapToken,则此字段默认值为 .bootstrapToken.token,不过可以被重载。 如果设置了 file,此字段必须被设置,以防 kubeconfig 文件 中不包含其他身份认证信息。

    timeout

    timeout 用来修改发现过程的超时时长。

    出现在:

    Etcd 包含用来描述 etcd 配置的元素。

    字段描述
    local
    LocalEtcd

    local 提供配置本地 etcd 实例的选项。localexternal 是互斥的。

    external

    ExternalEtcd

    出现在:

    ExternalEtcd 描述外部 etcd 集群。 kubeadm 不清楚证书文件的存放位置,因此必须单独提供证书信息。

    字段描述
    endpoints [必需]
    []string

    endpoints 包含一组 etcd 成员的列表。

    caFile [必需]
    string

    caFile 是一个 SSL 证书机构(CA)文件,用来加密 etcd 通信。 如果使用 TLS 连接,此字段为必需字段。

    certFile [必需]
    string

    certFile 是一个 SSL 证书文件,用来加密 etcd 通信。 如果使用 TLS 连接,此字段为必需字段。

    keyFile [必需]
    string

    keyFile 是一个用来加密 etcd 通信的 SSL 秘钥文件。 此字段在使用 TLS 连接时为必填字段。

    FileDiscovery

    出现在:

    FileDiscovery 用来指定一个文件或者 URL 路径,指向一个 kubeconfig 文件;该配置文件 可用来加载集群信息。

    字段描述
    kubeConfigPath [必需]
    string

    kubeConfigPath 用来指定一个文件或者 URL 路径,指向一个 kubeconfig 文件; 该配置文件可用来加载集群信息。

    HostPathMount

    出现在:

    HostPathMount 包含从宿主节点挂载的卷的信息。

    ImageMeta

    出现在:

    ImageMeta 用来配置来源不是 Kubernetes/kubernetes 发布过程的组件所使用的镜像。

    字段描述
    imageRepository
    string

    imageRepository 设置镜像拉取所用的容器仓库。 若未设置,则使用 ClusterConfiguration 中的 imageRepository

    imageTag
    string

    imageTag 允许用户设置镜像的标签。 如果设置了此字段,则 kubeadm 不再在集群升级时自动更改组件的版本。

    JoinControlPlane

    出现在:

    JoinControlPlane 包含在正在加入集群的节点上要部署的额外的控制面组件的 设置。

    字段描述
    localAPIEndpoint

    localAPIEndpoint 代表的是将在此节点上部署的 API 服务器实例 的端点。

    certificateKey
    string

    certificateKey 是在添加新的控制面节点时用来解密所下载的 Secret 中的证书的秘钥。对应的加密秘钥在 InitConfiguration 结构中。

    LocalEtcd

    出现在:

    LocalEtcd 描述的是 kubeadm 要使用的本地 etcd 集群。

    字段描述
    ImageMeta [必需]
    ImageMeta
    ImageMeta 结构的字段被嵌入到此类型中。)

    ImageMeta 允许用户为 etcd 定制要使用的容器。

    dataDir [必需]
    string

    dataDir 是 etcd 用来存放数据的目录。 默认值为 “/var/lib/etcd”。

    extraArgs
    map[string]string

    extraArgs 是为 etcd 可执行文件提供的额外参数,用于在静态 Pod 中运行 etcd。映射中的每一个键对应命令行上的一个标志参数,只是去掉了 前置的连字符。

    serverCertSANs
    []string

    serverCertSANs 为 etcd 服务器的签名证书设置额外的 主体替代名(Subject Alternative Names,SAN)。

    peerCertSANs
    []string

    peerCertSANs 为 etcd 的对等端签名证书设置额外的 主体替代名(Subject Alternative Names,SAN)。

    Networking

    出现在:

    Networking 中包含描述集群网络配置的元素。

    字段描述
    serviceSubnet
    string

    serviceSubnet 是 Kubernetes 服务所使用的的子网。 默认值为 “10.96.0.0/12”。

    podSubnet
    string

    podSubnet 为 Pod 所使用的子网。

    dnsDomain
    string

    dnsDomain 是 Kubernetes 服务所使用的的 DNS 域名。 默认值为 “cluster.local”。

    出现在:

    NodeRegistrationOptions 包含向集群中注册新的控制面或节点所需要的信息; 节点注册可能通过 “kubeadm init” 或 “kubeadm join” 完成。

    字段描述
    name
    string

    name 是 Node API 对象的 .metadata.name 字段值; 该 API 对象会在此 kubeadm initkubeadm join 操作期间创建。 在提交给 API 服务器的 kubelet 客户端证书中,此字段也用作其 CommonName。 如果未指定则默认为节点的主机名。

    criSocket
    string

    criSocket 用来读取容器运行时的信息。 此信息会被以注解的方式添加到 Node API 对象至上,用于后续用途。

    taints [必需]
    []core/v1.Taint

    taints 设定 Node API 对象被注册时要附带的污点。 若未设置此字段(即字段值为 null),默认为控制平面节点添加控制平面污点。 如果你不想污染你的控制平面节点,可以将此字段设置为空列表(即 YAML 文件中的 taints: []), 这个字段只用于节点注册。

    kubeletExtraArgs
    map[string]string

    kubeletExtraArgs 用来向 kubelet 传递额外参数。 这里的参数会通过 kubeadm 在运行时写入的、由 kubelet 来读取的环境文件来 传递给 kubelet 命令行。 这里的设置会覆盖掉 kubelet-config ConfigMap 中包含的一般性的配置。 命令行标志在解析时优先级更高。 这里的设置值仅作用于 kubeadm 运行所在的节点。 映射中的每个键对应命令行中的一个标志参数,只是去掉了前置的连字符。

    ignorePreflightErrors
    []string

    ignorePreflightErrors 提供一组在当前节点被注册时可以 忽略掉的预检错误。

    imagePullPolicy

    imagePullPolicy 设定 “kubeadm init” 和 “kubeadm join” 操作期间的镜像拉取策略。此字段的取值可以是 “Always”、”IfNotPresent” 或 “Never” 之一。 若此字段未设置,则 kubeadm 使用 “IfNotPresent” 作为其默认值,换言之, 当镜像在主机上不存在时才执行拉取操作。

    Patches

    出现在:

    Patches 包含要向 kubeadm 所部署的组件应用的补丁信息。

    字段描述
    directory
    string