Containerd的安装和是使用
一、Containerd介绍
1、Containerd前世今生
2013年docker公司在推出docker产品后,由于其对全球技术产生了一定的影响力,Google公司明显感觉到自己公司内部所使用的Brog系统江湖地位受到的威胁,希望Docker公司能够与自己联合打造一款开源的容器运行时作为Docker核心依赖,但Docker公司拒绝了;接着Google公司联合RedHat、IBM等公司说服Docker公司把其容器核心技术libcontainer捐给中立社区(OCI,Open Container Intiative),并更名为runC。
为了进一步遏制Docker在未来技术市场影响力,避免在容器市场上Docker一家独大,Google公司带领导RedHat、IBM等成立了CNCF(Cloud Native Computing Fundation)基金会,即云原生计算基金会。CNCF的目标很明确,既然在容器应用领域无法与Docker相抗衡,那就做Google更有经验的技术市场------大规模容器编排应用场景,Google公司把自己内部使用的Brog系统开源------Kubernetes,也就是我们今天所说的云原生技术生态。
2016年Docker公司推出了Docker Swarm,意在一统Docker生态,让Docker既可以实现容器应用管理,也可以实现大规模容器编排,经过近1年左右时间的市场验证后,发现在容器编排方面无法独立抗衡kubernetes,所以Docker公司于2017年正式宣布原生支持Kubernetes,至此,Docker在大规模容器编排应用市场败下阵来,但是Docker依然不甘心失败,把Docker核心依赖Containerd捐给了CNCF,依此说明Docker依旧是一个PaaS平台。
2020年CNCF基金会宣布Kubernetes 1.20版本将不再仅支持Docker容器管理工具,此事的起因主要也与Docker捐给CNCF基金会的Containerd有关,早期为了实现Kubernetes能够使用Docker实现容器管理,专门在Kubernetes组件中集成一个shim(垫片)技术,用来将Kubernetes容器运行时接口(CRI,Container Runntime Interface)调用翻译成Docker的API,这样就可以很好地使用Docker了,但是随着Kubernetes在全球技术市场的广泛应用,有更多的容器管理工具的出现,它们都想能够借助于Kubernetes被用户所使用,所以就提出标准化容器运行时接口,只要适配了这个接口就可以集成到Kubernetes生态当中,所以Kubernetes取消了对shim的维护,并且由于Containerd技术的成功,可以实现无缝对接Kubernetes,所以接下来Kubernetes容器运行时的主角是Containerd。
2、Containerd架构
Containerd设计的目的是为了嵌入到Kubernetes中使用,它是一个工业级的容器运行时,不提供给开发人员和终端用户直接使用,这样就避免了与Docker产生竞争,但事实上,Containerd已经实现大多数容器管理功能,例如:容器生命周期管理、容器镜像传输和管理、容器存储与网络管理等。
- Containerd 采用标准的 C/S 架构 - 服务端通过 GRPC 协议提供稳定的 API - 客户端通过调用服务端的 API 进行高级的操作 - 为了实现解耦,Containerd 将不同的职责划分给不同的组件,每个组件就相当于一个子系统(subsystem)。连接不同子系统的组件被称为模块。 - Containerd 两大子系统为: - Bundle : 在 Containerd 中,Bundle 包含了配置、元数据和根文件系统数据,你可以理解为容器的文件系统。而 Bundle 子系统允许用户从镜像中提取和打包 Bundles。 - Runtime : Runtime 子系统用来执行 Bundles,比如创建容器。 其中,每一个子系统的行为都由一个或多个模块协作完成(架构图中的 Core 部分)。每一种类型的模块都以插件的形式集成到 Containerd 中,而且插件之间是相互依赖的。 例如,上图中的每一个长虚线的方框都表示一种类型的插件,包括 Service Plugin、Metadata Plugin、GC Plugin、Runtime Plugin 等,其中 Service Plugin 又会依赖 Metadata Plugin、GC Plugin 和 Runtime Plugin。每一个小方框都表示一个细分的插件,例如 Metadata Plugin 依赖 Containers Plugin、Content Plugin 等。
3、常用插件
Content Plugin: 提供对镜像中可寻址内容的访问,所有不可变的内容都被存储在这里。 Snapshot Plugin: 用来管理容器镜像的文件系统快照。镜像中的每一个 layer 都会被解压成文件系统快照,类似于 Docker 中的 `graphdriver`。 Metrics: 暴露各个组件的监控指标。
二、安装使用
1、Rocky8.6安装
获取阿里云YUM源 :wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 查看YUM源中Containerd软件: # yum list | grep containerd 下载安装: yum install -y containerd.io
[root@rocky8-6 ~]# rpm -qa | grep containerd containerd.io-1.6.6-3.1.el8.x86_64 [root@rocky8-6 ~]# 设置containerd服务启动及开机自启动 systemctl enable containerd systemctl start containerd systemctl status containerd
验证方式
2、Ubuntu20.04安装方式
2.1、下载安装包
wget https://github.com/containerd/containerd/releases/download/v1.6.6/cri-containerd-cni-1.6.6-linux-amd64.tar.gz
2.2、解压安装包
mkdir containerd && tar -xvzf cri-containerd-cni-1.6.6-linux-amd64.tar.gz -C containerd
cp -p /root/containerd/usr/local/bin/* /usr/local/bin/ cp -p /root/containerd/etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service chmod +x /usr/lib/systemd/system/containerd.service
2.3、生成containerd 的配置文件
Containerd 的默认配置文件为 `/etc/containerd/config.toml`,可以使用`containerd config default > /etc/containerd/config.toml`命令创建一份模块配置文件 mkdir -p /etc/containerd/ 生成配置文件 containerd config default > /etc/containerd/config.toml cp -a /etc/containerd/config.toml /etc/containerd/config.toml.bak
验证方式
3、containerd使用
ctr images ls 查看containerd镜像 # 下载镜像 # containerd支持oci标准的镜像,所以可以直接使用docker官方或dockerfile构建的镜像 # ctr images pull --platform linux/amd64 docker.io/library/nginx:alpine # ctr images ls
镜像挂载
把已下载的容器镜像挂载至当前文件系统
# ctr images mount docker.io/library/nginx:alpine /mnt
卸载
# umount /mnt
把容器镜像导出 # ctr images pull --all-platforms docker.io/library/nginx:alpine [下载] # ctr images export --all-platforms nginx-alpine.img docker.io/library/nginx:alpine 【导出】 # ctr images pull --platform linux/amd64 docker.io/library/nginx:1.15 [下载] # ctr images export --platform linux/amd64 nginx-1.15.img docker.io/library/nginx:1.15 [导出] # ctr images pull docker.io/library/nginx:1.14 【下载】 # ctr images export --platform linux/amd64 nginx-1.14.tar docker.io/library/nginx:1.14 [导出] 删除指定容器镜像 # ctr images rm docker.io/library/nginx:1.14 # ctr images rm docker.io/library/nginx:1.15 # ctr images rm docker.io/library/nginx:alpine # ctr images rm docker.io/library/nginx:latest 再次查看容器镜像 # ctr images ls REF TYPE DIGEST SIZE PLATFORMS LABELS 导入镜像 #ctr images import nginx-alpine.tar.gz 修改镜像tag # ctr images tag docker.io/library/nginx:alpine nginx:alpine nginx:alpine 说明: 把docker.io/library/nginx:alpine 修改为 nginx:alpine # ctr images ls # ctr images check
参考文档:https://blog.51cto.com/flyfish225/5360370