如何在 Kubernetes 中快速启用 Cgroup V2 支持

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

302b9e0e687d7de84134f8ae8a2a06cd.png

什么是 cgroup

📚️Reference:

control groups(控制组),通常被称为cgroup,是Linux内核的一项功能。它允许将进程组织成分层的组,然后限制和监控各种资源的使用。内核的cgroup接口是通过一个叫做cgroupfs的伪文件系统提供的。分组是在核心的cgroup内核代码中实现的,而资源跟踪和限制是在一组每个资源类型的子系统中实现的(内存、CPU等等)。

cgroup 是容器和云原生的底层技术栈. kubelet 和 CRI 都需要对接 cgroup 来强制执行为 Pod 和容器管理资源,即: requests/limits 和 cpu/memory。

Linux 中有两个 cgroup 版本:cgroup v1 和 cgroup v2。cgroup v2 是新一代的 cgroup API。

Kubernetes 自 v1.25 起 cgroup2 特性正式 stable.

cgroup v2 有哪些优势

📚️Reference:

cgroup v2 提供了一个具有增强资源管理能力的统一控制系统。

cgroup v2 对 cgroup v1 进行了多项改进,例如:

•API 中单个统一的层次结构设计•更安全的子树委派给容器•更新的功能特性, 例如压力阻塞信息(Pressure Stall Information,PSI)[1]•跨多个资源的增强资源分配管理和隔离•统一核算不同类型的内存分配(网络内存、内核内存等)•考虑非即时资源变化,例如页面缓存回写

一些 Kubernetes 特性专门使用 cgroup v2 来增强资源管理和隔离。例如,MemoryQoS[2] 特性改进了内存 QoS 并依赖于 cgroup v2 原语。

使用 cgroup v2 前提

📚️Reference:

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[3] v1.4 和更高版本•cri-o[4] v1.20 和更高版本•kubelet 和容器运行时被配置为使用 systemd cgroup 驱动[5]

使用 cgroup v2

📝Notes:

这里以 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

如果没有启用, 可以通过在 /etc/default/grub 下的 GRUB_CMDLINE_LINUX 中添加 systemd.unified_cgroup_hierarchy=1, 然后执行 sudo update-grub

📝Notes: 如果是树莓派, 标准 Raspberry Pi OS 安装时不会启用 cgroups。需要 cgroups 来启动 systemd 服务。可以通过将 cgroup_memory=1 cgroup_enable=memory systemd.unified_cgroup_hierarchy=1 附加到 /boot/cmdline.txt 来启用 cgroups。并重启生效

kubelet 使用 systemd cgroup 驱动

kubeadm 支持在执行 kubeadm init 时,传递一个 KubeletConfiguration 结构体。 KubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驱动。

说明: 在版本 1.22 中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm init 会将它设置为默认值 systemd

这是一个最小化的示例,其中显式的配置了此字段:

# 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 命令了:

kubeadm init --config kubeadm-config.yaml

说明:

Kubeadm 对集群所有的节点,使用相同的 KubeletConfiguration。 KubeletConfiguration 存放于 kube-system 命名空间下的某个 ConfigMap[6] 对象中。

执行 initjoin 和 upgrade 等子命令会促使 kubeadm 将 KubeletConfiguration 写入到文件 /var/lib/kubelet/config.yaml 中, 继而把它传递给本地节点的 kubelet。

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[7] 以监控 Pod 和容器, 需将其更新到 v0.43.0 或更高版本。•如果你使用 JDK,推荐使用 JDK 11.0.16 及更高版本或 JDK 15 及更高版本, 以便完全支持 cgroup v2[8]

完成🎉🎉🎉

总结

Kubernetes 自 v1.25 起 cgroup2 特性正式 stable. cgroup2 相比 cgroup v1 有以下优势:

•API 中单个统一的层次结构设计•更安全的子树委派给容器•更新的功能特性, 例如压力阻塞信息(Pressure Stall Information,PSI)[9]•跨多个资源的增强资源分配管理和隔离•统一核算不同类型的内存分配(网络内存、内核内存等)•考虑非即时资源变化,例如页面缓存回写

推荐在使用 Kubernetes v1.25及以上版本时, 使用支持 cgroup v2 的linux 和 CRI. 并启用 Kubernetes 的cgroup v2 功能.

References

[1] 压力阻塞信息(Pressure Stall Information,PSI): https://www.kernel.org/doc/html/latest/accounting/psi.html
[2] MemoryQoS: https://kubernetes.io/blog/2021/11/26/qos-memory-resources/
[3] containerd: https://containerd.io/
[4] cri-o: https://cri-o.io/
[5] systemd cgroup 驱动: https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes#systemd-cgroup-driver
[6] ConfigMap: https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap
[7] cAdvisor: https://github.com/google/cadvisor
[8] 完全支持 cgroup v2: https://bugs.openjdk.org/browse/JDK-8230305
[9] 压力阻塞信息(Pressure Stall Information,PSI): https://www.kernel.org/doc/html/latest/accounting/psi.html
[10] 关于 cgroup v2 | Kubernetes: https://kubernetes.io/zh-cn/docs/concepts/architecture/cgroups/
[11] 配置 cgroup 驱动 | Kubernetes: https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/#configuring-the-kubelet-cgroup-driver
[12] 容器运行时 | Kubernetes: https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#containerd-systemd

本文转载自:「东风微鸣技术博客」,原文:https://url.hi-linux.com/pr6Yz,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

b28f368b56d822e7ba8e3d48172f3968.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

a415487355880ff623d40756c2400d12.png

你可能还喜欢

点击下方图片即可阅读

30bfd70bdc1ebf1f4c50a30c7f5ea47e.jpeg

Phantun: 一款突破运营商 QoS 封锁的高性能 UDP 流量伪装工具,支持 WireGuard 协议

c8d5fc12009e8fb760f5e7f91ea8e7b9.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

09ffd258d0d8445f881d63b55f62b5ba.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值