使用 kubeadm API 定制组件
本页面介绍如何定制 kubeadm 部署的组件。对于控制平面组件,你可以在 ClusterConfiguration
结构中使用标志,或者按节点使用补丁。对于 kubelet 和 kube-proxy,你分别可以使用 KubeletConfiguration
和 KubeProxyConfiguration
。
所有这些选项都可以通过 kubeadm 配置 API 实现。有关配置中每个字段的更多详细信息,你可以访问我们的API 参考页面。
说明
目前不支持定制 kubeadm 的 CoreDNS 部署。你必须手动修补kube-system/coredns
ConfigMap,然后重新创建 CoreDNS Pod。或者,你可以跳过默认的 CoreDNS 部署并部署你自己的版本。有关更多详细信息,请参阅将 init 阶段与 kubeadm 一起使用。说明
要重新配置已创建的集群,请参阅重新配置 kubeadm 集群。使用 ClusterConfiguration
中的标志定制控制平面
kubeadm ClusterConfiguration
对象提供了一种用户覆盖传递给控制平面组件(如 APIServer、ControllerManager、Scheduler 和 Etcd)的默认标志的方式。这些组件使用以下结构进行定义
apiServer
controllerManager
scheduler
etcd
这些结构包含一个通用的 extraArgs
字段,该字段由 name
/ value
对组成。要覆盖控制平面组件的标志
- 将适当的
extraArgs
添加到你的配置中。 - 将标志添加到
extraArgs
字段中。 - 运行带有
--config <YOUR CONFIG YAML>
参数的kubeadm init
命令。
说明
你可以通过运行kubeadm config print init-defaults
命令并将其输出保存到你选择的文件中,生成一个包含默认值的 ClusterConfiguration
对象。说明
目前,ClusterConfiguration
对象在 kubeadm 集群中是全局的。这意味着你添加的任何标志将应用于不同节点上同一组件的所有实例。要为不同节点上的每个组件应用单独的配置,你可以使用补丁(patches)。APIServer 标志
有关详细信息,请参阅kube-apiserver 参考文档。
用法示例
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
apiServer:
extraArgs:
- name: "enable-admission-plugins"
value: "AlwaysPullImages,DefaultStorageClass"
- name: "audit-log-path"
value: "/home/johndoe/audit.log"
ControllerManager 标志
有关详细信息,请参阅kube-controller-manager 参考文档。
用法示例
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
controllerManager:
extraArgs:
- name: "cluster-signing-key-file"
value: "/home/johndoe/keys/ca.key"
- name: "deployment-controller-sync-period"
value: "50"
Scheduler 标志
有关详细信息,请参阅kube-scheduler 参考文档。
用法示例
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
scheduler:
extraArgs:
- name: "config"
value: "/etc/kubernetes/scheduler-config.yaml"
extraVolumes:
- name: schedulerconfig
hostPath: /home/johndoe/schedconfig.yaml
mountPath: /etc/kubernetes/scheduler-config.yaml
readOnly: true
pathType: "File"
Etcd 标志
有关详细信息,请参阅etcd 服务器文档。
用法示例
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
etcd:
local:
extraArgs:
- name: "election-timeout"
value: 1000
使用补丁进行定制
Kubernetes v1.22 [beta]
Kubeadm 允许你在单个节点上向 InitConfiguration
和 JoinConfiguration
传递包含补丁文件的目录。这些补丁可以作为组件配置写入磁盘前的最后一步定制。
你可以使用 --config <YOUR CONFIG YAML>
参数将此文件传递给 kubeadm init
命令
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
patches:
directory: /home/user/somedir
说明
对于kubeadm init
,你可以传递一个包含 ClusterConfiguration
和 InitConfiguration
的文件,两者之间用 ---
分隔。你可以使用 --config <YOUR CONFIG YAML>
参数将此文件传递给 kubeadm join
命令
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
patches:
directory: /home/user/somedir
目录必须包含命名为 target[suffix][+patchtype].extension
的文件。例如,kube-apiserver0+merge.yaml
或者只是 etcd.json
。
target
可以是kube-apiserver
、kube-controller-manager
、kube-scheduler
、etcd
和kubeletconfiguration
之一。suffix
是一个可选字符串,可用于按字母数字顺序确定先应用哪个补丁。patchtype
可以是strategic
、merge
或json
之一,这些必须与 kubectl 支持的补丁格式匹配。默认的patchtype
是strategic
。extension
必须是json
或yaml
。
说明
如果你使用kubeadm upgrade
升级 kubeadm 节点,你必须再次提供相同的补丁,以便在升级后保留定制。为此,你可以使用 --patches
标志,该标志必须指向同一个目录。kubeadm upgrade
目前不支持可用于相同目的的配置 API 结构。定制 kubelet
要定制 kubelet,你可以在同一配置文件中将一个 KubeletConfiguration
添加到 ClusterConfiguration
或 InitConfiguration
旁边,用 ---
分隔。然后可以将此文件传递给 kubeadm init
,kubeadm 将把相同的基本 KubeletConfiguration
应用于集群中的所有节点。
要在基本 KubeletConfiguration
之上应用实例特定的配置,你可以使用 kubeletconfiguration
补丁目标。
或者,你可以通过在 InitConfiguration
和 JoinConfiguration
都支持的 nodeRegistration.kubeletExtraArgs
字段中传递 kubelet 标志作为覆盖。某些 kubelet 标志已被弃用,因此在使用它们之前,请查看 kubelet 参考文档中的状态。
有关其他详细信息,请参阅使用 kubeadm 配置集群中的每个 kubelet
定制 kube-proxy
要定制 kube-proxy,你可以将 KubeProxyConfiguration
添加到 ClusterConfiguration
或 InitConfiguration
旁边,并用 ---
分隔,然后将其传递给 kubeadm init
命令。
有关更多详细信息,你可以访问我们的API 参考页面。