K8s如何启用cgroup2支持?

k8s,如何,启用,cgroup2,支持 · 浏览次数 : 562

小编点评

**cgroup 是什么?** cgroup 是 Linux 内核提供的控制组功能。它用于将进程组织成分层的组,并限制和监控各种资源的使用。 **cgroup 的作用是什么?** * 将进程组织成分层中的组。 * 限制和监控各种资源的使用。 * 对容器和云原生的底层技术栈提供控制。 **cgroup 的版本有哪些?** cgroup v1 和 cgroup v2 是不同的版本。 **cgroup v2 的优势有哪些?** * API 中单个统一的层次结构设计更安全的子树委派给容器更新的功能特性。 * 对 cgroup v1 进行了多项改进,例如: * API 中单个统一的层次结构设计更安全的子树委派给容器更新的功能特性。 * 压力阻塞信息(Pressure Stall Information,PSI)跨多个资源的增强资源分配管理和隔离统一核算不同类型的内存分配。 * 非即时资源变化,例如页面缓存回写一些 Kubernetes 特性专门使用 cgroup v2 来增强资源管理和隔离。 **使用 cgroup v2 的要求?** * 操作系统发行版启用 cgroup v2。 *容器运行时支持 cgroup v2。 **总结** cgroup 是一个强大的控制组功能,可以用于优化 Kubernetes 集群的性能和资源利用率。 cgroup v2 是 cgroup 的新一代 API,它具有更强大的性能和功能。

正文

什么是 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。例如:
  • 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 对集群所有的节点,使用相同的 KubeletConfigurationKubeletConfiguration 存放于 kube-system 命名空间下的某个 ConfigMap 对象中。

执行 initjoinupgrade 等子命令会促使 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支持?相似的内容:

K8s如何启用cgroup2支持?

什么是 cgroup 📚️Reference: control groups(控制组),通常被称为cgroup,是Linux内核的一项功能。它允许将进程组织成分层的组,然后限制和监控各种资源的使用。 内核的cgroup接口是通过一个叫做cgroupfs的伪文件系统提供的。 分组是在核心的cgrou

[转帖]k8s发布Spring cloud+eureka架构服务优雅启动停止方案

本文转载自昆仑枫的简书https://www.jianshu.com/p/6d393cbb694a Spring cloud+eureka是目前微服务主流解决方案之一,kubernetes则是广泛应用的发布工具,两者结合使用很常见。而两者结合时如何优雅启停从而实现无感发布很关键。下面将从不做特殊处理

DHorse日志收集原理

实现原理 基于k8s的日志收集主要有两种方案,一是使用daemoset,另一种是基于sidecar。两种方式各有优缺点,目前DHorse是基于daemoset实现的。如图1所示: 图1 在每个k8s集群中启动一个daemoset组件,即Filebeat的服务,监控/var/log/container

[转帖]记一次flannel网络调整

https://www.jianshu.com/p/a772e4b951f2 背景 最近给一个子公司部署一套k8s集群,集群搭建完之后有几个新需求需要新增几个node节点,在新增节点时发现添加失败,经过查询发现是网络规划问题导致。 flannel启动失败,报错信息如下:Error registeri

如何在 K8S 集群范围使用 imagePullSecret?

在这篇文章中,我将向你展示如何在 Kubernetes 中使用 imagePullSecrets。

有状态软件如何在 k8s 上快速扩容甚至自动扩容

概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机 安装依赖 下载安装包 按规范配置主机名, hosts 配置网络: 包括域名, DNS, 虚 ip, 防火墙... 配置监控 今天虚机环境上出现了问题, 是因为 RabbitMQ 资源不足.

批处理及有状态等应用类型在 K8S 上应该如何配置?

众所周知, Kubernetes(K8S)更适合运行无状态应用, 但是除了无状态应用. 我们还会有很多其他应用类型, 如: 有状态应用, 批处理, 监控代理(每台主机上都得跑), 更复杂的应用(如:hadoop 生态...). 那么这些应用可以在 K8S 上运行么? 如何配置? 其实, K8S 针对

【Azure APIM】APIM self-host 部署在K8S中,如何更换证书呢?

问题描述 APIM self-host(自建网关)部署在K8S中,如何在本地上传及更换证书呢? 问题解答 如果使用Self-host网关,则不支持使用上传到 APIM的 CA 根证书验证服务器和客户端证书。 若要建立信任,请配置特定的客户端证书,使其被网关作为一个自定义的证书颁发机构所信任,使用网关

K8S 实用工具之一 - 如何合并多个 kubeconfig?

开篇 📜 引言: 磨刀不误砍柴工 工欲善其事必先利其器 K8S 集群规模,有的公司倾向于少量大规模 K8S 集群,也有的公司会倾向于大量小规模的 K8S 集群。 如果是第二种情况,是否有一个简单的 kubectl 命令来获取一个 kubeconfig 文件并将其合并到 ~/.kube/config

K8S 实用工具之二 - 终端 UI K9S

开篇 📜 引言: 磨刀不误砍柴工 工欲善其事必先利其器 第一篇:《K8S 实用工具之一 - 如何合并多个 kubeconfig?》 像我这种,kubectl 用的不是非常溜,经常会碰到以下情况: 忘记命令,先敲 --help,再敲命令,效率低 忘记加 -n 指定 namespace 太长的命令经常