K8s如何启用cgroup2支持?
什么是 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)
- 跨多个资源的增强资源分配管理和隔离
- 统一核算不同类型的内存分配(网络内存、内核内存等)
- 考虑非即时资源变化,例如页面缓存回写
一些 Kubernetes 特性专门使用 cgroup v2 来增强资源管理和隔离。 例如,MemoryQoS 特性改进了内存 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 v1.4 和更高版本
- cri-o v1.20 和更高版本
- kubelet 和容器运行时被配置为使用 systemd cgroup 驱动
使用 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 对象中。
执行 init、join 和 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 以监控 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)
- 跨多个资源的增强资源分配管理和隔离
- 统一核算不同类型的内存分配(网络内存、内核内存等)
- 考虑非即时资源变化,例如页面缓存回写
推荐在使用 Kubernetes v1.25及以上版本时, 使用支持 cgroup v2 的linux 和 CRI. 并启用 Kubernetes 的cgroup v2 功能.
️参考文档
本文由东风微鸣技术博客 EWhisper.cn 编写!
K8s如何启用cgroup2支持?的更多相关文章
- 检查浏览器是否已经启用Java支持功能
<script type="text/javascript"> document.write("navigator对象的方法"+"< ...
- Druid.io启用SQL支持
Druid.io的SQL功能虽然在试验阶段,但是也支持了大部分的功能,而且还可以通过 Avatica JDBC查看请求的json,有助于我们理解Druid.io的语法.Druid.io有个比较坑的是, ...
- 在Nginx/Openresty中启用http2支持
转自个人博客 chinazt.cc 以下摘自http2的介绍: HTTP/2 源自 SPDY/2 SPDY 系列协议由谷歌开发,于 2009 年公开.它的设计目标是降低 50% 的页面加载时间.当下很 ...
- 使用本地自签名证书为 React 项目启用 https 支持
简介 现在是大前端的时代,我们在本地开发 React 项目非常方便.这不是本文的重点,今天要分享一个话题是,如何为这些本地的项目,添加 https 的支持.为什么要考虑这个问题呢?主要有几个原因 如果 ...
- 【OF框架】在Visual Studio中启用Docker支持,编译生成,并在容器运行项目
准备 本地已经安装Docker 一.添加Docker支持 第一步:查看本地Docker服务状态 第二步:项目添加Docker支持 第三步:选择Linux容器 第四步:点击启动 第五步:确认Docker ...
- BIOS中未启用虚拟化支持系列~~例如:因此无法安装Hyper-V
异常处理汇总-服务器系列:http://www.cnblogs.com/dunitian/p/4522983.html 一般都是启动一下CUP虚拟化就可以了 比如华硕的:
- 二、启用Docker支持
一.使用
- linux4.1.36 2440 启用 RTC 支持
/drivers/rtc/rtc-s3c.c822行static struct platform_driver s3c_rtc_driver = { .probe = s3c_rt ...
- 启用Servlet 3.0新特性——注解支持
Servlet 3.0版本新增注解支持,可是在实际使用中,添加的注解总是不起作用.经过检查,原来是“web.xml”文件的顶级标签“<web-app/>”中的一个叫做“metadata-c ...
- nginx如何启用对HTTP2的支持 | nginx如何验证HTTP2是否已启用
nginx启用HTTP2特性 查看当前nginx的编译选项 1 #./nginx -V 2 3 nginx version: nginx/1.9.15 4 built by gcc 5.4.0 2 ...
随机推荐
- ELK技术-IK-中文分词器
1.背景 1.1 简介 ES默认的分词器对中文分词并不友好,所以一般会安装中文分词插件,以便能更好的支持中文分词检索. 本例参考文档:<一文教你掌握IK中文分词> 1.2 IK分词器 IK ...
- OpenHarmony3.0如何轻松连接华为云IoT设备接入平台?
摘要:本文主要介绍基于OpenHarmony 3.0版本来对接华为云IoT设备接入IoTDA,以小熊派BearPi-HM_Nano开发板为例,使用huaweicloud_iot_link SDK对接华 ...
- LyScript 内存扫描与查壳实现
LyScript 中提供了多种内存特征扫描函数,每一种扫描函数用法各不相同,在使用扫描函数时应首先搞清楚他们之间的差异,如下将分别详细介绍每一种内存扫描函数是如何灵活运用的,最后将实现一个简易版内存查 ...
- 消息队列的一些场景及源码分析,RocketMQ使用相关问题及性能优化
前文目录链接参考: 消息队列的一些场景及源码分析,RocketMQ使用相关问题及性能优化 https://www.cnblogs.com/yizhiamumu/p/16694126.html 消息队列 ...
- Vite+React搭建开发构建环境实践
前言 使用 Vite 已经有两年了,期间使用它开发过单页面应用,也开发过浏览器扩展插件,对比日常工作中用到的 webpack 构建速度大幅提升,开发体验也好很多. 虽然相比于 webpack 来说简单 ...
- Python数据科学手册-Numpy数组的计算,通用函数
Python的默认实现(CPython)处理某些操作非常慢,因为动态性和解释性, CPython 在每次循环必须左数据类型的检查和函数的调度..在编译是进行这样的操作.就会加快执行速度. 通用函数介绍 ...
- 如何从Django项目中删除或隐藏应用
1.项目的settings.py文件 INSTALLED_APPS中删除或者注释掉,这是针对数据库这一块儿的 2.项目的urls.py文件 删除或这注释掉应用的路径导入 urlpatterns中删除或 ...
- k8s控制器理解
DaemonSet 一个DaemonSet对象能确保其创建的Pod在集群中的每一台(或指定)Node上都运行一个副本.如果集群中动态加入了新的Node,DaemonSet中的Pod也会被添加在新加入N ...
- Vmware虚拟机设置主机端口映射
转载自:https://blog.csdn.net/Mrqiang9001/article/details/80820321
- 组件化开发2-安装cocoaPods
第一步:安装ruby 不能一上来就换ruby源.虽然mac自带了ruby,但是版本一般都偏低,如果不进行更新会导致版本依赖问题. 这里使用rvm来管理ruby,它允许共存多个ruby.RVM:Ruby ...