K8s 选 cgroupfs 还是 systemd?这是一个问题

0fd131ebbd7c4ba75e48b68fb853817c.gif

本文转自 DevopsApple,原文:https://xyz.uscwifi.xyz/post/C6TKCS8wZ/,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang

什么是 cgroup

Cgroup 是一个 Linux 内核特性,对一组进程的资源使用(CPU、内存、磁盘 I/O 和网络等)进行限制、审计和隔离。

cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合 (或分隔) 到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子 (hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。

什么是 cgroupfs

docker 默认的 Cgroup Driver 是 cgroupfs

$ docker info | grep cgroup
 Cgroup Driver: cgroupfs

Cgroup 提供了一个原生接口并通过 cgroupfs 提供(从这句话我们可以知道 cgroupfs 就是 Cgroup 的一个接口的封装)。类似于 procfs 和 sysfs,是一种虚拟文件系统。并且 cgroupfs 是可以挂载的,默认情况下挂载在 /sys/fs/cgroup 目录。

什么是 Systemd?

Systemd 也是对于 Cgroup 接口的一个封装。systemd 以 PID1 的形式在系统启动的时候运行,并提供了一套系统管理守护程序、库和实用程序,用来控制、管理 Linux 计算机操作系统资源。

为什么使用 systemd 而不是 croupfs

这里引用以下 kubernetes 官方的原话[1]:

当某个 Linux 系统发行版使用 systemd[2] 作为其初始化系统时,初始化进程会生成并使用一个 root 控制组(cgroup),并充当 cgroup 管理器。Systemd 与 cgroup 集成紧密,并将为每个 systemd 单元分配一个 cgroup。你也可以配置容器运行时和 kubelet 使用 cgroupfs。连同 systemd 一起使用 cgroupfs 意味着将有两个不同的 cgroup 管理器。

单个 cgroup 管理器将简化分配资源的视图,并且默认情况下将对可用资源和使用 中的资源具有更一致的视图。 当有两个管理器共存于一个系统中时,最终将对这些资源产生两种视图。在此领域人们已经报告过一些案例,某些节点配置让 kubelet 和  docker 使用 cgroupfs,而节点上运行的其余进程则使用 systemd; 这类节点在资源压力下 会变得不稳定。

ubuntu 系统,debian 系统,centos7 系统,都是使用 systemd 初始化系统的。systemd 这边已经有一套 cgroup 管理器了,如果容器运行时和 kubelet 使用 cgroupfs,此时就会存在 cgroups 和 systemd 两种 cgroup 管理器。也就意味着操作系统里面存在两种资源分配的视图,当操作系统上存在 CPU,内存等等资源不足的时候,操作系统上的进程会变得不稳定。

我们可以简单得理解为一山不要容二虎,一个国家只能有一个国王。

注意事项: 不要尝试修改集群里面某个节点的 cgroup 驱动,如果有需要,最好移除该节点重新加入。

如何修改 docker 默认的 cgroup 驱动

增加 "exec-opts": ["native.cgroupdriver=systemd"] 配置 , 重启 docker 即可

$ cat /etc/docker/daemon.json 
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}

kubelet 配置 cgroup 驱动

参考官方[3]

说明: 在版本 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

引用链接

[1]

原话: https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#cgroup-drivers

[2]

systemd: https://www.freedesktop.org/wiki/Software/systemd/

[3]

官方: https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/

fda8a1ae1352cbb6751a90376e434782.gif

95f0e78b57fe0ebd25af8d9d60074f3a.png

你可能还喜欢

点击下方图片即可阅读

Kubernetes 中 CPU 调度管理的现状与限制

2022-07-12

87f9ae0105c9d67bddf902a658ca05f1.jpeg

云原生负载均衡器之 OpenELB 使用指南

2022-07-11

4035b536bf544f61c853f316bc020bae.jpeg

巧用 Kubernetes 中的 Leader 选举机制来实现自己的 HA 应用

2022-07-07

a61a1ebcdba126121a99eaa68a89ee57.jpeg

K8s 中 Descheduler 默认策略不够用?扩展之

2022-07-06

934d6f8ef2fec05d45ec5c5e60d3b447.jpeg

ba6c91fc8d02bdad85738eac39a19ecb.gif

云原生是一种信仰 🤘

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!

69877d6d634db2aa23c60fbc00588630.gif

e268704d0949066a0ee771c2268ed138.gif

点击 "阅读原文" 获取更好的阅读体验!

发现朋友圈变“安静”了吗?

25e5b7527a86ebf992e7bf07841cb02b.gif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值