【问题标题】:docker change cgroup driver to systemddocker将cgroup驱动程序更改为systemd
【发布时间】:2017-10-03 07:11:10
【问题描述】:

我希望 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

【问题讨论】:

    标签: linux docker systemd


    【解决方案1】:

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

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

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

    sudo systemctl restart docker
    

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

    【讨论】:

    • 如果您要附加到文件 /etc/docker/daemon.json 中的现有内容,请确保在添加上述行之前将逗号放在最后一行。
    【解决方案2】:

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

    --exec-opt native.cgroupdriver=systemd \
    

    【讨论】:

    • 谢谢 :) 我一直在寻找这个。就我而言,我只将 --exec-opt native.cgroupdriver=systemd 一个附加选项直接添加到 docker.service (在将其复制到 /etc/systemd/system/ 之后,以便在 docker ugprades 之后保持它的持久性) .
    • 无法运行 Kubelet:错误配置:kubelet cgroup 驱动程序:“cgroupfs”与 docker cgroup 驱动程序:“systemd”不同。 - 收到此错误,因此更改 docker Cgroup Driver: cgroupfs
    【解决方案3】:

    补充一点,cgroupfs 是 docker 自己的控制组管理器。然而,对于大多数 Linux 发行版,ssytemd 现在是默认的 init 系统,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 集成,并将为每个进程分配 cgroups。它的 可以配置您的容器运行时和要使用的 kubelet cgroupfs。在 systemd 旁边使用 cgroupfs 意味着会有 成为两个不同的 cgroup 管理员。

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

    【讨论】:

    • 如果 kubernetes 包含许多组件,为什么在谈到 kubernetes 时,我们将 cgroups 驱动程序设置为仅用于 kubelet 的 systemd?
    【解决方案4】:

    操作系统:Centos 7.4 因为 kubernetes 1.23.1 推荐使用 cgroup systemd,而 docker 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
    

    【讨论】:

    • step3前应该有systemctl daemon-reaload命令
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      尝试重启docker服务:

      systemctl daemon-reload
      systemctl restart docker.service
      

      【讨论】:

      • 然后它会自动选择另一个 cgroup 驱动程序?
      猜你喜欢
      • 2018-01-24
      • 1970-01-01
      • 2017-01-06
      • 2013-10-24
      • 2016-08-19
      • 2015-07-03
      • 2017-01-20
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多