安装步骤
由于 containerd 需要调用 runc,所以我们也需要先安装 runc,不过 containerd 提供了一个包含相关依赖的压缩包 cri-containerd-cni-${VERSION}.${OS}-${ARCH}.tar.gz
,可以直接使用这个包来进行安装。
下载二进制包
wget https://github.com/containerd/containerd/releases/download/v1.7.23/cri-containerd-cni-1.7.23-linux-amd64.tar.gz
可以通过 tar 的 -t
选项直接看到压缩包中包含哪些文件:
[root@iZ0jldvvnr8cjbe87g9cqbZ ~]# tar -tf cri-containerd-cni-1.7.23-linux-amd64.tar.gz
cri-containerd.DEPRECATED.txt
etc/
etc/systemd/
etc/systemd/system/
etc/systemd/system/containerd.service
etc/cni/
etc/cni/net.d/
etc/cni/net.d/10-containerd-net.conflist
etc/crictl.yaml
usr/
usr/local/
usr/local/sbin/
usr/local/sbin/runc
usr/local/bin/
usr/local/bin/containerd-shim-runc-v1
usr/local/bin/containerd
usr/local/bin/critest
usr/local/bin/containerd-shim
usr/local/bin/ctd-decoder
usr/local/bin/crictl
usr/local/bin/ctr
usr/local/bin/containerd-stress
usr/local/bin/containerd-shim-runc-v2
opt/
opt/cni/
opt/cni/bin/
opt/cni/bin/host-device
opt/cni/bin/sbr
opt/cni/bin/loopback
opt/cni/bin/bridge
opt/cni/bin/portmap
opt/cni/bin/vlan
opt/cni/bin/tuning
opt/cni/bin/vrf
opt/cni/bin/macvlan
opt/cni/bin/firewall
opt/cni/bin/dhcp
opt/cni/bin/ptp
opt/cni/bin/dummy
opt/cni/bin/ipvlan
opt/cni/bin/host-local
opt/cni/bin/bandwidth
opt/cni/bin/static
opt/containerd/
opt/containerd/cluster/
opt/containerd/cluster/gce/
opt/containerd/cluster/gce/cloud-init/
opt/containerd/cluster/gce/cloud-init/node.yaml
opt/containerd/cluster/gce/cloud-init/master.yaml
opt/containerd/cluster/gce/env
opt/containerd/cluster/gce/configure.sh
opt/containerd/cluster/gce/cni.template
opt/containerd/cluster/version
解压&&安装
tar -C / -xzf cri-containerd-cni-1.7.23-linux-amd64.tar.gz
配置环境变量
如果PATH中已经有如下2个环境变量,则可忽略
# 为当前用户配置环境变量
vim ~/.bashrc
# 添加内容(如果PATH中已经有如下2个环境变量,则可忽略):
export PATH=$PATH:/usr/local/bin:/usr/local/sbin
# 生效
source ~/.bashrc
生成containerd默认配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
配置自定义存储目录
vim /etc/containerd/config.toml
# 将下面内容
root = "/var/lib/containerd"
# 替换为:
root = "/you/customer/path"
# 重启containerd
sudo systemctl restart containerd
配合k8s部署-自定义修改
这里的修改是为了解决:在大陆部署k8s时无法访问国外网络的问题
# 编辑配置文件
vim /etc/containerd/config.toml
## 修改项-1
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
## 修改项-2
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
containerd.service
由于上面我们下在的 containerd 压缩包中包含一个 etc/systemd/system/containerd.service
的文件,这样我们就可以通过 systemd 来配置 containerd 作为守护进程运行了,内容如下所示:
➜ ~ cat /etc/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
这里有两个重要的参数:
- Delegate: 这个选项允许 containerd 以及运行时自己管理自己创建容器的 cgroups。如果不设置这个选项,systemd 就会将进程移到自己的 cgroups 中,从而导致 containerd 无法正确获取容器的资源使用情况。
- KillMode: 这个选项用来处理 containerd 进程被杀死的方式。默认情况下,systemd 会在进程的 cgroup 中查找并杀死 containerd 的所有子进程。KillMode 字段可以设置的值如下。
- control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
- process:只杀主进程
- mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
- none:没有进程会被杀掉,只是执行服务的 stop 命令
我们需要将 KillMode 的值设置为 process,这样可以确保升级或重启 containerd 时不杀死现有的容器。
启动containerd服务
systemctl enable containerd --now
验证containerd服务
systemctl status containerd
使用 ctr 拉取镜像
ctr images pull registry.cn-beijing.aliyuncs.com/mycentos:blog_v2
参考网址
Releases · containerd/containerd · GitHub containerd release
Releases · opencontainers/runc · GitHub runc release
Releases · containernetworking/plugins · GitHub cni release
containerd、cni、runc三者的关系
containerd
、CNI
(Container Network Interface) 和 runc
是容器生态系统中的三个重要组件,它们在容器的创建、管理和网络配置中扮演着不同但互相关联的角色。
runc
- 功能:
runc
是一个轻量级的容器运行时,负责根据 OCI(Open Container Initiative)规范创建和管理容器。它直接与操作系统的内核进行交互,使用 Linux 的命名空间和控制组(cgroups)等功能来实现容器的隔离和资源限制。 - 角色:
runc
执行容器的生命周期管理,包括创建、启动、停止和删除容器。
containerd
- 功能:
containerd
是一个高层的容器管理守护进程,它提供了容器的生命周期管理功能,包括镜像管理、容器运行时管理等。containerd
作为对runc
的封装,使得用户不必直接与runc
交互。 - 职责: 它负责协调容器的创建和删除,管理容器的状态,以及维护容器所需的网络和存储等资源。
containerd
支持多种容器运行时,包括runc
。
CNI (Container Network Interface)
- 功能:
CNI
是一种用于管理容器网络的标准接口。它定义了一组插件,来配置容器的网络连接、IP 地址分配等功能。 - 作用: 在容器启动时,
containerd
会调用 CNI 插件来配置容器的网络,确保容器能够在网络中通信。
它们之间的关系
- 集成架构:
containerd
利用runc
作为底层运行时来启动和管理容器,并通过 CNI 来处理容器的网络配置。具体流程是:containerd
启动一个容器时,会通过runc
来创建和管理容器本身,然后调用 CNI 插件以设置网络。 - 工作流程:
- 当用户请求启动一个容器时,
containerd
接收该请求并与runc
交互,创建容器实例。 containerd
向 CNI 发送请求,配置容器的网络设置。- CNI 插件负责为容器分配 IP 地址和设置网络规则,使得容器能够相互通信或与外部网络交互。
- 当用户请求启动一个容器时,
小结
综上所述,containerd
、CNI
和 runc
形成了容器管理的完整生态系统,其中 runc
负责底层容器运行,containerd
作为管理层和调用者,CNI
处理容器网络配置。这种分层架构使得容器管理更加灵活和模块化。