1、为什么要修改 Docker 的 cgourp driver?

1.1、什么是 cgroups

cgroups(Control Groups)是 Linux 内核提供的一种机制。它可以限制、记录任务组所使用的物理资源。它是内核附加在程序上的 hook,使程序运行时对资源的调度触发相应的钩子,达到资源追踪和限制资源使用的目的。

1.2、cgroupfs 是什么?

Docker 默认的 cgroup driver 是 cgroupfs。cgroupfs 是 cgroup 为给用户提供的操作接口而开发的虚拟文件系统类型,它和 sysfs、proc 类似,可以向用户展示 cgroup 的 hierarchy,通知 kernel 用户对 cgroup 改动,对 cgroup 的查询和修改只能通过 cgroupfs 文件系统来进行。

1.3、为什么要修改使用 systemd?

Kubernetes 推荐使用 systemd 来替代 cgroupfs,是因为 systemd 是 Kubernetes 自带的 cgroup 管理器,负责为每个进程分配 cgroupfs,但 Docker 的 cgroup driver 默认是 cgroupfs,这样就同时运行了两个 cgroup 控制管理器。当资源有压力时,有可能会出现不稳定的情况。

如果不修改配置,会在 kubeadm init 时提示:

[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at

2、查看当前 Docker 服务的 cgroup dirver

i
  • Cgroup Driver: cgroupfs

  • Cgroup Version: 1

2.1、修改daemon.json文件并重启docker

[root@hcss-ecs-c7cc ~]# vim /etc/docker/daemon.json 
{
	"registry-mirrors": [
		"https://docker.shaunyang.site",
		"https://docker.m.daocloud.io"
	],
    "exec-opts":[
        "native.cgroupdriver=systemd"
        ]
	
}
[root@hcss-ecs-c7cc ~]# systemctl daemon-reload
[root@hcss-ecs-c7cc ~]# systemctl restart docker

2.2、查看cgroup driver

[root@hcss-ecs-c7cc ~]# docker info
Client:
 Version:    27.5.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.24.0
    Path:     /usr/local/lib/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.36.2
    Path:     /usr/local/lib/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 5
 Server Version: 27.5.1
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
  Cgroup Driver: systemd
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
 runc version: v1.2.4-0-g6c52b3f
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 4.18.0-348.7.1.el8_5.x86_64
 Operating System: CentOS Linux 8
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 1.774GiB
 Name: hcss-ecs-c7cc
 ID: 1a82bd87-53bd-41c9-bb7c-dbb95cd2e7fa
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://docker.shaunyang.site/
  https://docker.m.daocloud.io/
 Live Restore Enabled: false
 Product License: Community Engine
  • Cgroup Driver: systemd

  • Cgroup Version: 1

识别 Linux 节点上的 cgroup 版本

cgroup 版本取决于正在使用的 Linux 发行版和操作系统上配置的默认 cgroup 版本。 要检查你的发行版使用的是哪个 cgroup 版本,请在该节点上运行 stat -fc %T /sys/fs/cgroup/ 命令:

stat -fc %T /sys/fs/cgroup/

对于 cgroup v2,输出为 cgroup2fs

对于 cgroup v1,输出为 tmpfs

以下链接来自kubernetes官网

关于 cgroup v2

了解cgroup driver

配置cgroup driver 驱动