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

注意: 自 1.24 版本起,Dockershim 已从 Kubernetes 项目中移除。请阅读 Dockershim 移除常见问题解答以获取更多详情。
特性状态: Kubernetes v1.11 [稳定]

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

由于 kubelet 是一个守护进程,它需要由某种初始化系统或服务管理器进行维护。当使用 DEB 或 RPM 安装 kubelet 时,systemd 会被配置为管理 kubelet。你也可以使用其他服务管理器,但需要手动配置它。

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

Kubelet 配置模式

以下章节描述了通过使用 kubeadm 简化的 kubelet 配置模式,而不是手动为每个节点管理 kubelet 配置。

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

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

如果你希望你的服务将 10.96.0.0/12 子网作为服务的默认子网,你可以向 kubeadm 传递 --service-cidr 参数

kubeadm init --service-cidr 10.96.0.0/12

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

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

有关 KubeletConfiguration 的更多详细信息,请查看此章节

提供实例特定的配置详情

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

  • --resolv-conf kubelet 配置标志指定的 DNS 解析文件路径在不同操作系统之间可能有所不同,或者取决于你是否正在使用 systemd-resolved。如果此路径错误,kubelet 配置不正确的节点上的 DNS 解析将会失败。

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

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

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

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

使用 kubeadm 配置 kubelet

如果通过配置文件传递自定义的 KubeletConfiguration API 对象,例如 kubeadm ... --config some-config-file.yaml,则可以配置 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。此外,kubeadm 工具会检测节点上的 CRI 套接字,并将其详细信息(包括套接字路径)写入本地配置 /var/lib/kubelet/instance-config.yaml 中。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 驱动。

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

systemctl daemon-reload && systemctl restart kubelet

如果重新加载和重启成功,正常的 kubeadm init 流程将继续。

使用 kubeadm join 时的操作流程

当你运行 kubeadm join 时,kubeadm 使用引导令牌(Bootstrap Token)凭证执行 TLS 引导,该凭证获取下载 kubelet-config ConfigMap 所需的凭证,并将其写入 /var/lib/kubelet/config.yaml。此外,kubeadm 工具会检测节点上的 CRI 套接字,并将其详细信息(包括套接字路径)写入本地配置 /var/lib/kubelet/instance-config.yaml 中。动态环境文件的生成方式与 kubeadm init 完全相同。

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

systemctl daemon-reload && systemctl restart kubelet

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

/etc/kubernetes/kubelet.conf 文件被写入时,kubelet 已完成 TLS 引导。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(对于 DEBs)或 /etc/sysconfig/kubelet(对于 RPMs)。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-cni插件 git 仓库安装 /opt/cni/bin 二进制文件。

最后修改时间:2025 年 7 月 4 日 晚上 11:28 PST:将 NodeLocalCRISocket 升级到 Beta 版本 (0135b1b08b) 的文档添加