繁体   English   中英

docker 将 cgroup 驱动程序更改为 systemd

[英]docker change cgroup driver to systemd

我希望 Docker 从 systemd cgroup 驱动程序开始。 出于某种原因,它在我的 CentOS 7 服务器上仅使用 cgroupfs。

这是启动配置文件。

# systemctl cat docker
# /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer

[Service]
Type=notify
NotifyAccess=all
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
MountFlags=slave

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/docker.service.d/docker-thinpool.conf
 [Service]
 ExecStart=
 ExecStart=/usr/bin/dockerd --storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool \
 --storage-opt=dm.use_deferred_removal=true --storage-opt=dm.use_deferred_deletion=true
 EOF

当我启动 Docker 时,它是这样运行的:

# ps -fed | grep docker
root      8436     1  0 19:13 ?        00:00:00 /usr/bin/dockerd-current --storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool --storage-opt=dm.use_deferred_removal=true --storage-opt=dm.use_deferred_deletion=true
root      8439  8436  0 19:13 ?        00:00:00 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc

这是docker info的输出:

# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 1
Server Version: 1.12.6
Storage Driver: devicemapper
 Pool Name: docker-thinpool
 Pool Blocksize: 524.3 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: xfs
 Data file:
 Metadata file:
 Data Space Used: 185.6 MB
 Data Space Total: 1.015 GB
 Data Space Available: 829.4 MB
 Metadata Space Used: 77.82 kB
 Metadata Space Total: 8.389 MB
 Metadata Space Available: 8.311 MB
 Thin Pool Minimum Free Space: 101.2 MB
 Udev Sync Supported: true
 Deferred Removal Enabled: true
 Deferred Deletion Enabled: true
 Deferred Deleted Device Count: 0
 Library Version: 1.02.135-RHEL7 (2016-11-16)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null bridge overlay host
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.10.0-514.16.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 2
CPUs: 1
Total Memory: 992.7 MiB
Name: master
ID: 6CFR:H7SN:MEU7:PNJH:UMSO:6MNE:43Q5:SF4K:Z25I:BKHP:53U4:63SO
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Insecure Registries:
 127.0.0.0/8
Registries: docker.io (secure)

如何让它与 systemd 一起运行?

谢谢 SR

不涉及编辑 systemd 单元或插件的解决方案是创建(或编辑) /etc/docker/daemon.json配置文件并包含以下内容:

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

保存后,重启你的docker服务。

sudo systemctl restart docker

这种解决方案显然只有在您想在系统范围内应用此解决方案时才可行。

由于我有两个配置文件,因此我还需要在第二个配置文件中添加条目 -- /etc/systemd/system/docker.service.d/docker-thinpool.conf

--exec-opt native.cgroupdriver=systemd \

补充一点,cgroupfs 是 docker 自己的控制组管理器。 然而,对于大多数 Linux 发行版,ssytemd 现在是默认的初始化系统,systemd 与 Linux 控制组紧密集成,在 Kubernetes 站点中,他们建议使用 systemd(见下文),因为将 cgroupfs 与 systemd 一起使用似乎不是最佳选择

所以最好使用 systemd 然后进行 cgroup 管理。 kubelet 默认配置为使用 systemd。 所以改 Docker 使用 systemd Cgroup 驱动更容易更好

这种重叠的历史在这里https://lwn.net/Articles/676831/

在 Kubernetes 站点,他们推荐使用 systemd https://kubernetes.io/docs/setup/production-environment/container-runtimes/

Cgroup 驱动程序 当 systemd 被选为 Linux 发行版的 init 系统时,init 进程会生成并使用一个根控制组 (cgroup) 并充当 cgroup 管理器。 Systemd 与 cgroups 紧密集成,并将为每个进程分配 cgroup。 可以将容器运行时和 kubelet 配置为使用 cgroupfs。 将 cgroupfs 与 systemd 一起使用意味着将有两个不同的 cgroup 管理器。

控制组用于限制分配给进程的资源。 单个 cgroup 管理器将简化正在分配哪些资源的视图,并且默认情况下将对可用和正在使用的资源具有更一致的视图。 当我们有两个经理时,我们最终会对这些资源有两种看法。 我们在现场看到过这样的情况,在资源压力下,节点被配置为对 kubelet 和 Docker 使用 cgroupfs,对节点上运行的其余进程使用 systemd 变得不稳定。

确保您以 root 身份登录并执行以下两个命令:

  1. echo '{"exec-opts": ["native.cgroupdriver=systemd"]}' >> /etc/docker/daemon.json
  2. systemctl 重启 docker

操作系统:Centos 7.4 因为 kubernetes 1.23.1 推荐使用 cgroup systemdcgroupfs 20.10.20 使用 cgroup cgroupfs 因此,您必须更改 docker 服务文件。

step1:停止docker服务

systemctl stop docker

步骤 2:更改文件/etc/systemd/system/multi-user.target.wants/docker.service/usr/lib/systemd/system/docker.service

从 :

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

到:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd

step3:启动docker服务和kubelet

systemctl start docker

kubeadm init phase kubelet-start

尝试重启docker服务:

systemctl daemon-reload
systemctl restart docker.service

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM