使用 kubeadm API 自定义组件
本页面介绍如何自定义 kubeadm 部署的组件。对于控制平面组件,你可以在 `ClusterConfiguration` 结构中使用标志或按节点使用补丁。对于 kubelet 和 kube-proxy,你可以分别使用 `KubeletConfiguration` 和 `KubeProxyConfiguration`。
所有这些选项都可以通过 kubeadm 配置 API 实现。有关配置中每个字段的更多详细信息,请参阅我们的 API 参考页面。
注意
目前不支持自定义 kubeadm 的 CoreDNS 部署。你必须手动修补 `kube-system/coredns` ConfigMap,然后重新创建 CoreDNS Pod。或者,你可以跳过默认的 CoreDNS 部署并部署自己的变体。有关更多详细信息,请参阅使用 kubeadm 进行初始化阶段。注意
要重新配置已创建的集群,请参阅重新配置 kubeadm 集群。使用 `ClusterConfiguration` 中的标志自定义控制平面
kubeadm `ClusterConfiguration` 对象提供了一种方式,让用户可以覆盖传递给控制平面组件(如 APIServer、ControllerManager、Scheduler 和 Etcd)的默认标志。组件使用以下结构定义:
apiServer
controllerManager
scheduler
etcd
这些结构包含一个通用的 `extraArgs` 字段,该字段由 `name` / `value` 对组成。要覆盖控制平面组件的标志:
- 向配置中添加适当的 `extraArgs`。
- 将标志添加到 `extraArgs` 字段。
- 运行 `kubeadm init` 并使用 `--config <你的配置 YAML>`。
注意
你可以通过运行 `kubeadm config print init-defaults` 并将输出保存到你选择的文件中来生成具有默认值的 `ClusterConfiguration` 对象。注意
`ClusterConfiguration` 对象目前在 kubeadm 集群中是全局的。这意味着你添加的任何标志都将应用于不同节点上同一组件的所有实例。要在不同节点上为每个组件应用单独的配置,你可以使用补丁。注意
目前不支持重复的标志(键)或多次传递相同的标志 `--foo`。要解决这个问题,你必须使用补丁。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 init`,你可以传递一个包含 `ClusterConfiguration` 和 `InitConfiguration` 的文件,它们之间用 `---` 分隔。你可以通过 `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`。
注意
如果你使用 `kubeadm upgrade` 升级 kubeadm 节点,则必须再次提供相同的补丁,以便在升级后保留自定义。为此,你可以使用 `--patches` 标志,该标志必须指向同一目录。`kubeadm upgrade` 目前不支持可用于相同目的的配置 API 结构。自定义 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 参考页面。