本页面介绍了如何自定义 kubeadm 部署的组件。对于控制平面组件,您可以使用 ClusterConfiguration 结构中的标志或按节点应用补丁。对于 kubelet 和 kube-proxy,您可以使用 KubeletConfiguration 和 KubeProxyConfiguration 进行相应的自定义。
所有这些选项都可以通过 kubeadm 配置 API 实现。有关配置中各个字段的更多详细信息,您可以导航至我们的 API 参考页面。
ClusterConfiguration 中的标志自定义控制平面kubeadm 的 ClusterConfiguration 对象为用户提供了一种覆盖传递给控制平面组件(如 APIServer、ControllerManager、Scheduler 和 Etcd)的默认标志的方法。这些组件使用以下结构定义:
apiServercontrollerManagerscheduleretcd这些结构包含一个通用的 extraArgs 字段,由 name / value 对组成。要覆盖控制平面组件的标志:
extraArgs 添加到您的配置中。extraArgs 字段中。--config <您的配置 YAML> 运行 kubeadm init。kubeadm config print init-defaults 并将输出保存到您选择的文件中,生成具有默认值的 ClusterConfiguration 对象。ClusterConfiguration 对象是全局的。这意味着您添加的任何标志都将应用于不同节点上相同组件的所有实例。要对不同节点上的组件应用单独的配置,您可以使用 补丁(patches)。有关详细信息,请参阅 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"
有关详细信息,请参阅 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"
有关详细信息,请参阅 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 服务器文档。
用法示例
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
etcd:
local:
extraArgs:
- name: "election-timeout"
value: 1000
Kubernetes v1.22 [beta]kubeadm 允许您向各个节点上的 InitConfiguration、JoinConfiguration 和 UpgradeConfiguration 传递包含补丁文件的目录。这些补丁可以用作在组件配置写入磁盘之前的最后自定义步骤。
您可以使用 --config <您的配置 YAML> 将此文件传递给 kubeadm init。
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
patches:
directory: /home/user/somedir
kubeadm init,您可以传递一个包含 ClusterConfiguration 和 InitConfiguration 的文件,两者用 --- 分隔。您可以使用 --config <您的配置 YAML> 将此文件传递给 kubeadm join。
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
patches:
directory: /home/user/somedir
如果您正在使用 kubeadm upgrade apply 和 kubeadm upgrade node 来升级 kubeadm 节点,则必须再次提供相同的补丁,以便在升级后保留自定义设置。
apiVersion: kubeadm.k8s.io/v1beta4
kind: UpgradeConfiguration
apply:
patches:
directory: /home/user/somedir
apiVersion: kubeadm.k8s.io/v1beta4
kind: UpgradeConfiguration
node:
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 和 corednsdeployment 之一。suffix 是一个可选字符串,可用于确定按字母数字顺序先应用哪些补丁。patchtype 可以是 strategic、merge 或 json 之一,这些必须符合 kubectl 支持的 补丁格式。默认的 patchtype 是 strategic。extension 必须是 json 或 yaml。要自定义 kubelet,您可以在同一配置文件中添加一个 KubeletConfiguration,并将其与 ClusterConfiguration 或 InitConfiguration 用 --- 分隔。然后可以将此文件传递给 kubeadm init,kubeadm 将把相同的基础 KubeletConfiguration 应用于集群中的所有节点。
若要在基础 KubeletConfiguration 之上应用实例特定的配置,您可以使用 kubeletconfiguration 补丁目标。
或者,您可以使用 kubelet 标志作为覆盖,方法是在 InitConfiguration 和 JoinConfiguration 都支持的 nodeRegistration.kubeletExtraArgs 字段中传递它们。某些 kubelet 标志已被弃用,因此在使用它们之前,请检查它们在 kubelet 参考文档 中的状态。
有关更多详细信息,请参阅 使用 kubeadm 配置集群中的每个 kubelet。
要自定义 kube-proxy,您可以在 kubeadm init 中将 KubeProxyConfiguration 与 ClusterConfiguration 或 InitConfiguration 一起传递,并用 --- 分隔。
有关更多详细信息,您可以导航至我们的 API 参考页面。
kubeadm 允许您通过针对 corednsdeployment 补丁目标 的补丁来自定义 CoreDNS 部署。
目前不支持针对其他与 CoreDNS 相关的 API 对象(如 kube-system/coredns ConfigMap)的补丁。您必须手动使用 kubectl 修补这些对象,并在之后重新创建 CoreDNS Pod。
或者,您可以通过在 ClusterConfiguration 中包含以下选项来禁用 kubeadm 的 CoreDNS 部署:
dns:
disabled: true
此外,通过执行以下命令:
kubeadm init phase addon coredns --print-manifest --config my-config.yaml`
您可以获取 kubeadm 为您设置上的 CoreDNS 创建的清单文件。