使用 kubeadm 是如何配置集群中的每个节点 kubelet服务的

一.概念

1.kubeadm和kubelet

kubeadm CLI 工具的生命周期与 kubelet 解耦;kubelet 是一个守护程序,在 Kubernetes 集群中的每个节点上运行。 当 Kubernetes 初始化或升级时,kubeadm CLI 工具由用户执行,而 kubelet 始终在后台运行。

由于kubelet是守护程序,因此需要通过某种初始化系统或服务管理器进行维护。 当使用 DEB 或 RPM 安装kubelet 时,配置系统去管理 kubelet。 你可以改用其他服务管理器,但需要手动地配置

集群中涉及的所有 kubelet 的一些配置细节都必须相同, 而其他配置方面则需要基于每个 kubelet 进行设置,以适应给定机器的不同特性(例如操作系统、存储和网络)。 你可以手动地管理 kubelet 的配置,但是 kubeadm 现在提供一种 KubeletConfiguration API 类型 用于集中管理 kubelet 的配置。

二.kubeadm配置kubelet

1.配置模式

通过使用 kubeadm 简化 kubelet 配置模式,而不是在每个节点上手动地管理 kubelet 配置,不过也可以手动逐台配置kubelet。

kubeadm可以通过使用kubeadm inti 和kubeadm join 命令为kubelet提供默认值。也可以通过执行命令的时候传递参数,来自定义kubelet的配置。

例如:如果你想使用子网 10.96.0.0/12 作为services的默认网段,你可以给 kubeadm 传递 --service-cidr 参数

kubeadm init --service-cidr 10.96.0.0/16
在集群中的每个管理器和节点上的 kubelet 的设置需要相同。 kubelet 提供了一个版本化的结构化 API 对象, 该对象可以配置 kubelet 中的大多数参数,并将此配置推送到集群中正在运行的每个 kubelet 上。 此对象被称 为 KubeletConfiguration 。 KubeletConfiguration 允许用户指定标志,例如clusterDNS代表集群的 DNS IP 地址,示例配置如下所示:

   apiVersion: kubelet.config.k8s.io/v1beta1

    kind: KubeletConfiguration
    address: 0.0.0.0
    authentication:
      anonymous:
        enabled: false
      webhook:
        cacheTTL: 2m0s
        enabled: true
      x509:
        clientCAFile: /etc/kubernetes/pki/ca.crt
    authorization:
      mode: Webhook
      webhook:
        cacheAuthorizedTTL: 5m0s
        cacheUnauthorizedTTL: 30s
    cgroupDriver: cgroupfs
    cgroupsPerQOS: true
    clusterDNS:
    - 10.96.0.10
    clusterDomain: cluster.local
    resolvConf: /etc/resolv.conf

2.   kubeadm配置kubelet,传递自定义参数 

由于硬件、操作系统、网络或者其他主机特定参数的差异。某些主机需要特定的 kubelet 配置。下面列举一些常见的

1)--resolv-conf   指定的 DNS 解析文件的路径,不能配置错误。不同的操作系统之间可能有所不同, 它取决于你是否使用 systemd-resolved 。 如果此路径错误,则在其 kubelet 配置错误的节点上 DNS 解析也将失败。

2)--hostname-override 覆盖默认情况下 Node API 对象的 .metadata.name值。

3)--cgroup-driver  设置kubelet的cgroup的驱动程序,可选值为systemd和cgroupfs,推荐systemd。

4)--network-plugin=cni 使用docker运行时的使用的标识

5)--container-runtime=remote 使用其他非docker运行时的标识,并使用--container-runtime-endpoint=<path> 指定 CRI 端点。

你可以在服务管理器(例如 systemd)中设定某个 kubelet 的配置来指定这些参数。

3.kubeadm配置kubelet

1)查看kubeadm的kubelet的默认参数

kubeadm config print init-defaults --component-configs KubeletConfiguration

2)自定义 KubeletConfiguration的yaml文件

#初始化集群的时候指定KubeletConfiguration配置文件
kubeadm init --config some-config-file.yaml

#加入集群的时候指定KubeletConfiguration配置文件
kubeadm join --config some-config-file.yaml

4)使用 kubeadm init 时的工作流程

