使用 kubeadm API 自定义组件

本页面介绍了如何自定义 kubeadm 部署的组件。对于控制平面组件,您可以使用 ClusterConfiguration 结构中的标志或按节点应用补丁。对于 kubelet 和 kube-proxy,您可以使用 KubeletConfigurationKubeProxyConfiguration 进行相应的自定义。

所有这些选项都可以通过 kubeadm 配置 API 实现。有关配置中各个字段的更多详细信息,您可以导航至我们的 API 参考页面

说明

要重新配置已经创建的集群,请参阅 重新配置 kubeadm 集群

使用 ClusterConfiguration 中的标志自定义控制平面

kubeadm 的 ClusterConfiguration 对象为用户提供了一种覆盖传递给控制平面组件(如 APIServer、ControllerManager、Scheduler 和 Etcd)的默认标志的方法。这些组件使用以下结构定义:

  • apiServer
  • controllerManager
  • scheduler
  • etcd

这些结构包含一个通用的 extraArgs 字段,由 name / value 对组成。要覆盖控制平面组件的标志:

  1. 将适当的 extraArgs 添加到您的配置中。
  2. 将标志添加到 extraArgs 字段中。
  3. 使用 --config <您的配置 YAML> 运行 kubeadm init

说明

您可以通过运行 kubeadm config print init-defaults 并将输出保存到您选择的文件中,生成具有默认值的 ClusterConfiguration 对象。

说明

目前在 kubeadm 集群中,ClusterConfiguration 对象是全局的。这意味着您添加的任何标志都将应用于不同节点上相同组件的所有实例。要对不同节点上的组件应用单独的配置,您可以使用 补丁(patches)

说明

目前不支持重复标志(键)或多次传递同一标志 --foo。要解决此问题,您必须使用 补丁(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

使用补丁(Patch)进行自定义

功能状态: Kubernetes v1.22 [beta]

kubeadm 允许您向各个节点上的 InitConfigurationJoinConfigurationUpgradeConfiguration 传递包含补丁文件的目录。这些补丁可以用作在组件配置写入磁盘之前的最后自定义步骤。

您可以使用 --config <您的配置 YAML> 将此文件传递给 kubeadm init

apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
patches:
  directory: /home/user/somedir

说明

对于 kubeadm init,您可以传递一个包含 ClusterConfigurationInitConfiguration 的文件,两者用 --- 分隔。

您可以使用 --config <您的配置 YAML> 将此文件传递给 kubeadm join

apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
patches:
  directory: /home/user/somedir

如果您正在使用 kubeadm upgrade applykubeadm 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-apiserverkube-controller-managerkube-scheduleretcdkubeletconfigurationcorednsdeployment 之一。
  • suffix 是一个可选字符串,可用于确定按字母数字顺序先应用哪些补丁。
  • patchtype 可以是 strategicmergejson 之一,这些必须符合 kubectl 支持的 补丁格式。默认的 patchtypestrategic
  • extension 必须是 jsonyaml

自定义 kubelet

要自定义 kubelet,您可以在同一配置文件中添加一个 KubeletConfiguration,并将其与 ClusterConfigurationInitConfiguration--- 分隔。然后可以将此文件传递给 kubeadm init,kubeadm 将把相同的基础 KubeletConfiguration 应用于集群中的所有节点。

若要在基础 KubeletConfiguration 之上应用实例特定的配置,您可以使用 kubeletconfiguration 补丁目标

或者,您可以使用 kubelet 标志作为覆盖,方法是在 InitConfigurationJoinConfiguration 都支持的 nodeRegistration.kubeletExtraArgs 字段中传递它们。某些 kubelet 标志已被弃用,因此在使用它们之前,请检查它们在 kubelet 参考文档 中的状态。

有关更多详细信息,请参阅 使用 kubeadm 配置集群中的每个 kubelet

自定义 kube-proxy

要自定义 kube-proxy,您可以在 kubeadm init 中将 KubeProxyConfigurationClusterConfigurationInitConfiguration 一起传递,并用 --- 分隔。

有关更多详细信息,您可以导航至我们的 API 参考页面

说明

kubeadm 将 kube-proxy 部署为 DaemonSet,这意味着 KubeProxyConfiguration 将应用于集群中 kube-proxy 的所有实例。

自定义 CoreDNS

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 创建的清单文件。


最后修改于 2025 年 12 月 18 日 下午 4:46 PST:kubeadm: 更新关于升级补丁的过期说明 (afaac177d1)