Edit This Page

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

FEATURE STATE: Kubernetes 1.11 [stable]

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

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

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

Kubelet 配置模式

以下各节讲述了通过使用 kubeadm 简化 kubelet 配置模式,而不是在每个节点上手动地管理 kubelet 配置。

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

您可以通过使用 kubeadm initkubeadm join 命令为 kubelet 提供默认值。 有趣的示例包括使用其他 CRI 运行时或通过服务器设置不同的默认子网。

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

kubeadm init --service-cidr 10.96.0.0/12

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

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

有关组件配置的更多详细信息,亲参阅 本节

提供指定实例的详细配置信息

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

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

  • 除非您使用云提供商,否则默认情况下,Node API 对象 .metadata.name 被设置为计算机的主机名。 如果您需要指定一个节点的名称与机器的主机名不同,您可以是使用 --hostname-override 标志覆盖默认操作。

  • 当前,kubelet 无法自动检测 CRI 运行时使用的 cgroup 驱动程序, 但是值 --cgroup-driver 必须与 CRI 运行时使用的 cgroup 驱动程序匹配,以确保 kubelet 的健康运行状况。

  • 根据您集群使用的 CRI 运行时,您可能需要为 kubelet 指定不同的标志。 例如,当使用 Docker 时,你要需要指定标志如 --network-plugin=cni,但是如果您使用的是外部运行时, 则需要指定 --container-runtime=remote 并使用 --container-runtime-path-endpoint=<path> 指定 CRI端点。

您可以在服务管理器(例如系统)中通过对单个的 kubelet 配置来指定这些标志。

使用 kubeadm 配置 kubelet

如果自定义的 KubeletConfiguration API 对象使用像 kubeadm ... --config some-config-file.yaml 这样的配置文件进行传递,则可以配置 kubeadm 启动的 kubelet。

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

也可以阅读 kubelet 配置组件的 API 参考来获取有关各个字段的更多信息。

当使用 kubeadm init时的工作流程

当调用 kubeadm init 时,kubelet 配置被编组到磁盘上的 /var/lib/kubelet/config.yaml 中, 并且上传到集群中的 ConfigMap。 ConfigMap 名为 kubelet-config-1.X,其中 .X 是您正在初始化的 kubernetes 版本的次版本。 在集群中所有 kubelet 的基准集群范围内配置,将 kubelet 配置文件写入 /etc/kubernetes/kubelet.conf 中。 此配置文件指向允许 kubelet 与 API 服务器通信的客户端证书。 这解决了 将集群级配置传播到每个 kubelet的需求。

该文档 提供特定实例的配置详细信息 是第二种解决模式, kubeadm 将环境文件写入 /var/lib/kubelet/kubeadm-flags.env,其中包含了一个标志列表, 当 kubelet 启动时,该标志列表会传递给 kubelet 标志在文件中的显示方式如下:

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

除了启动 kubelet 时使用该标志外,该文件还包含动态参数,例如 cgroup 驱动程序以及是否使用其他 CRI 运行时 socket(--cri-socket)。

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

systemctl daemon-reload && systemctl restart kubelet

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

当使用 kubeadm join时的工作流程

当运行 kubeadm join 时,kubeadm 使用 Bootstrap Token 证书执行 TLS 引导,该引导会获取一份证书,该证书需要下载 kubelet-config-1.X 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 证书和引导程序令牌。 kubelet 使用这些证书执行 TLS 引导程序并获取唯一的凭据,该凭据被存储在 /etc/kubernetes/kubelet.conf 中。 当此文件被写入后,kubelet 就完成了执行 TLS 引导程序。

系统中的 kubelet 插件

kubeadm 中附带了有关系统如何运行 kubelet 的配置。 请注意 kubeadm CLI 命令不会触及此插件。

通过 kubeadm DEB 或者 RPM 包 安装的配置文件已被写入 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 并由系统使用。 它加强了基础设施 kubelet.service for RPM (resp. kubelet.service for DEB)):

[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"
# 这是 "kubeadm init" 和 "kubeadm join" 运行时生成的文件,动态地填充 KUBELET_KUBEADM_ARGS 变量
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# 这是一个文件,用户在不得已下可以将其用作替代 kubelet args。
# 用户最好使用 .NodeRegistration.KubeletExtraArgs 对象在配置文件中替代。
# KUBELET_EXTRA_ARGS 应该从此文件中获取。
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

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

  • 用于 TLS 引导程序的 KubeConfig 文件为 /etc/kubernetes/bootstrap-kubelet.conf, 但仅当 /etc/kubernetes/kubelet.conf 不存在时才能使用。
  • 具有唯一 kubelet 标识的 KubeConfig 文件为 /etc/kubernetes/kubelet.conf
  • 包含 kubelet 的组件配置的文件为 /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 软件包是:

Package nameDescription
kubeadm给 kubelet 安装 /usr/bin/kubeadm CLI 工具和 kubelet 插件
kubelet安装 /usr/bin/kubelet 二进制文件和 /opt/cni/bin CNI 二进制文件。
kubectl安装 /usr/bin/kubectl 二进制文件。
cri-toolscri-tools git 仓库中安装 /usr/bin/crictl 二进制文件。