使用 kubeadm 配置集群中每个 kubelet
Kubernetes v1.11 [稳定]
kubeadm CLI 工具的生命周期与 kubelet 解耦,kubelet 是在 Kubernetes 集群中每个节点上运行的守护进程。 kubeadm CLI 工具在 Kubernetes 初始化或升级时由用户执行,而 kubelet 始终在后台运行。
由于 kubelet 是守护进程,因此需要由某种 init 系统或服务管理器来维护。 当使用 DEB 或 RPM 安装 kubelet 时,系统会配置 systemd 来管理 kubelet。 你可以使用不同的服务管理器,但你需要手动配置它。
一些 kubelet 配置详细信息需要在集群中涉及的所有 kubelet 中保持相同,而其他配置方面需要根据每个 kubelet 进行设置,以适应给定机器的不同特性(例如操作系统、存储和网络)。 你可以手动管理你的 kubelet 配置,但 kubeadm 现在提供了一个 KubeletConfiguration
API 类型,用于集中管理你的 kubelet 配置。
Kubelet 配置模式
以下部分描述了通过使用 kubeadm 简化的 kubelet 配置模式,而不是手动管理每个节点的 kubelet 配置。
将集群级配置传播到每个 kubelet
你可以为 kubelet 提供 kubeadm init
和 kubeadm join
命令使用的默认值。 有趣的示例包括使用不同的容器运行时或设置服务使用的默认子网。
如果你希望你的服务使用子网 10.96.0.0/12
作为服务的默认子网,你可以将 --service-cidr
参数传递给 kubeadm
kubeadm init --service-cidr 10.96.0.0/12
服务的虚拟 IP 现在将从此子网分配。 你还需要使用 --cluster-dns
标志设置 kubelet 使用的 DNS 地址。 此设置对于集群中每个管理器和节点上的每个 kubelet 都需要相同。 kubelet 提供了一个版本化的、结构化的 API 对象,该对象可以配置 kubelet 中的大多数参数,并将此配置推送给集群中每个正在运行的 kubelet。 这个对象称为 KubeletConfiguration
。 KubeletConfiguration
允许用户指定标志,例如以驼峰式大小写键表示的一系列值的集群 DNS IP 地址,如下例所示
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
clusterDNS:
- 10.96.0.10
有关 KubeletConfiguration
的更多详细信息,请查看本节。
提供实例特定的配置详细信息
由于硬件、操作系统、网络或其他主机特定参数的差异,某些主机需要特定的 kubelet 配置。 以下列表提供了一些示例。
DNS 解析文件的路径(由
--resolv-conf
kubelet 配置标志指定)在操作系统之间可能有所不同,或者取决于你是否正在使用systemd-resolved
。 如果此路径错误,则 DNS 解析将在配置不正确的节点的 kubelet 上失败。默认情况下,除非你正在使用云提供商,否则节点 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 配置将编组到磁盘上的 /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
如果重新加载和重新启动成功,则正常的 kubeadm init
工作流程将继续。
使用 kubeadm join
时的工作流程
当你运行 kubeadm join
时,kubeadm 会使用引导令牌凭据执行 TLS 引导,从而获取下载 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 证书和引导令牌。 这些由 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
(对于 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-tools | 从 cri-tools git 仓库 安装 /usr/bin/crictl 二进制文件。 |
kubernetes-cni | 从 plugins git 仓库 安装 /opt/cni/bin 二进制文件。 |