使用 kubeadm API 自定义组件

本页面介绍如何自定义 kubeadm 部署的组件。对于控制平面组件,你可以在 `ClusterConfiguration` 结构中使用标志或按节点使用补丁。对于 kubelet 和 kube-proxy,你可以分别使用 `KubeletConfiguration` 和 `KubeProxyConfiguration`。

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

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

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

  • apiServer
  • controllerManager
  • scheduler
  • etcd

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

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

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`。这些补丁可以用作组件配置写入磁盘之前的最后一步自定义。

你可以通过 `kubeadm init --config <你的配置 YAML>` 将此文件传递给 `kubeadm init`。

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

你可以通过 `kubeadm join --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`。

自定义 kubelet

要自定义 kubelet,你可以在同一配置文件中,在 `ClusterConfiguration` 或 `InitConfiguration` 旁边添加一个 `KubeletConfiguration`,用 `---` 分隔。然后,此文件可以传递给 `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 参考页面

最后修改时间:2024 年 7 月 5 日,下午 4:06 PST:kubeadm:在所有文档示例中使用 v1beta4 (efc1133fa4)