- cgroup v2 有哪些优势">cgroup v2 有哪些优势
- 使用 cgroup v2 前提">使用 cgroup v2 前提
- 使用 cgroup v2">使用 cgroup v2
- 启用并检查 Linux 节点的 cgroup v2">启用并检查 Linux 节点的 cgroup v2
- kubelet 使用
<font style="color:rgb(0, 0, 0);">systemd cgroup</font>
驱动">kubelet 使用<font style="color:rgb(0, 0, 0);">systemd cgroup</font>
驱动 - containerd 使用 systemd cgroup 驱动">containerd 使用 systemd cgroup 驱动
- 升级监控组件以支持 cgroup v2 监控">升级监控组件以支持 cgroup v2 监控
- 总结">总结
- References
cgroup v2 有哪些优势
cgroup v2 提供了一个具有增强资源管理能力的统一控制系统。 cgroup v2 对 cgroup v1 进行了多项改进,例如:- API 中单个统一的层次结构设计
- 更安全的子树委派给容器
- 更新的功能特性,例如压力阻塞信息(Pressure Stall Information,PSI)
- 跨多个资源的增强资源分配管理和隔离
- 统一核算不同类型的内存分配(网络内存、内核内存等)
- 考虑非即时资源变化,例如页面缓存回写
使用 cgroup v2 前提
cgroup v2 具有以下要求:- 操作系统发行版启用 cgroup v2
- Ubuntu(从 21.10 开始,推荐 22.04+)
- Debian GNU/Linux(从 Debian 11 Bullseye 开始)
- Fedora(从 31 开始)
- RHEL 和类似 RHEL 的发行版(从 9 开始)
- …
- Linux 内核为 5.8 或更高版本
- 容器运行时支持 cgroup v2。例如:
- containerd v1.4 和更高版本
- cri-o v1.20 和更高版本
- kubelet 和容器运行时被配置为使用 systemd cgroup 驱动
使用 cgroup v2
这里以 Debian 11 Bullseye + containerd v1.4 为例。启用并检查 Linux 节点的 cgroup v2
Debian 11 Bullseye 默认已启用 cgroup v2。 可以通过如下命令验证:
stat -fc %T /sys/fs/cgroup/
- 对于 cgroup v2,输出为 cgroup2fs。
- 对于 cgroup v1,输出为 tmpfs。
<font style="color:rgb(0, 0, 0);">systemd.unified_cgroup_hierarchy=1</font>
,然后执行 <font style="color:rgb(0, 0, 0);">sudo update-grub</font>
📝Notes:如果是树莓派,标准 Raspberry Pi OS 安装时不会启用 cgroups。需要 cgroups 来启动 systemd 服务。可以通过将 cgroup_memory=1 cgroup_enable=memory <font style="color:black;">systemd.unified_cgroup_hierarchy=1</font>
附加到 /boot/cmdline.txt 来启用 cgroups。并重启生效
kubelet 使用 <font style="color:rgb(0, 0, 0);">systemd cgroup</font>
驱动
kubeadm 支持在执行 kubeadm init 时,传递一个 KubeletConfiguration 结构体。KubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驱动。
说明:在版本 1.22 中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段,kubeadm init 会将它设置为默认值 systemd。
这是一个最小化的示例,其中显式的配置了此字段:
这样一个配置文件就可以传递给 kubeadm 命令了:
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
说明: Kubeadm 对集群所有的节点,使用相同的 KubeletConfiguration。KubeletConfiguration 存放于 kube-system 命名空间下的某个 ConfigMap 对象中。 执行 init、join 和 upgrade 等子命令会促使 kubeadm 将 KubeletConfiguration 写入到文件 /var/lib/kubelet/config.yaml 中,继而把它传递给本地节点的 kubelet。
kubeadm init --config kubeadm-config.yaml
containerd 使用 systemd cgroup 驱动
编辑 /etc/containerd/config.toml:
[plugins.cri.containerd.runtimes.runc.options]
SystemdCgroup = true
升级监控组件以支持 cgroup v2 监控
📚️Reference: cgroup v2 使用一个与 cgroup v1 不同的 API,因此如果有任何应用直接访问cgroup 文件系统,则需要将这些应用更新为支持 cgroup v2 的版本。例如:- 一些第三方监控和安全代理可能依赖于 cgroup 文件系统。要将这些代理更新到支持 > cgroup v2 的版本。
- 如果以独立的 DaemonSet 的形式运行 cAdvisor 以监控 Pod 和容器,需将其更> 新到 v0.43.0 或更高版本。
- 如果使用 JDK,推荐使用 JDK 11.0.16 及更高版本或 JDK 15 及更高版本,以便> 完全支持 cgroup v2。
总结
Kubernetes 自 v1.25 起 cgroup2 特性正式 stable. cgroup2 相比 cgroup v1 有以下优势:- API 中单个统一的层次结构设计
- 更安全的子树委派给容器
- 更新的功能特性,例如压力阻塞信息(Pressure Stall Information,PSI)
- 跨多个资源的增强资源分配管理和隔离
- 统一核算不同类型的内存分配(网络内存、内核内存等)
- 考虑非即时资源变化,例如页面缓存回写
References
压力阻塞信息(Pressure Stall Information,PSI):https://www.kernel.org/doc/html/latest/accounting/psi.html
MemoryQoS:https://kubernetes.io/blog/2021/11/26/qos-memory-resources/
containerd:https://containerd.io/
cri-o:https://cri-o.io/
systemd cgroup 驱动:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes#systemd-cgroup-driver
ConfigMap:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap
cAdvisor:https://github.com/google/cadvisor
完全支持 cgroup v2:https://bugs.openjdk.org/browse/JDK-8230305
压力阻塞信息(Pressure Stall Information,PSI):https://www.kernel.org/doc/html/latest/accounting/psi.html
关于 cgroup v2 | Kubernetes:https://kubernetes.io/zh-cn/docs/concepts/architecture/cgroups/
配置 cgroup 驱动 | Kubernetes:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/#configuring-the-kubelet-cgroup-driver
容器运行时 | Kubernetes:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#containerd-systemd