kubeadm 配置 (v1beta2)

包 v1beta2 定义 kubeadm 配置文件格式的 v1beta2 版本。 此版本改进了 v1beta1 的格式,修复了一些小问题并添加了一些新的字段。

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

  • “certificateKey” 字段被添加到 InitConfiguration 和 JoinConfiguration 中。
  • JSON 标签 “omitempty” 在合适的情况下被用到更多的位置。
  • “taints” 字段(在 NodeRegistrationOptions)的 JSON 标签 “omitempty” 被去除。

参阅 Kubernetes 1.15 的变更记录以了解详细信息。

从老的 kubeadm 配置版本迁移:

请使用 kubeadm v1.15.x 的 “kubeadm config migrate” 命令将 v1beta1 版本的配置文件转换为 v1beta2。 (从更老版本的 kubeadm 配置文件迁移需要使用更老版本的 kubeadm。例如:

  • kubeadm v1.11 版本可以用来从 v1alpha1 迁移到 v1alpha2 版本;kubeadm v1.12 可用来将 v1alpha2 转换为 v1alpha3。
  • kubeadm v1.13 或 v1.14 可以用来将 v1alpha3 转换为 v1beta1。

尽管如此,kubeadm v1.15.x 会支持读取 v1beta1 版本的 kubeadm 配置文件格式。

基础知识

配置 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/v1beta2
  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://godoc.org/k8s.io/kube-proxy/config/v1alpha1#KubeProxyConfiguration。

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

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

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

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

kubeadm join 配置类型

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

  1. apiVersion: kubeadm.k8s.io/v1beta2
  2. kind: JoinConfiguration
  3. ...

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

  • apiEndpoint:用来代表最终要部署到此节点上的 API 服务器实例的端点。

资源类型

ClusterConfiguration

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

ClusterStatus

ClusterStatus 包含集群信息。ClusterStatus 会被保存在集群中 kubeadm-config ConfigMap 中,之后在新的控制面实例添加到集群或者现有控制面实例离开集群时被更新。

字段描述
apiVersion
string
kubeadm.k8s.io/v1beta2
kind
string
ClusterStatus
apiEndpoints [必需]

apiEndpoints 为当前集群中可用的 API 端点,每个控制面实例 (API 服务器)对应一个表项。 映射的键名为主机默认接口的 IP 地址。

InitConfiguration

InitConfiguration 包含一组特定于 “kubeadm init” 的运行时元素。

字段描述
apiVersion
string
kubeadm.k8s.io/v1beta2
kind
string
InitConfiguration
bootstrapTokens [必需]

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

nodeRegistration [必需]
NodeRegistrationOptions

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

localAPIEndpoint [必需]

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

certificateKey [必需]
string

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

JoinConfiguration

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

字段描述
apiVersion
string
kubeadm.k8s.io/v1beta2
kind
string
JoinConfiguration
nodeRegistration [必需]
nodeRegistration 包含与向集群注册控制面节点相关的字段。
caCertPath [必需]
string
discovery [必需]
Discovery

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

controlPlane [必需]

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

出现在:

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 服务器开始运行的超时时间。

BootstrapToken

出现在:

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

字段描述
token [必需]
BootstrapTokenString

token 用来在节点与控制面之间建立双向的信任关系。 在向集群中添加节点时使用。

description [必需]
string

description 设置一个对人友好的消息, 说明为什么此令牌会存在以及其目标用途,这样其他管理员能够知道其目的。

ttl [必需]

ttl 定义此令牌的声明周期。默认为 ‘24h’。 expiresttl 是互斥的。

expires [必需]
meta/v1.Time

expires 设置此令牌过期的时间戳。 默认为在运行时基于ttl来决定。 expiresttl是互斥的。

usages [必需]
[]string

usages 描述此令牌的可能使用方式。默认情况下, 令牌可用于建立双向的信任关系;不过这里可以改变默认用途。

groups [必需]
[]string

groups 设定此令牌被用于身份认证时对应的附加用户组。

BootstrapTokenDiscovery

出现在:

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

BootstrapTokenString

出现在:

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

字段描述
id [必需]
string
无描述
secret [必需]
string
无描述

ControlPlaneComponent

出现在:

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

字段描述
extraArgs [必需]
map[string]string

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

extraVolumes [必需]
[]HostPathMount

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

DNS

出现在:

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

字段描述
type [必需]

type 定义要使用的 DNS 插件类型。

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

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

DNSAddOnType

string 数据类型的别名)

出现在:

DNSAddOnType 定义的是用来辨识 DNS 插件类型的字符串。

Discovery

出现在:

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

字段描述
[必需]

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

file [必需]
FileDiscovery
用来设置一个文件或者 URL 路径,指向一个 kubeconfig 文件; 该配置文件中包含集群信息。 bootstrapTokenfile 是互斥的。
tlsBootstrapToken [必需]
string

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

timeout [必需]

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

出现在:

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

字段描述
local [必需]
LocalEtcd
external [必需]

external描述如何连接到外部的 etcd 集群。 localexternal是互斥的。

ExternalEtcd

出现在:

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

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

endpoints 包含一组 etcd 成员的列表。外部 etcd 需要。

caFile [必需]
string

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

certFile [必需]
string

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

keyFile [必需]
string

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

FileDiscovery

出现在:

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

HostPathMount

出现在:

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

字段描述
name [必需]
string

name 字段为卷在 Pod 模板中的名称。

hostPath [必需]
string

hostPath 是要在 Pod 中挂载的卷在宿主系统上的路径。

mountPath [必需]
string

mountPath 是 hostPath 在 Pod 内挂载的路径。

readOnly [必需]
bool

readOnly 控制卷的读写访问模式。

pathType [必需]
core/v1.HostPathType

pathType 是 hostPath 的类型。

ImageMeta

出现在:

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

字段描述
imageRepository [必需]
string

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

imageTag [必需]
string

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

JoinControlPlane

出现在:

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

字段描述
localAPIEndpoint [必需]
APIEndpoint

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

certificateKey [必需]
string

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

LocalEtcd

出现在:

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

字段描述
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

出现在:

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),在 kubeadm init 期间,默认为控制平面节点添加控制平面污点。 如果你不想污染你的控制平面节点,可以将此字段设置为空列表(即 YAML 文件中的 taints: []), 这个字段只用于节点注册。

kubeletExtraArgs [必需]
map[string]string

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

ignorePreflightErrors [必需]
[]string

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