使用 kubeadm API 自定义组件
本页面介绍如何自定义 kubeadm 部署的组件。对于控制平面组件,您可以使用 ClusterConfiguration
结构中的标志或每个节点的补丁。对于 kubelet 和 kube-proxy,您可以分别使用 KubeletConfiguration
和 KubeProxyConfiguration
。
所有这些选项都可以通过 kubeadm 配置 API 实现。有关配置中每个字段的更多详细信息,您可以导航到我们的 API 参考页面。
注意
目前不支持自定义 kubeadm 的 CoreDNS 部署。您必须手动修补kube-system/coredns
ConfigMap,并在之后重新创建 CoreDNS Pods。或者,您可以跳过默认的 CoreDNS 部署并部署您自己的变体。有关这方面的更多详细信息,请参阅 使用 kubeadm 的初始化阶段。注意
要重新配置已创建的集群,请参阅 重新配置 kubeadm 集群。使用 ClusterConfiguration
中的标志自定义控制平面
kubeadm ClusterConfiguration
对象为用户提供了一种方法,可以覆盖传递给控制平面组件(如 APIServer、ControllerManager、Scheduler 和 Etcd)的默认标志。这些组件使用以下结构定义
apiServer
controllerManager
scheduler
etcd
这些结构包含一个通用的 extraArgs
字段,该字段由 key: value
对组成。要覆盖控制平面组件的标志,请执行以下操作
- 将适当的
extraArgs
添加到您的配置中。 - 将标志添加到
extraArgs
字段中。 - 使用
--config <您的配置 YAML>
运行kubeadm init
。
注意
您可以通过运行kubeadm config print init-defaults
并将输出保存到您选择的文件中来生成具有默认值的 ClusterConfiguration
对象。注意
ClusterConfiguration
对象在 kubeadm 集群中当前是全局的。这意味着您添加的任何标志都将应用于不同节点上同一组件的所有实例。要对不同节点上的每个组件应用单独的配置,您可以使用 补丁。APIServer 标志
有关详细信息,请参阅 kube-apiserver 的参考文档。
示例用法
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
apiServer:
extraArgs:
anonymous-auth: "false"
enable-admission-plugins: AlwaysPullImages,DefaultStorageClass
audit-log-path: /home/johndoe/audit.log
ControllerManager 标志
有关详细信息,请参阅 kube-controller-manager 的参考文档。
示例用法
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
controllerManager:
extraArgs:
cluster-signing-key-file: /home/johndoe/keys/ca.key
deployment-controller-sync-period: "50"
Scheduler 标志
有关详细信息,请参阅 kube-scheduler 的参考文档。
示例用法
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
scheduler:
extraArgs:
config: /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/v1beta3
kind: ClusterConfiguration
etcd:
local:
extraArgs:
election-timeout: 1000
使用补丁进行自定义
Kubernetes v1.22 [测试版]
Kubeadm 允许您将包含补丁文件的目录传递给各个节点上的 InitConfiguration
和 JoinConfiguration
。这些补丁可以用作在将组件配置写入磁盘之前的最后自定义步骤。
您可以使用 --config <您的配置 YAML>
将此文件传递给 kubeadm init
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
patches:
directory: /home/user/somedir
注意
对于kubeadm init
,您可以传递一个包含 ClusterConfiguration
和 InitConfiguration
的文件,它们之间用 ---
分隔。您可以使用 --config <您的配置 YAML>
将此文件传递给 kubeadm join
apiVersion: kubeadm.k8s.io/v1beta3
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
传递给 kubeadm init
,将其放在 ClusterConfiguration
或 InitConfiguration
旁边,并用 ---
分隔。
有关更多详细信息,您可以导航到我们的 API 参考页面。