- kubeadm 配置 (v1beta4)
- kubeadm 配置版本迁移
- 基础知识
- kubeadm init 配置类型
- kubeadm join 配置类型
- 资源类型
BootstrapToken
BootstrapTokenString
ClusterConfiguration
InitConfiguration
JoinConfiguration
ResetConfiguration
APIEndpoint
APIServer
BootstrapTokenDiscovery
ControlPlaneComponent
DNS
Discovery
Etcd
ExternalEtcd
FileDiscovery
HostPathMount
ImageMeta
JoinControlPlane
LocalEtcd
Networking
NodeRegistrationOptions
Patches
kubeadm 配置 (v1beta4)
概述
v1beta4 包定义 v1beta4 版本的 kubeadm 配置文件格式。 此版本改进了 v1beta3 的格式,修复了一些小问题并添加了一些新的字段。
从 v1beta3 版本以来的变更列表:
- TODO https://github.com/kubernetes/kubeadm/issues/2890
- 使用
APIServer.ExtraEnvs
、ControllerManager.ExtraEnvs
、Scheduler.ExtraEnvs
、Etcd.Local.ExtraEnvs
。 支持在ClusterConfiguration
下控制平面组件中的定制环境变量。 ResetConfiguration
API 类型在 v1beta4 中已得到支持。 用户可以为kubeadm reset
指定--config
文件来重置节点。
kubeadm 配置版本迁移
- kubeadm v1.15.x 及更高版本可用于从 v1beta1 迁移到 v1beta2。
- kubeadm v1.22.x 及更高版本不再支持 v1beta1 和更早的 API,但可用于从 v1beta2 迁移到 v1beta3。
- kubeadm v1.27.x 及更高版本不再支持 v1beta2 和更早的 API。
- TODO: https://github.com/kubernetes/kubeadm/issues/2890 添加可用于转换到 v1beta4 的版本
基础知识
配置 kubeadm 的推荐方式是使用 --config
选项向其传递一个 YAML 配置文件。 kubeadm 配置文件中定义的某些配置选项也可以作为命令行标志来使用, 不过这种方法所支持的都是一些最常见的、最简单的使用场景。
一个 kubeadm 配置文件中可以包含多个配置类型,使用三根横线(---
)作为分隔符。
kubeadm 支持以下配置类型:
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
要输出 “init” 和 “join” 动作的默认值,可以使用下面的命令:
kubeadm config print init-defaults
kubeadm config print join-defaults
配置文件中必须包含的配置类型列表取决于你所执行的动作(init
或 join
), 也取决于你要使用的配置选项(默认值或者高级定制)。
如果某些配置类型没有提供,或者仅部分提供,kubeadm 将使用默认值; kubeadm 所提供的默认值在必要时也会保证其在多个组件之间是一致的 (例如控制器管理器上的 --cluster-cidr
参数和 kube-proxy 上的 clusterCIDR
)。
用户总是可以覆盖默认配置值,唯一的例外是一小部分与安全性相关联的配置 (例如在 API 服务器上强制实施 Node 和 RBAC 鉴权模式)。
如果用户所提供的配置类型并非你所执行的操作需要的,kubeadm 会忽略这些配置类型并打印警告信息。
kubeadm init 配置类型
当带有 --config
选项来执行 kubeadm init 命令时,可以使用下面的配置类型: InitConfiguration
、ClusterConfiguration
、KubeProxyConfiguration
、 KubeletConfiguration
,但 InitConfiguration
和 ClusterConfiguration
二者之间取其一即可。
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
bootstrapTokens:
...
nodeRegistration:
...
InitConfiguration 类型用来配置运行时设置,就 kubeadm init 命令而言, 包括启动引导令牌以及所有与 kubeadm 所在节点相关的设置,包括:
- nodeRegistration:其中包含与向集群注册新节点相关的字段; 使用这个类型来定制节点名称、要使用的 CRI 套接字或者其他仅对当前节点起作用的设置(例如节点 IP 地址)。
- localAPIEndpoint:代表的是要部署到此节点上的 API 服务器实例的端点; 使用这个类型可以完成定制 API 服务器公告地址这类操作。
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
networking:
...
etcd:
...
apiServer:
extraArgs:
...
extraVolumes:
...
...
类型 ClusterConfiguration
用来定制集群范围的设置,具体包括以下设置:
networking
:其中包含集群的网络拓扑配置。使用这一部分可以定制 Pod 的子网或者 Service 的子网。etcd
:etcd 数据库的配置。例如使用这个部分可以定制本地 etcd 或者配置 API 服务器使用一个外部的 etcd 集群。kube-apiserver
、kube-scheduler
、kube-controller-manager
配置:这些部分可以通过添加定制的设置或者重载 kubeadm 的默认设置来定制控制平面组件。
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
...
KubeProxyConfiguration 类型用来更改传递给在集群中部署的 kube-proxy 实例的配置。 如果此对象没有提供,或者仅部分提供,kubeadm 使用默认值。
关于 kube-proxy 的官方文档,可参阅 https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-proxy/ 或者 https://pkg.go.dev/k8s.io/kube-proxy/config/v1alpha1#KubeProxyConfiguration。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
...
KubeletConfiguration 类型用来更改传递给在集群中部署的 kubelet 实例的配置。 如果此对象没有提供,或者仅部分提供,kubeadm 使用默认值。
关于 kubelet 的官方文档,可参阅 https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kubelet/ 或者 https://pkg.go.dev/k8s.io/kubelet/config/v1beta1#KubeletConfiguration。
下面是一个为执行 kubeadm init
而提供的、包含多个配置类型的单一 YAML 文件, 其中填充了很多部分。
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
bootstrapTokens:
- token: "9a08jv.c0izixklcxtmnze7"
description: "kubeadm bootstrap token"
ttl: "24h"
- token: "783bde.3f89s0fje9f38fhf"
description: "another bootstrap token"
usages:
- authentication
- signing
groups:
- system:bootstrappers:kubeadm:default-node-token
nodeRegistration:
name: "ec2-10-100-0-1"
criSocket: "unix:///var/run/containerd/containerd.sock"
taints:
- key: "kubeadmNode"
value: "someValue"
effect: "NoSchedule"
kubeletExtraArgs:
v: 4
ignorePreflightErrors:
- IsPrivilegedUser
imagePullPolicy: "IfNotPresent"
localAPIEndpoint:
advertiseAddress: "10.100.0.1"
bindPort: 6443
certificateKey: "e6a2eb8581237ab72a4f494f30285ec12a9694d750b9785706a83bfcbbbd2204"
skipPhases:
- addon/kube-proxy
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
etcd:
# one of local or external
local:
imageRepository: "registry.k8s.io"
imageTag: "3.2.24"
dataDir: "/var/lib/etcd"
extraArgs:
listen-client-urls: "http://10.100.0.1:2379"
serverCertSANs:
- "ec2-10-100-0-1.compute-1.amazonaws.com"
peerCertSANs:
- "10.100.0.1"
# external:
# endpoints:
# - "10.100.0.1:2379"
# - "10.100.0.2:2379"
# caFile: "/etcd/kubernetes/pki/etcd/etcd-ca.crt"
# certFile: "/etcd/kubernetes/pki/etcd/etcd.crt"
# keyFile: "/etcd/kubernetes/pki/etcd/etcd.key"
networking:
serviceSubnet: "10.96.0.0/16"
podSubnet: "10.244.0.0/24"
dnsDomain: "cluster.local"
kubernetesVersion: "v1.21.0"
controlPlaneEndpoint: "10.100.0.1:6443"
apiServer:
extraArgs:
authorization-mode: "Node,RBAC"
extraVolumes:
- name: "some-volume"
hostPath: "/etc/some-path"
mountPath: "/etc/some-pod-path"
readOnly: false
pathType: File
certSANs:
- "10.100.1.1"
- "ec2-10-100-0-1.compute-1.amazonaws.com"
timeoutForControlPlane: 4m0s
controllerManager:
extraArgs:
"node-cidr-mask-size": "20"
extraVolumes:
- name: "some-volume"
hostPath: "/etc/some-path"
mountPath: "/etc/some-pod-path"
readOnly: false
pathType: File
scheduler:
extraArgs:
address: "10.100.0.1"
extraVolumes:
- name: "some-volume"
hostPath: "/etc/some-path"
mountPath: "/etc/some-pod-path"
readOnly: false
pathType: File
certificatesDir: "/etc/kubernetes/pki"
imageRepository: "registry.k8s.io"
clusterName: "example-cluster"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
# kubelet specific options here
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
# kube-proxy specific options here
kubeadm join 配置类型
当使用 --config
选项执行 kubeadm join
命令时, 需要提供 JoinConfiguration 类型。
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
...
JoinConfiguration 类型用来配置运行时设置,就 kubeadm join
而言包括用来访问集群信息的发现方法,以及所有特定于 kubeadm 执行所在节点的设置,包括:
nodeRegistration
:其中包含向集群注册新节点相关的配置字段; 使用这个类型可以定制节点名称、用使用的 CRI 套接字和所有其他仅适用于当前节点的设置 (例如节点 IP 地址)。apiEndpoint
:用来代表最终要部署到此节点上的 API 服务器实例的端点。
资源类型
BootstrapToken
出现在:
BootstrapToken 描述的是一个启动引导令牌,以 Secret 的形式存储在集群中。
字段 | 描述 |
---|---|
token [必需]BootstrapTokenString |
|
description string |
|
ttl meta/v1.Duration |
|
expires meta/v1.Time |
|
usages []string |
|
groups []string |
|
BootstrapTokenString
出现在:
BootstrapTokenString 形式为 abcdef.abcdef0123456789
的一个令牌, 用来从加入集群的节点角度验证 API 服务器的身份,或者 “kubeadm join” 在节点启动引导时作为一种身份认证方法。 此令牌的生命期是短暂的,并且应该如此。
字段 | 描述 |
---|---|
- [必需]string | 令牌的 ID。 |
- [必需]string | 令牌的私密数据。 |
ClusterConfiguration
ClusterConfiguration 包含一个 kubeadm 集群的集群范围配置信息。
字段 | 描述 |
---|---|
apiVersion string | kubeadm.k8s.io/v1beta4 |
kind string | ClusterConfiguration |
etcd Etcd |
|
networking Networking |
|
kubernetesVersion string |
|
controlPlaneEndpoint string |
|
apiServer APIServer |
|
controllerManager ControlPlaneComponent |
|
scheduler ControlPlaneComponent |
|
dns DNS |
|
certificatesDir string |
|
imageRepository string |
|
featureGates map[string]bool |
|
clusterName string | 集群名称。 |
InitConfiguration
InitConfiguration
包含一组特定于 “kubeadm init” 的运行时元素。
字段 | 描述 |
---|---|
apiVersion string | kubeadm.k8s.io/v1beta4 |
kind string | InitConfiguration |
bootstrapTokens []BootstrapToken |
|
nodeRegistration NodeRegistrationOptions |
|
localAPIEndpoint APIEndpoint |
|
certificateKey string |
|
skipPhases []string |
|
patches Patches |
|
JoinConfiguration
JoinConfiguration 包含描述特定节点的元素。
字段 | 描述 |
---|---|
apiVersion string | kubeadm.k8s.io/v1beta4 |
kind string | JoinConfiguration |
nodeRegistration NodeRegistrationOptions |
|
caCertPath string |
|
discovery [必需]Discovery |
|
controlPlane JoinControlPlane |
|
skipPhases []string |
|
patches Patches | 此字段包含 |
ResetConfiguration
ResetConfiguration
包含一个字段列表,这些字段是特定于 “kubeadm reset” 的运行时元素。
字段 | 描述 |
---|---|
apiVersion string | kubeadm.k8s.io/v1beta4 |
kind string | ResetConfiguration |
cleanupTmpDir bool |
|
certificatesDir string |
|
criSocket string |
|
dryRun bool |
|
force bool |
|
ignorePreflightErrors []string |
|
skipPhases []string |
|
APIEndpoint
出现在:
APIEndpoint
结构包含某节点上部署的 API 服务器实例的元素。
字段 | 描述 |
---|---|
advertiseAddress string |
|
bindPort int32 |
|
APIServer
出现在:
APIServer
包含集群中 API 服务器部署所必需的设置。
字段 | 描述 |
---|---|
ControlPlaneComponent [必需]ControlPlaneComponent | (ControlPlaneComponent 结构的字段被嵌入到此类型中。) 无描述。 |
certSANs []string |
|
timeoutForControlPlane meta/v1.Duration |
|
BootstrapTokenDiscovery
出现在:
BootstrapTokenDiscovery 用来设置基于引导令牌的服务发现选项。
字段 | 描述 |
---|---|
token [必需]string |
|
apiServerEndpoint string |
|
caCertHashes []string |
|
unsafeSkipCAVerification bool |
|
ControlPlaneComponent
出现在:
ControlPlaneComponent 中包含对集群中所有控制平面组件都适用的设置。
字段 | 描述 |
---|---|
extraArgs map[string]string |
|
extraVolumes []HostPathMount |
|
extraEnvs []core/v1.EnvVar |
|
DNS
出现在:
DNS 结构定义要在集群中使用的 DNS 插件。
字段 | 描述 |
---|---|
ImageMeta [必需]ImageMeta | (ImageMeta 的成员被内嵌到此类型中)。
|
Discovery
出现在:
Discovery 设置 TLS 启动引导过程中 kubelet 要使用的配置选项。
字段 | 描述 |
---|---|
bootstrapToken BootstrapTokenDiscovery |
|
file FileDiscovery |
|
tlsBootstrapToken string |
|
timeout meta/v1.Duration |
|
Etcd
出现在:
Etcd 包含用来描述 etcd 配置的元素。
字段 | 描述 |
---|---|
local LocalEtcd |
|
external ExternalEtcd |
|
ExternalEtcd
出现在:
ExternalEtcd 描述外部 etcd 集群。 kubeadm 不清楚证书文件的存放位置,因此必须单独提供证书信息。
字段 | 描述 |
---|---|
endpoints [必需][]string |
|
caFile [必需]string |
|
certFile [必需]string |
|
keyFile [必需]string |
|
FileDiscovery
出现在:
FileDiscovery 用来指定一个文件或者 URL 路径,指向一个 kubeconfig 文件; 该配置文件可用来加载集群信息。
字段 | 描述 |
---|---|
kubeConfigPath [必需]string |
|
HostPathMount
出现在:
HostPathMount 包含从宿主节点挂载的卷的信息。
字段 | 描述 |
---|---|
name [必需]string |
|
hostPath [必需]string |
|
mountPath [必需]string |
|
readOnly bool |
|
pathType core/v1.HostPathType |
|
ImageMeta
出现在:
ImageMeta 用来配置来源不是 Kubernetes/Kubernetes 发布过程的组件所使用的镜像。
字段 | 描述 |
---|---|
imageRepository string |
|
imageTag string |
|
JoinControlPlane
出现在:
JoinControlPlane 包含在正在加入集群的节点上要部署的额外的控制平面组件的设置。
字段 | 描述 |
---|---|
localAPIEndpoint APIEndpoint |
|
certificateKey string |
|
LocalEtcd
出现在:
LocalEtcd 描述的是 kubeadm 要使用的本地 etcd 集群。
字段 | 描述 |
---|---|
ImageMeta [必需]ImageMeta | (ImageMeta 结构的字段被嵌入到此类型中。)ImageMeta 允许用户为 etcd 定制要使用的容器。 |
dataDir [必需]string |
|
extraArgs map[string]string |
|
extraEnvs []core/v1.EnvVar |
|
serverCertSANs []string |
|
peerCertSANs []string |
|
Networking
出现在:
Networking 中包含描述集群网络配置的元素。
字段 | 描述 |
---|---|
serviceSubnet string |
|
podSubnet string |
|
dnsDomain string |
|
NodeRegistrationOptions
出现在:
NodeRegistrationOptions 包含向集群中注册新的控制平面或节点所需要的信息; 节点注册可能通过 “kubeadm init” 或 “kubeadm join” 完成。
字段 | 描述 |
---|---|
name string |
|
criSocket string |
|
taints [必需][]core/v1.Taint |
|
kubeletExtraArgs map[string]string |
|
ignorePreflightErrors []string |
|
imagePullPolicy core/v1.PullPolicy |
|
Patches
出现在:
Patches
包含要向 kubeadm 所部署的组件应用的补丁信息。
字段 | 描述 |
---|---|
directory string |
|