kubernetes-guide/content/best-practices/ops/securely-modify-container-r...

54 lines
2.6 KiB
Markdown
Raw Normal View History

2023-10-13 13:37:29 +08:00
# 安全变更容器数据盘路径
本文介绍如何安全的对容器的数据盘路径进行变更。
## Docker 运行时
### 注意事项
如果节点上容器运行时是 Docker想要变更 Docker Root Dir需要谨慎一点。如果操作不慎可能造成采集不到容器监控数据因为容器监控数据由 kubelet 的 cadvisor 模块提供,而由于 docker 没有实现 CRI 接口cadvisor 会对 Docker 有一些特殊处理: 在刚启动时,通过 `docker info` 获取 `Docker Root Dir` 路径,后续逻辑会依赖这个路径。
如果在 kubelet 运行过程中,改了 `Docker Root Dir`cadvisor 并不会更新路径,仍然认为路径是之前的,就会造成 kubelet 不能正常返回监控指标并且报类似如下的错:
```txt
Mar 21 02:59:26 VM-67-101-centos kubelet[714]: E0321 02:59:26.320938 714 manager.go:1086] Failed to create existing container: /kubepods/burstable/podb267f18b-a641-4004-a660-4c6a43b6e520/03164d8f0d1f55a285b50b2117d6fdb2c33d2fa87f46dba0f43b806017607d03: failed to identify the read-write layer ID for container "03164d8f0d1f55a285b50b2117d6fdb2c33d2fa87f46dba0f43b806017607d03". - open /var/lib/docker/image/overlay2/layerdb/mounts/03164d8f0d1f55a285b50b2117d6fdb2c33d2fa87f46dba0f43b806017607d03/mount-id: no such file or directory
```
2024-04-20 10:24:00 +08:00
> 参考 [排障案例: cAdvisor 无数据](https://imroc.cc/kubernetes-troubleshooting/methods/node/cadvisor-no-data)。
2023-10-13 13:37:29 +08:00
### 变更步骤
2024-04-10 16:28:24 +08:00
1. 驱逐节点(`kubectl drain NODE`),让存量 Pod 漂移到其它节点上,参考 [安全维护或下线节点](securely-maintain-or-offline-node)。
2023-10-13 13:37:29 +08:00
2. 修改 dockerd 配置文件 `/etc/docker/daemon.json`:
```json
{
"graph": "/data/docker"
}
```
3. 重启 dockerd:
```bash
systemctl restart docker
# systemctl restart dockerd
```
4. 重启 kubelet
```bash
systemctl restart kubelet
```
5. 节点恢复为可调度状态: `kubectl uncordon NODE`
## 其它运行时
2024-04-10 16:28:24 +08:00
其它运行时都实现了 CRI 接口,变更容器 Root Dir 就不需要那么严谨,不过安全起见,还是建议先安全的将节点上存量 Pod 驱逐走(参考 [安全维护或下线节点](securely-maintain-or-offline-node)),然后再修改运行时配置并重启容器运行时。
2023-10-13 13:37:29 +08:00
配置修改方式参考对应运行时的官方文档,这里以常用的 `containerd` 为例:
1. 修改 `/etc/containerd/config.toml`:
```toml
root = "/data/containerd"
```
2. 重启 containerd:
```bash
systemctl restart containerd
```
2024-04-10 16:27:39 +08:00
3. 节点恢复为可调度状态: `kubectl uncordon NODE`