一个计算机技术爱好者与学习者

0%

kubelet修改工作目录

1. 需求描述

kubelet的默认工作目录(存储目录)是/var/lib/kubelet,会存放volume文件(包括emptyDir volume)、plugin文件等,默认挂载在系统盘。

而系统盘一般都不会太大,因此最好把kubelet工作目录更改到数据盘。

本文中,我们会把docker的工作目录从/var/lib/kubelet改到/data/kubelet,其中/data目录挂载了数据盘。

2. 思路

想到两个方法:

  • 修改配置法:拷贝数据到新目录,修改工作目录配置到新目录。
  • 软链法:拷贝数据到新目录,使用新目录的软链替换原来的工作目录。不推荐,不知道有没有什么隐藏坑。

修改kubelet配置之前,为了保证不影响节点上的服务,最好先对节点操作禁止调度和驱逐。

3. 修改配置法

1、停止kubelet

1
systemctl stop kubelet

2、拷贝kubelet工作目录数据文件到新路径

1
2
3
4
5
mkdir -p /data/kubelet
cp -rf /var/lib/kubelet/pods /data/kubelet/
cp -rf /var/lib/kubelet/pod-resources /data/kubelet/
mv /var/lib/kubelet/pods{,.old}
mv /var/lib/kubelet/pod-resources{,.old}

注意,以下文件和目录一定要保留在老路径,不要移动和删除

  • /var/lib/kubelet/config.yaml
  • /var/lib/kubelet/kubeadm-flags.env
  • /var/lib/kubelet/pki
  • /var/lib/kubelet/device-plugins

3、添加或修改 /etc/sysconfig/kubelet 配置文件,添加root-dir参数

1
KUBELET_EXTRA_ARGS="--root-dir=/data/kubelet"

PS:如果是ubuntu系统,则要修改 /etc/default/kubelet 配置文件

4、重启kubelet

1
2
systemctl daemon-reload && systemctl restart kubelet
systemctl status kubelet

5、确认工作目录

1
ps -aux | grep kubelet | grep root-dir

PS:如果kubelet启动失败,可以通过查看kubelet详细日志进行排查。

1
journalctl -xu kubelet -r

6、清理旧工作目录(可选)

1
2
rm /var/lib/kubelet/pods.old -rf
rm /var/lib/kubelet/pod-resources.old -rf

4. 软链法

1、停止kubelet

1
systemctl stop kubelet

2、拷贝kubelet数据文件到新路径

1
2
3
mkdir -p /data/kubelet
cp -rf /var/lib/kubelet/. /data/kubelet
mv /var/lib/kubelet /var/lib/kubelet.old

3、创建软链

1
ln -s /data/kubelet /var/lib/kubelet

4、启动kubelet

1
2
systemctl daemon-reload && systemctl restart kubelet
systemctl status kubelet

5、确认工作目录

1
ps -aux | grep kubelet | grep root-dir

6、清理旧工作目录(可选)

1
rm /var/lib/kubelet.old -rf

5. kubeadm指定kubelet工作目录

与其临渴掘井,不如未雨绸缪。能否在使用kubeadm部署k8s集群的时候,直接指定好kubelet的工作目录?必须是可以的。

在执行kubeadm init之前,修改kubeadm.conf文件,添加kubeletExtraArgs字段。

1
2
3
4
5
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
root-dir: "/data/kubelet"

参考文档:

6. kubeadm部署kubelet原理

本节属于扩展阅读。
在修改kubelet工作目录时,走了很多弯路。其实如果熟悉kubeadm部署kubelet的原理,会发现修改kubelet工作目录是很简单的。
好好读文档!好好读文档!好好读文档!

参考文档:

6.1. 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_KUBEADM_ARGS

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

1
systemctl daemon-reload && systemctl restart kubelet

6.2. kubeadm join 时的工作流程

当运行 kubeadm join 时,kubeadm 使用 Bootstrap Token 证书执行 TLS 引导,该引导会获取一份证书, 该证书需要下载 kubelet-config ConfigMap 并把它写入 /var/lib/kubelet/config.yaml 中。 动态环境文件的生成方式恰好与 kubeadm init 完全相同。

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

1
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 文件。

6.3. kubelet 的 systemd drop-in 文件

通过 kubeadm DEB 包 或者 RPM 包 安装的配置文件被写入 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 并由 systemd 使用。它对原来的 RPM 版本 kubelet.service 或者 DEB 版本 kubelet.service 做了增强。

10-kubeadm.conf 示例内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
[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

参数说明:

  • 用于 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 在标志链中排在最后,并且在设置冲突时具有最高优先级。

6.4. 指定kubelet工作目录

通过上面的原理我们了解到,对于kubelet,可以在KUBELET_KUBEADM_ARGS或者KUBELET_EXTRA_ARGS标志列表中添加root-dir标志,指定kubelet的工作目录。

方法一:/var/lib/kubelet/kubeadm-flags.env 中添加标志

1
KUBELET_KUBEADM_ARGS="--root-dir=/data/kubelet"

方法二:/etc/sysconfig/kubelet 中添加标志

1
KUBELET_EXTRA_ARGS="--root-dir=/data/kubelet"

添加标志后,重启kubelet即可。

也可以在部署k8s集群时一步到位指定kubelet工作目录,具体操作方法参考【kubeadm指定kubelet工作目录】一节。

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-kubelet-root-dir/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~