codecamp

Kubernetes 使用kubeadm API定制组件

使用 kubeadm API 定制组件

本页面介绍了如何自定义 kubeadm 部署的组件。 你可以使用 ​ClusterConfiguration ​结构中定义的参数,或者在每个节点上应用补丁来定制控制平面组件。 你可以使用 ​KubeletConfiguration ​和 ​KubeProxyConfiguration ​结构分别定制 kubelet 和 kube-proxy 组件。

所有这些选项都可以通过 kubeadm 配置 API 实现。

Note:
kubeadm 目前不支持对 CoreDNS 部署进行定制。 你必须手动更新 ​kube-system/coredns​ ConfigMap 并在更新后重新创建 CoreDNS Pods。 或者,你可以跳过默认的 CoreDNS 部署并部署你自己的 CoreDNS 变种。

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

kubeadm ​ClusterConfiguration ​对象为用户提供了一种方法, 用以覆盖传递给控制平面组件(如 APIServer、ControllerManager、Scheduler 和 Etcd)的默认参数。 各组件配置使用如下字段定义:

  • apiServer
  • controllerManager
  • scheduler
  • etcd

这些结构包含一个通用的 ​extraArgs ​字段,该字段由 ​key: value​ 组成。 要覆盖控制平面组件的参数:

  1. 将适当的字段 ​extraArgs ​添加到配置中。
  2. 向字段 ​extraArgs ​添加要覆盖的参数值。
  3. 用 ​--config <YOUR CONFIG YAML>​ 运行 ​kubeadm init​。

Note:
你可以通过运行 ​kubeadm config print init-defaults​ 并将输出保存到你所选的文件中, 以默认值形式生成 ​ClusterConfiguration ​对象。
Note:
ClusterConfiguration ​对象目前在 kubeadm 集群中是全局的。 这意味着你添加的任何标志都将应用于同一组件在不同节点上的所有实例。 要在不同节点上为每个组件应用单独的配置,你可以使用补丁。
Note:
当前不支持重复的参数(keys)或多次传递相同的参数 ​--foo​。 要解决此问题,你必须使用补丁。

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 参数 

使用示例:

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 参数 

使用示例:

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 参数 

使用示例:

apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
etcd:
  local:
    extraArgs:
      election-timeout: 1000

使用补丁定制控制平面 

FEATURE STATE: Kubernetes v1.22 [beta]

Kubeadm 允许将包含补丁文件的目录传递给各个节点上的 ​InitConfiguration ​和 ​JoinConfiguration​。 这些补丁可被用作控制平面组件清单写入磁盘之前的最后一个自定义步骤。

可以使用 ​--config <你的 YAML 格式控制文件>​ 将配置文件传递给 ​kubeadm init​:

apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
patches:
  directory: /home/user/somedir
Note:
对于 ​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 ​之一。
  • patchtype ​可以是 ​strategy​、​merge ​或 ​json ​之一,并且这些必须匹配 kubectl 支持 的补丁格式。 默认补丁类型是 ​strategic ​的。
  • extension ​必须是 ​json ​或 ​yaml​。
  • suffix ​是一个可选字符串,可用于确定首先按字母数字应用哪些补丁。

Note:
如果你使用 ​kubeadm upgrade​ 升级 kubeadm 节点,你必须再次提供相同的补丁,以便在升级后保留自定义配置。 为此,你可以使用 ​--patches​ 参数,该参数必须指向同一目录。 ​kubeadm upgrade​ 目前不支持用于相同目的的 API 结构配置。

自定义 kubelet 

要自定义 kubelet,你可以在同一配置文件中的 ​ClusterConfiguration ​或 ​InitConfiguration ​之外添加一个 ​KubeletConfiguration​,用 ​---​ 分隔。 然后可以将此文件传递给 ​kubeadm init​。

Note:
kubeadm 将相同的 ​KubeletConfiguration ​配置应用于集群中的所有节点。 要应用节点特定设置,你可以使用 ​kubelet ​参数进行覆盖,方法是将它们传递到 ​InitConfiguration ​和 ​JoinConfiguration ​支持的 ​nodeRegistration.kubeletExtraArgs​ 字段中。

自定义 kube-proxy 

要自定义 kube-proxy,你可以在 ​ClusterConfiguration ​或 ​InitConfiguration ​之外添加一个 由 ​---​ 分隔的 ​KubeProxyConfiguration​, 传递给 ​kubeadm init​。

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


Kubernetes 使用kubeadm创建集群
Kubernetes 高可用拓扑选项
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Kubernetes 管理集群

Kubernetes Service

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }