containerd服务相关
一、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、镜像管理
[root@master harbor]# ctr image --help
NAME:
ctr images - manage images
USAGE:
ctr images command [command options] [arguments...]
COMMANDS:
check check existing images to ensure all content is available locally
export export images
import import images
list, ls list images known to containerd # 查看镜像列表
mount mount an image to a target path
unmount unmount the image from the target
pull pull an image from a remote
push push an image to a remote
delete, del, remove, rm remove one or more images by reference
tag tag an image
label set and clear labels for an image
convert convert an image
OPTIONS:
--help, -h show help
# 拉取镜像(镜像地址需要加上前缀 docker.io/)
[root@master harbor]# ctr image pull docker.io/library/nginx:latest
docker.io/library/nginx:latest: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247: done |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:d2b2f2980e9ccc570e5726b56b54580f23a018b7b7314c9eaff7e5e479c78657: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4a85ce26214d83c77b5464631a67c71e1c2793b655261befe52ba0e20ffc3bd1: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:3b9543f2b5005b74aae0ffaa779803f2b162ec3bd461c9e10a21671512718c87: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:b0e1283145af839c63923f671b4ab6c5d9e22826ab4372c6660db5a5556446c8: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4b98867cde79486d55399cb95957331018b849a2bf04ee9a6dcae9b8bc482d76: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:ca89ed5461a9f2c681ebd39ed6583a7405d82f51b42177b7388c99eb6869e780: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:5b5fe70539cd6989aa19f25826309f9715a9489cf1c057982d6a84c1ad8975c7: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:441a1b46536703aec84bf2cabdd2524d4cc7dad9c6772491e01ff8ffe15b5507: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:eb4a57159180767450cb8426e6367f11b999653d8f185b5e3b78a9ca30c2c31d: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 17.5s total: 67.3 M (3.8 MiB/s)
unpacking linux/amd64 sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247...
done: 2.938661087s
# 查看本地镜像
[root@master harbor]# ctr image ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
docker.io/library/nginx:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247 67.3 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x -
# 检查镜像
[root@master harbor]# ctr image check docker.io/library/nginx:latest
ctr: failed listing images: filters: parse error: [docker.io >|/|< library/nginx:latest]: expected an operator ("=="|"!="|"~="): invalid argument: invalid argument
2、容器管理
[root@master harbor]# ctr container --help
NAME:
ctr containers - manage containers
USAGE:
ctr containers command [command options] [arguments...]
COMMANDS:
create create container
delete, del, remove, rm delete one or more existing containers # 删除容器
info get info about a container # 查看容器数据信息
list, ls list containers
label set and clear labels for a container
checkpoint checkpoint a container
restore restore a container from checkpoint
OPTIONS:
--help, -h show help
3、快照管理
[root@master harbor]# ctr snapshot --help
NAME:
ctr snapshots - manage snapshots
USAGE:
ctr snapshots command [command options] [arguments...]
COMMANDS:
commit commit an active snapshot into the provided name
diff get the diff of two snapshots. the default second snapshot is the first snapshot's parent.
info get info about a snapshot
list, ls list snapshots
mounts, m, mount mount gets mount commands for the snapshots
prepare prepare a snapshot from a committed snapshot
delete, del, remove, rm remove snapshots
label add labels to content
tree display tree view of snapshot branches
unpack unpack applies layers from a manifest to a snapshot
usage usage snapshots
view create a read-only snapshot from a committed snapshot
OPTIONS:
--snapshotter value snapshotter name. Empty value stands for the default value. [$CONTAINERD_SNAPSHOTTER]
--help, -h show help