使用 kubeadm 配置集群中的每个 kubelet

特性状态: Kubernetes v1.11 [稳定]

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

由于 kubelet 是一个守护进程,因此需要某种 init 系统或服务管理器来维护。当使用 DEB 或 RPM 安装 kubelet 时,systemd 被配置为管理 kubelet。你可以使用不同的服务管理器,但需要手动配置。

某些 kubelet 配置细节需要在集群中涉及的所有 kubelet 上保持一致,而其他配置方面则需要根据每个 kubelet 进行设置,以适应给定机器的不同特性(例如 OS、存储和网络)。你可以手动管理 kubelet 的配置,但 kubeadm 现在提供了一个 KubeletConfiguration API 类型,用于集中管理 kubelet 配置

Kubelet 配置模式

以下部分描述了使用 kubeadm 简化 kubelet 配置而不是手动管理每个 Node 的 kubelet 配置的模式。

将集群级别配置传播到每个 kubelet

你可以为 kubelet 提供由 kubeadm initkubeadm join 命令使用的默认值。有趣的例子包括使用不同的容器运行时或设置服务使用的默认子网。

如果你想让服务使用子网 10.96.0.0/12 作为服务的默认值,你可以将 --service-cidr 参数传递给 kubeadm

kubeadm init --service-cidr 10.96.0.0/12

服务的虚拟 IP 现在从这个子网分配。你还需要设置 kubelet 使用的 DNS 地址,使用 --cluster-dns 标志。这个设置对于集群中每个管理器和 Node 上的每个 kubelet 都需要相同。kubelet 提供了一个带有版本、结构化的 API 对象,可以配置 kubelet 中的大多数参数,并将此配置推送给集群中每个正在运行的 kubelet。这个对象称为 KubeletConfigurationKubeletConfiguration 允许用户指定标志,例如集群 DNS IP 地址,以值列表的形式表达为 camelCased 键,如下例所示

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
clusterDNS:
- 10.96.0.10

有关 KubeletConfiguration 的更多详细信息,请参阅 本节

提供特定实例的配置细节

某些主机由于硬件、操作系统、网络或其他主机特定参数的不同而需要特定的 kubelet 配置。以下列表提供了一些示例。

  • DNS 解析文件的路径,由 --resolv-conf kubelet 配置标志指定,可能因操作系统或是否使用 systemd-resolved 而异。如果此路径错误,则其 kubelet 配置不正确的 Node 上的 DNS 解析将失败。

  • Node API 对象 .metadata.name 默认设置为机器的主机名,除非你使用云供应商。如果你需要指定一个与机器主机名不同的 Node 名称,可以使用 --hostname-override 标志来覆盖默认行为。

  • 目前,kubelet 无法自动检测容器运行时使用的 cgroup 驱动,但 --cgroup-driver 的值必须与容器运行时使用的 cgroup 驱动匹配,以确保 kubelet 的健康。

  • 要指定容器运行时,必须使用 --container-runtime-endpoint=<path> 标志设置其端点。

应用此类特定实例配置的推荐方法是使用 KubeletConfiguration 补丁

使用 kubeadm 配置 kubelet

如果通过一个配置文件(例如 kubeadm ... --config some-config-file.yaml)传递自定义的 KubeletConfiguration API 对象,就可以配置 kubeadm 将启动的 kubelet。

通过调用 kubeadm config print init-defaults --component-configs KubeletConfiguration,你可以看到此结构的所有默认值。

也可以在基础 KubeletConfiguration 之上应用特定实例的补丁。有关更多详细信息,请参阅 自定义 kubelet

使用 kubeadm init 时的流程

当你调用 kubeadm init 时,kubelet 配置被编组(marshalled)到磁盘上的 /var/lib/kubelet/config.yaml,并上传到集群的 kube-system 命名空间中的 kubelet-config ConfigMap。一个 kubelet 配置文件也写入 /etc/kubernetes/kubelet.conf,其中包含集群中所有 kubelet 的基准集群范围配置。此配置文件指向允许 kubelet 与 API 服务器通信的客户端证书。这解决了将集群级别配置传播到每个 kubelet 的需要。

为了解决提供特定实例配置细节的第二个模式,kubeadm 将一个环境文件写入 /var/lib/kubelet/kubeadm-flags.env,该文件包含在 kubelet 启动时传递给它的标志列表。标志在该文件中如下所示:

