k8s cgroup配置和验证

非常好,现在我们来系统讲解两部分:

---

## ✅ 第一部分:用 `cat /proc/$(pidof containerd)/cgroup` 验证各类 kubelet cgroup 参数配置

### 示例命令:

```bash
cat /proc/$(pidof containerd)/cgroup
```

### 示例输出(假设):

```
12:devices:/system.slice/containerd.service
11:memory:/system.slice/containerd.service
10:cpu,cpuacct:/system.slice/containerd.service
9:cpuset:/kubepods.slice/kubepods-besteffort.slice
...
```

### 对照分析表:

| kubelet 参数                   | 是否可从 `cgroup` 文件中判断 | 验证方法及说明                                                                                           |
| ---------------------------- | ------------------- | ------------------------------------------------------------------------------------------------- |
| `--cgroup-driver`            | ✅                   | - 如果路径中含 `system.slice/...`,则为 `systemd`<br>- 如果路径为 `/kubepods/...` 或 `/docker/...`,则为 `cgroupfs` |
| `--cgroup-root`              | ✅(推测)               | - 观察路径是否以 `/kubepods` 开头;为空时由 container runtime 决定;通常是 `/kubepods`                                |
| `--runtime-cgroups`          | ✅                   | - 路径为 `/system.slice/containerd.service` 表示 runtime 被绑定到此 cgroup,这就是默认 runtime 的控制组路径             |
| `--system-cgroups`           | ❌(间接)               | - 无法从 containerd 本身判断是否启用 system-cgroups;需看 kubelet 是否显式传参或配置文件                                   |
| `--kubelet-cgroups`          | ❌                   | - kubelet 进程 PID 通常与 containerd 分离<br>需要使用:`cat /proc/$(pidof kubelet)/cgroup` 判断其运行在哪个 cgroup    |
| `--system-reserved-cgroup`   | ❌                   | - 无法直接看出;需结合 `--system-reserved` 配置是否存在                                                           |
| `--enforce-node-allocatable` | ❌                   | - 需从 kubelet 配置文件 `/var/lib/kubelet/config.yaml` 查看该字段是否包含 `system-reserved`、`kube-reserved` 等项   |

---

## ✅ 第二部分:`systemd` vs `cgroupfs` 区别与判断方法

### 🔧 两种 cgroup 驱动区别:

| 驱动类型       | 路径结构示例                                           | 优点                              | 使用场景                      |
| ---------- | ------------------------------------------------ | ------------------------------- | ------------------------- |
| `systemd`  | `/sys/fs/cgroup/system.slice/containerd.service` | 与系统进程管理统一,兼容 systemd 日志、资源隔离更清晰 | 推荐,现代系统如 Ubuntu/CentOS 8+ |
| `cgroupfs` | `/sys/fs/cgroup/cpu/docker/<container-id>`       | 独立管理更灵活                         | 老系统、使用 Docker 默认          |

### 🔍 判断系统当前使用的 cgroup 驱动方法:

#### 方法 1:查看 kubelet 使用的 cgroup 驱动

```bash
ps -ef | grep kubelet
```

查找是否有 `--cgroup-driver=systemd` 或 `--cgroup-driver=cgroupfs`

#### 方法 2:查看 containerd 使用的驱动

```bash
cat /etc/containerd/config.toml | grep SystemdCgroup
```

输出示例:

```toml
SystemdCgroup = true  # 表示使用 systemd
```

#### 方法 3:直接看 containerd 的 cgroup 路径

```bash
cat /proc/$(pidof containerd)/cgroup
```

* 如果路径中包含 `system.slice` → 使用 `systemd`
* 如果是 `/docker`、`/kubepods`、`/` → 使用 `cgroupfs`

---

## ✅ 最终建议

你可以 **使用以下命令配合判断所有相关配置**:

```bash
cat /proc/$(pidof containerd)/cgroup
cat /proc/$(pidof kubelet)/cgroup
cat /etc/containerd/config.toml | grep SystemdCgroup
ps -ef | grep kubelet
```

如果你希望我帮你分析具体输出,可贴出这些命令的实际输出内容,我可以逐条解释是否匹配你的 kubelet 配置目标。你现在使用的是 containerd 还是 Docker?系统是基于 systemd 吗?

 

 

posted on 2025-05-07 12:48  吃草的青蛙  阅读(92)  评论(0)    收藏  举报

导航