1)当调用 kubeadm init 时,kubelet 配置被编组到磁盘上的 /var/lib/kubelet/config.yaml 中。并且上传到集 群中的 ConfigMap。 ConfigMap 名为 kubelet-config-1.X ,其中 X 是你正在初始化的 kubernetes 版 本的次版本,例如集群版本是v1.17.11,ConfigMap 名为kubelet-config-1.17。

2)kubelet 配置文件写入 /etc/kubernetes/kubelet.conf,此配置文件指向允许 kubelet 与 API 服务器通信的客户端证书。

3)kubeadm 将环境文件写入 /var/lib/kubelet/kubeadm- flags.env ,其中包含了一个标志列表, 当 kubelet 启动时,该标志列表会传递给 kubelet 标志在文件中的显示方式如下

KUBELET_KUBEADM_ARGS="--flag1=value1 --flag2=value2 ..."
#我的集群默认如下,除了启动 kubelet 时使用该标志外,该文件还包含动态参数,例如 cgroup 驱动程序以及是否使用其他 CRI 运行时 socket( --cri-socket )
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1"

4)以上两个文件写入到节点磁盘后,如果使用 systemd,则 kubeadm 尝试运行以下两个命令

systemctl daemon-reload && systemctl restart kubelet
如果重新加载和重新启动成功,则正常的 kubeadm init 工作流程将继续

5)使用 kubeadm join 时的工作流程

1)当运行 kubeadm join 时,kubeadm 使用 Bootstrap Token 证书执行 TLS 引导,该引导会获取一份证书, 该证书需要下载 kubelet-config-1.X ConfigMap 并把它写入 /var/lib/kubelet/config.yaml 中。

2)kubelet 配置文件写入 /etc/kubernetes/kubelet.conf,此配置文件指向允许 kubelet 与 API 服务器通信的客户端证书。

3)以上两个文件写入到节点磁盘后,如果使用 systemd,则 kubeadm 尝试运行以下两个命令

systemctl daemon-reload && systemctl restart kubelet

在 kubelet 加载新配置后,kubeadm 将写入 /etc/kubernetes/bootstrap-kubelet.conf,此文件包含 CA 证书和引导程序令牌。 kubelet 使用这些证书执行 TLS 引导程序并获取唯一的凭据,该凭据被存 储在 /etc/kubernetes/kubelet.conf 中。 当此文件被写入后,kubelet 就完成了执行 TLS 引导程序。

6.kubelet systemd 文件

kubeadm 中附带了有关系统如何运行 kubelet 的 systemd 配置文件。 请注意 kubeadm CLI 命令不会修改 此文件。 通过 kubeadm DEB 或者 RPM 包 安装的配置文件被写入 /etc/systemd/system/kubelet.service.d/10- kubeadm.conf 并由系统使用。 它对原来的 RPM 版本 kubelet.service 或者 DEB 版本 kubelet.service 作 了增强

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" #这是 "kubeadm init" 和 "kubeadm join" 运行时生成的文件,主要是证书文件
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" #这是 "kubeadm init" 和 "kubeadm join" 运行时生成的文件, 主要的配置文件
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env #这是 "kubeadm init" 和 "kubeadm join" 运行时生成的文件, 动态地填充 KUBELET_KUBEADM_ARGS 变量 
EnvironmentFile=-/etc/default/kubelet #这是一个文件,用户在不得已下可以将其用作替代 kubelet args。用户最好使用 .NodeRegistration.KubeletExtraArgs 对象在配置文件中替代。# KUBELET_EXTRA_ARGS 应该从此文件中获取。
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

1)、用于 TLS 引导程序的 KubeConfig 文件为 /etc/kubernetes/bootstrap-kubelet.conf , 但仅当 /etc/kubernetes/kubelet.conf 不存在时才能使用。

2)具有唯一 kubelet 标识的 KubeConfig 文件为 /etc/kubernetes/kubelet.conf 。

3)包含 kubelet 的组件配置的文件为 /var/lib/kubelet/config.yaml 。

4)包含的动态环境的文件 KUBELET_KUBEADM_ARGS 是来源于 /var/lib/kubelet/kubeadm-flags.env 。

5)包含用户指定标志替代的文件 KUBELET_EXTRA_ARGS 是来源于 /etc/default/kubelet (对于 DEB),或者 /etc/sysconfig/kubelet (对于 RPM)。 KUBELET_EXTRA_ARGS 在标志链中排在最后,并且在设置冲突时具有最高优先级。

参考官方文档

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忍冬行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值