KUBELET_KUBEADM_ARGS="--flag1=value1 --flag2=value2 ..."

除了启动 kubelet 时使用的标志外,该文件还包含动态参数,例如 cgroup 驱动以及是否使用不同的容器运行时套接字(--cri-socket)。

将这两个文件编组到磁盘后,如果你使用的是 systemd,kubeadm 会尝试运行以下两个命令:

systemctl daemon-reload && systemctl restart kubelet

如果 reload 和 restart 成功,正常的 kubeadm init 流程会继续进行。

使用 kubeadm join 时的流程

当你运行 kubeadm join 时,kubeadm 使用引导令牌(Bootstrap Token)凭证执行 TLS 引导(TLS bootstrap),它会获取下载 kubelet-config ConfigMap 所需的凭证,并将其写入 /var/lib/kubelet/config.yaml。动态环境文件以与 kubeadm init 完全相同的方式生成。

接下来,kubeadm 运行以下两个命令将新配置加载到 kubelet 中:

systemctl daemon-reload && systemctl restart kubelet

在 kubelet 加载新配置后,kubeadm 写入 /etc/kubernetes/bootstrap-kubelet.conf KubeConfig 文件,其中包含 CA 证书和引导令牌(Bootstrap Token)。这些凭证由 kubelet 用于执行 TLS 引导(TLS Bootstrap)并获取一个唯一的凭证,该凭证存储在 /etc/kubernetes/kubelet.conf 中。

/etc/kubernetes/kubelet.conf 文件写入后,kubelet 已完成 TLS 引导(TLS Bootstrap)。kubeadm 在完成 TLS 引导后删除 /etc/kubernetes/bootstrap-kubelet.conf 文件。

systemd 的 kubelet drop-in 文件

kubeadm 附带了 systemd 应如何运行 kubelet 的配置。请注意,kubeadm CLI 命令从不触碰此 drop-in 文件。

kubeadm 安装的此配置文件写入 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 并由 systemd 使用。它补充了基本的 kubelet.service

如果你想要进一步覆盖它,可以创建一个目录 /etc/systemd/system/kubelet.service.d/ (不是 /usr/lib/systemd/system/kubelet.service.d/),并将你的自定义设置放入其中的一个文件中。例如,你可以添加一个新的本地文件 /etc/systemd/system/kubelet.service.d/local-overrides.conf 来覆盖由 kubeadm 配置的单元设置。

以下是你在 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 中可能会找到的内容:

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generate at runtime, populating
# the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably,
# the user should use the .NodeRegistration.KubeletExtraArgs object in the configuration files instead.
# KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

此文件指定了由 kubeadm 为 kubelet 管理的所有文件的默认位置。

  • 用于 TLS 引导的 KubeConfig 文件是 /etc/kubernetes/bootstrap-kubelet.conf,但仅当 /etc/kubernetes/kubelet.conf 不存在时才使用它。
  • 包含唯一 kubelet 身份的 KubeConfig 文件是 /etc/kubernetes/kubelet.conf
  • 包含 kubelet 的 ComponentConfig 的文件是 /var/lib/kubelet/config.yaml
  • 包含 KUBELET_KUBEADM_ARGS 的动态环境文件来源于 /var/lib/kubelet/kubeadm-flags.env
  • 可以包含带有 KUBELET_EXTRA_ARGS 的用户指定标志覆盖的文件来源于 /etc/default/kubelet (对于 DEB) 或 /etc/sysconfig/kubelet (对于 RPM)。KUBELET_EXTRA_ARGS 在标志链中最后,并且在设置冲突时具有最高优先级。

Kubernetes 二进制文件和包内容

Kubernetes 发布版本附带的 DEB 和 RPM 包是:

包名描述
kubeadm安装 /usr/bin/kubeadm CLI 工具和用于 kubelet 的 kubelet drop-in 文件
kubelet安装 /usr/bin/kubelet 二进制文件。
kubectl安装 /usr/bin/kubectl 二进制文件。
cri-toolscri-tools git 仓库 安装 /usr/bin/crictl 二进制文件。
kubernetes-cniplugins git 仓库 安装 /opt/cni/bin 二进制文件。
最后修改于 2024 年 3 月 12 日 下午 8:18 PST:修复 kubelet systemd 配置文件路径 (6b2e5dfac6)