一、Containerd概念
在2016年12月14日,Docker 公司宣布将 containerd 从 Docker 分离,由开源社区独立发展和运营。
Containerd 完全可以单独运行并管理容器,而 Containerd 的主要职责是镜像管理和容器执行。
Containerd 提供了 containerd-shim
接口封装层,向下继续对接 runC项目,使得容器引擎 Docker Daemon 可以独立升级。
Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。主要负责以下事情:
- 容器生命周期管理:容器的创建、启动、停止、删除、暂停、恢复、重启、查看、执行等
- 拉取和推送容器镜像
- 存储管理:容器的镜像和容器数据的存储
- 调用 runC 运行容器
- 管理容器网络接口及网络
1、Containerd 和 Docker 的关系
Docker 包含 Containerd,但是 Containerd 不包含 Docker。Docker 依赖于 Containerd,但是 Containerd 不依赖于 Docker。Docker 除了容器管理之外,还可以完成镜像构建之类的功能。
Containerd 提供的API偏底层,不是给普通用户直接用的,容器编排的开发者才需要 Containerd。
2、Containerd 在容器生态中扮演的角色
Containerd 是一个守护进程,它可以管理容器的生命周期,但是它不会自己创建容器,而是通过和其他工具的配合来实现容器的创建和管理。比如,Docker 通过 Containerd 来管理容器的生命周期,但是 Docker 会自己创建容器。
Containerd 并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如 Kubernetes 和 Mesos 等容器编排系统。
Containerd 以 daemon 的形式运行在系统上,通过 unix domain socket
暴露底层的 grpc API,供上层的工具调用。
二、Containerd架构
三、Kubernetes 与 Containerd
Kubernetes 与 Containerd 的关系如下图所示:(待补充)
1、Kubernetes 与 Docker
Kubernetes 1.20 版本开始,支持使用 Containerd 作为容器运行时。在 Kubernetes 1.20 之前,Kubernetes 一直使用 Docker 作为容器运行时。
Kubernetes 1.24 版本将移除对 Docker 的支持,只支持 Containerd。
2、CRI(Container Runtime Interface)
容器运行时接口(CRI)
是 Kubernetes 为了支持多种容器运行时而定义的一套接口规范,它定义了容器运行时必须实现的接口,包括镜像管理、容器生命周期管理、容器资源管理等。
CRI 是一个插件接口,它使 kubelet 能够使用各种容器运行时,需要在集群的每个节点上都有一个可以正常工作的容器运行时,这样 kubelet 能启动 Pod 及其容器。容器运行时接口(CRI)
是 kubelet 和容器运行时之间通讯的主要协议。
Kubernetes 通过 CRI 与容器运行时进行通信,而不是直接调用容器运行时的 API。这样,Kubernetes 就可以支持多种容器运行时,而不需要修改代码。
Kubernetes 1.5 版本引入了 CRI,但是当时只支持 Docker。Kubernetes 1.11 版本开始,支持使用 CRI 来管理容器(创建、运行、销毁等工作),而不是直接调用 Docker 的 API。
Kubernetes 1.20 版本开始,支持使用 Containerd 作为容器运行时。在 Kubernetes 1.20 之前,Kubernetes 一直使用 Docker 作为容器运行时。
3、OCI(Open Container Initiative)
OCI(开放容器倡议)
是一个开放的容器标准,它定义了容器的镜像格式和容器运行时。OCI 由 Linux 基金会维护,它的目标是为容器提供一个开放的标准。
OCI 项目由 Docker,CoreOS(后来被 Red Hat 收购),Mesosphere,Microsoft,IBM,Huawei,Alibaba 等公司在 2015 年 6 月发起,它的目标是为容器提供一个开放的标准。
OCI 项目包含两个子项目:runtime-spec
和 image-spec
。runtime-spec
定义了容器运行时的标准,image-spec
定义了容器镜像的标准。
使用containerd作为K8S容器运行时缘故:
- 如果使用 Docker 作为 kubelet 容器运行时的话,kubelet 需要先通过 dockershim 去调用 Docker,再通过 Docker 去调用 containerd。
- 如果使用 containerd 作为 kubelet 容器运行时的话,kubelet 可以直接调用 containerd,不需要经过 dockershim 和 Docker。
- 使用 containerd 作为 kubelet 容器运行时,不仅性能提高了,而且资源占用也会变小。(Docker 不是一个纯粹的容器运行时,具有大量其他功能)
四、Containerd安装和配置
1、安装
安装 docker 可以自动安装 containerd,也可以以如下方式单独安装 containerd。
# 配置 docker-ce.repo的yum源
[root@af116724e217 yum.repos.d]# yum install yum-utils -y
[root@af116724e217 yum.repos.d]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror, ovl
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
# 安装 containerd
[root@af116724e217 yum.repos.d]# yum install containerd -y
[root@af116724e217 yum.repos.d]# systemctl enable containerd
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service, pointing to /usr/lib/systemd/system/containerd.service.
[root@af116724e217 yum.repos.d]# systemctl start containerd
2、配置
containerd 的配置文件是 /etc/containerd/config.toml
,默认情况下,containerd 会使用默认配置,不需要修改配置文件。
如修改配置文件,需要重启 containerd 服务。
[root@af116724e217 yum.repos.d]# systemctl daemon-reload
[root@af116724e217 yum.repos.d]# systemctl restart containerd
五、Containerd使用
Containerd 的命令行工具是 ctr
,它的功能非常强大,可以用来管理容器、镜像、快照、命名空间、任务、事件等。
[root@af116724e217 yum.repos.d]# ctr --help
NAME:
ctr -
containerd CLI
USAGE:
ctr [global options] command [command options] [arguments...]
VERSION:
1.6.21
DESCRIPTION:
ctr is an unsupported debug and administrative client for interacting
with the containerd daemon. Because it is unsupported, the commands,
options, and operations are not guaranteed to be backward compatible or
stable from release to release of the containerd project.
COMMANDS:
plugins, plugin provides information about containerd plugins
version print the client and server versions
containers, c, container manage containers
content manage content
events, event display containerd events
images, image, i manage images
leases manage leases
namespaces, namespace, ns manage namespaces
pprof provide golang pprof outputs for containerd
run run a container
snapshots, snapshot manage snapshots
tasks, t, task manage tasks
install install a new package
oci OCI tools
shim interact with a shim directly
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--debug enable debug output in logs
--address value, -a value address for containerd's GRPC server (default: "/run/containerd/containerd.sock") [$CONTAINERD_ADDRESS]
--timeout value total timeout for ctr commands (default: 0s)
--connect-timeout value timeout for connecting to containerd (default: 0s)
--namespace value, -n value namespace to use with commands (default: "default") [$CONTAINERD_NAMESPACE]
--help, -h show help
--version, -v print the version
1、查看命令
# 查看 containerd 版本
[root@master ~]# ctr version
Client:
Version: 1.6.21
Revision: 3dce8eb055cbb6872793272b4f20ed16117344f8
Go version: go1.19.9
Server:
Version: 1.6.21
Revision: 3dce8eb055cbb6872793272b4f20ed16117344f8
UUID: ddf93e04-2c24-43f8-a8ce-c51654614c67
# 查看 containerd 命名空间
[root@master ~]# ctr namespace ls
NAME LABELS
k8s.io
moby
# 查看 containerd 事件
[root@master ~]# ctr events ls
# 查看 containerd 插件
[root@master ~]# ctr plugin ls
TYPE ID PLATFORMS STATUS
io.containerd.content.v1 content - ok
io.containerd.snapshotter.v1 aufs linux/amd64 skip
io.containerd.snapshotter.v1 btrfs linux/amd64 skip
# 查看 containerd 任务
[root@master ~]# ctr task ls
TASK PID STATUS
# 查看 containerd 镜像
[root@master ~]# ctr images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
# 查看 containerd 容器
[root@master ~]# ctr containers ls
CONTAINER IMAGE RUNTIME
# 查看 k8s.io 命名空间下的容器
[root@master ~]# ctr -n=k8s.io container ls
CONTAINER IMAGE RUNTIME
01e87c7dbfbaec8fab12cf3e6b202f08e26706ca28f984312d329ffb583640b2 registry.aliyuncs.com/google_containers/pause:3.7 io.containerd.runc.v2
# 查看 k8s.io 命名空间下的镜像
[root@master ~]# ctr -n=k8s.io images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
10.104.43.110/springcloud/config:4 application/vnd.docker.distribution.manifest.v2+json sha256:c208dcb447fbe05a0ae4598ea2b91d0606751d3da49148b710470ddc5956c353 138.9 MiB linux/amd64 io.cri-containerd.image=managed
标签:容器,服务,Kubernetes,containerd,Containerd,相关,Docker,root
From: https://www.cnblogs.com/xiugeng/p/17491227.html