containerd是一个工业级标准的容器进行时,它可以负责干下面这些事情:
1、管理容器的生命周期(从创建容器到销毁容器)
2、拉取和推送镜像
3、存储管理(管理镜像及容器数据的存储)
4、调用runc运行容器(y)
其实,在以前我们使用的docker中就有containerd。当我们用docker创建容器的时候,并不是docker直接创建容器,而是去调用containerd,然后创建containerd-shim进程,通过该进程去调用runc去真正创建容器。这时我们发现,真正容器相关的操作其实是 containerd 在做。
而对于Kubernetes而言,只要符合CRI接口标准的容器运行时,都可以对接kubernetes平台。旧版本中Containerd要去适配kubernetes还需通过一个单独的CRI-Containerd 进程来完成,但在Containerd 1.0版本后,直接把适配逻辑作为插件的方式集成到了Containerd主进程中,从而使调用更加简洁,这也是我们为什么选择containerd来做为kubernetes 容器运行时的原因。(可以见下图)
这是containerd官网提供的架构图,可以看出来containerd采用的也是C/S架构 (C/S 架构指的是客户端/服务器架构(Client/Server Architecture),是一种网络通信模型,将应用程序分为客户端和服务器两部分,客户端和服务器之间通过网络进行通信和协作。)。服务端通过 unix domain socket 暴露低层的 GRPC API 接口出去,客户端通过这些 API 管理节点上的容器,每个 containerd 只负责一台机器,Pull 镜像,对容器的操作(启动、停止等),网络,存储都是由 containerd 完成。具体运行容器由 runc 负责,实际上只要是符合 OCI 规范的容器都可以支持。
整个containerd架构大体上可以分为三层:
1、Backend 在整个架构最底层,负责与系统做交互
2、Cor (Container Object Runtime) 层是指容器运行时,主要包含Service与Metadata两块,是整个containerd系统的核心组件之一,它提供了容器运行时所需的各种功能,包括容器生命周期管理、容器文件系统管理、容器网络管理、容器资源管理、容器安全管理、容器事件监控和容器日志管理等。
3、API层通过GRPC协议为客户端提供API(容器运行时的应用程序接口),主要作用是提供容器和镜像管理的高级功能,以及与其它容器相关的操作,例如网络和存储等。
# 获取YUM源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 使用YUM安装containerd 安装Containerd.io软件,即可安装Containerd
yum -y install containerd.io
# 使用rpm -qa命令查看是否安装
rpm -qa | grep containerd
containerd.io-1.4.12-3.1.el7.x86_64
# 设置containerd服务启动及开机自启动
systemctl enable containerd
systemctl start containerd
# 查看containerd服务启动状态
systemctl status containerd
# 安装Containerd时ctr命令亦可使用,ctr命令主要用于管理容器及容器镜像等。
# 使用ctr命令查看Containerd客户端及服务端相关信息。
ctr version
- /bin/ # containerd二进制文件
- /etc/containerd/ # containerd配置文件
- config.toml # containerd的主要配置文件
- config.toml.orig # containerd的主要配置文件的备份文件
- lib/ # containerd库文件
- containerd/
- io.containerd.grpc.* # containerd的GRPC API定义
- runtime/ # 容器运行时接口和实现
- services/ # containerd的核心服务,例如image、snapshot、task等
- run/containerd/ # containerd的运行时目录,例如pid文件、socket文件等
- var/lib/containerd/ # containerd的数据存储目录,例如镜像、快照、元数据等
其中,/bin/目录包含了containerd二进制文件,可以通过运行containerd启动它。/etc/containerd/目录包含了containerd的配置文件,其中config.toml是主要配置文件。lib/目录包含了containerd的库文件,包括GRPC API定义、容器运行时接口和实现以及核心服务等。run/containerd/目录包含了containerd的运行时文件,例如pid文件、socket文件等。var/lib/containerd/目录包含了containerd的数据存储目录,例如镜像、快照、元数据等。
这些目录和文件的具体结构可能会因为不同的部署环境和版本而有所差异,但是它们的基本组成部分应该是差不多的。
containerd 镜像加速配置有以下四种方法:
1、直接在 /etc/containerd/config.toml 文件中添加配置,配置好后重启containerd服务:
方法 一 :
[root@k8s-containerd-m ~]# vim /etc/containerd/config.toml
……
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint=["https://mn3d3160.mirror.aliyuncs.com"]
方法 二 :
[root@k8s-containerd-m ~]# vim /etc/containerd/config.toml
……
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
[root@k8s-containerd-m ~]# mkdir /etc/containerd/certs.d/docker.io -pv
[root@k8s-containerd-m ~]#
[root@k8s-containerd-m ~]# cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://xxxxxxxx.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
EOF
[root@k8s-containerd-m ~]# systemctl restart containerd
2、使用环境变量指定镜像加速地址,然后启动 containerd 服务或容器时,会自动使用该环境变量中指定的镜像加速地址。
export CONTAINER_REGISTRY_MIRROR=https://mn3d3160.mirror.aliyuncs.com
3、通过 containerd systemd 配置文件来配置镜像加速器:
在 containerd systemd 配置文件中添加 --registry-mirror 参数并将其设置为所需的镜像加速器地址。
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network-online.target
[Service]
ExecStartPre=/sbin/modprobe overlay
ExecStart=/usr/bin/containerd --config /etc/containerd/config.toml --registry-mirror=https://mn3d3160.mirror.aliyuncs.com
KillMode=process
Delegate=yes
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
[Install]
WantedBy=multi-user.target