暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅谈 containerd 架构及高级技巧

云原生CTO 2021-11-24
1970

CTO

 
 

 
 


 

Go
Rust
Python
Istio
containerd
CoreDNS
Envoy
etcd
Fluentd
Harbor
Helm
Jaeger
Kubernetes
Open Policy Agent
Prometheus
Rook
TiKV
TUF
Vitess
Argo
Buildpacks
CloudEvents
CNI
Contour
Cortex
CRI-O
Falco
Flux
gRPC
KubeEdge
Linkerd
NATS
Notary
OpenTracing
Operator Framework
SPIFFE
SPIRE
  Thanos





浅谈 containerd 架构及高级技巧

containerd
是一个高级容器运行时,又名容器管理器。简单来说,它是一个守护进程,在单个主机上管理完整的容器生命周期:创建、启动、停止容器、拉取和存储镜像、配置挂载、网络等。

Containerd
被设计成可以很容易地嵌入到更大的系统中。Docker
使用containerd
来运行容器。Kubernetes
可以通过CRI
使用containerd
来管理单个节点上的容器。但是较小的项目也可以从与containerd
集成的便利中获益——例如,faasd
使用containerd
在独立的服务器上运行一个成熟的功能即服务解决方案。

但是,以编程方式使用 containerd
并不是唯一的选择。它还可以通过可用客户端之一从命令行使用。由此产生的容器 UX
可能不像docker
客户端提供的那样全面和用户友好,但它仍然是有用的,例如,用于调试或学习目的。

如何在 ctr 中使用 containerd

ctr
是作为 containerd
项目的一部分提供的命令行客户端。如果您在一台机器上运行了 containerd
,那么ctr
二进制文件很可能也在那里。

ctr
界面 [显然] 与 Docker CLI
不兼容,乍一看,可能看起来不太用户友好。显然,它的主要受众是测试守护进程的容器开发人员。但是,由于它最接近实际的 containerd API
,因此它可以作为一种很好的探索手段——通过检查可用命令,您可以大致了解 containerd
可以做什么和不可以做什么。

ctr
也非常适合学习的能力低级别[OCI]
容器的运行时间,因为ctr + containerd
是更接近实际的容器比docker + dockerd

使用 ctr 处理容器镜像

当拉取镜像,完全合格的参考似乎是必需的,所以你不能忽略镜像仓库或标签部分:

$ ctr images pull docker.io/library/nginx:1.21
$ ctr images pull docker.io/kennethreitz/httpbin:latest
$ ctr images pull docker.io/kennethreitz/httpbin:latest
$ ctr images pull quay.io/quay/redis:latest

要列出本地镜像,可以使用:

$ ctr images ls

令人惊讶的是,containerd
不提供开箱即用的镜像构建支持。然而,containerd
本身经常被更高级别的工具用来构建镜像。

不使用ctr
构建镜像,您可以导入用docker build
或其他oci
兼容软件构建的现有镜像:

$ docker build -t my-app .
$ docker save -o my-app.tar my-app

$ ctr images import my-app.tar

有了ctr
,你也可以挂载镜像

$ mkdir /tmp/httpbin
$ ctr images mount docker.io/kennethreitz/httpbin:latest /tmp/httpbin

$ ls -l /tmp/httpbin/
total 80
drwxr-xr-x 2 root root 4096 Oct 18  2018 bin
drwxr-xr-x 2 root root 4096 Apr 24  2018 boot
drwxr-xr-x 4 root root 4096 Oct 18  2018 dev
drwxr-xr-x 1 root root 4096 Oct 24  2018 etc
drwxr-xr-x 2 root root 4096 Apr 24  2018 home
drwxr-xr-x 3 root root 4096 Oct 24  2018 httpbin
...

$ ctr images unmount /tmp/httpbin

要使用ctrl
删除图像,请运行:

$ ctr images remove docker.io/library/nginx:1.21

使用ctr处理容器

有了一个本地镜像,你可以通过ctr
运行<image-ref> <container-id>
来运行一个容器。例如:

$ ctr run --rm -t docker.io/library/debian:latest cont1

注意,与友好的docker
运行生成唯一的容器ID
不同,使用ctr
,你必须自己提供唯一的容器ID
ctr
运行命令也只支持一些常见的docker
运行标志:——env, -t,——tty, -d,——detach,——rm
,等等。但是没有端口发布或使用——restart=
总是开箱即用的自动容器重新启动。

与镜像类似,你可以列出现有的容器:

$ ctr containers ls

有趣的是,ctrl
运行命令实际上是ctrl
容器创建+ ctrl
任务启动的快捷方式:

$ ctr container create -t docker.io/library/nginx:latest nginx_1
$ ctr container ls
CONTAINER    IMAGE                              RUNTIME
nginx_1      docker.io/library/nginx:latest     io.containerd.runc.v2

$ ctr task ls
TASK    PID    STATUS        # Empty!

$ ctr task start -d nginx_1  # -d for --detach
$ ctr task list
TASK     PID      STATUS
nginx_1  10074    RUNNING

我喜欢这种容器和任务子命令的分离,因为它反映了经常被遗忘的OCI
容器的本质。尽管人们普遍认为容器不是进程——对于进程来说,容器是隔离的和受限制的执行环境。

使用ctr
任务连接,你可以重新连接到一个在容器中运行的现有任务的stdio
流:

$ ctr task attach nginx_1
2021/09/12 15:42:20 [notice] 1#1: using the "epoll" event method
2021/09/12 15:42:20 [notice] 1#1: nginx/1.21.3
2021/09/12 15:42:20 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
2021/09/12 15:42:20 [notice] 1#1: OS: Linux 4.19.0-17-amd64
2021/09/12 15:42:20 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1024:1024
2021/09/12 15:42:20 [notice] 1#1: start worker processes
2021/09/12 15:42:20 [notice] 1#1: start worker process 31
...

很像docker
,你可以在一个已有的容器中执行一个任务:

$ ctr task exec -t --exec-id bash_1 nginx_1 bash

# From inside the container:
$ root@host:/# curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

在移除一个容器之前,它的所有任务必须停止:

$ ctr task kill -9 nginx_1

或者,你可以使用——force
标志删除正在运行的任务:

$ ctr task rm -f nginx_1

最后,要删除容器,运行:

$ ctr container rm nginx_1

如何使用容器与nerdctl

Nerdctl
是一个相对较新的containerd
命令行客户端。与ctr
不同,nerdctl
的目标是用户友好和docker
兼容。在某种程度上,nerdctl + containerd
可以无缝地替代docker + dockerd
。然而,这似乎不是项目的目标:

nerdctl
的目标是促进试验Docker
中没有的最前沿的容器特性。这些特性包括但不限于lazy-pulling(stargz)
和镜像加密(ocicrypt
)。这些功能预计最终也会在Docker
中实现,然而,这可能需要几个月,甚至几年的时间,因为Docker
目前只设计使用了容器子系统的一小部分。重构Docker
以使用整个容器是可能的,但并不简单。所以我们[NTT]
决定创建一个完全使用container
CLI
,但我们不打算用Docker
来完成。我们一直在为Docker/Moby
以及容器做出贡献,并将继续这样做。

从基本用法的角度来看,与ctr
相比,nerdctl
支持:

  • 使用nerdctl
    构建镜像
  • 容器网络管理
  • Docker Compose
    nerdctl Compose up
  • 最酷的部分是nerdctl
    试图提供docker
    (和podman
    )命令行UX
    相同的功能。所以,如果你熟悉docker
    (或podman
    ) CLI
    ,你就已经熟悉nerdctl
    了。
如何使用容器与crictl

crictl
是一个命令行客户端,用于[Kubernetes] cri
兼容的容器运行时。

引入 Kubernetes
容器运行时接口 (CRI
)以使 Kubernetes
容器运行时不可知。Kubernetes
节点代理kubelet
实现了 CRI
客户端 API
,可以使用任何实现 CRI
服务器 API
的容器运行时来管理其节点上的容器和 Pod

             Kubernetes CRI

1.1
版开始,containerd
就自带了一个内置的CRI
插件。因此,containerd
是一个与cri
兼容的容器运行时。因此,它可以与critl
一起使用。

创建crictl
是为了检查和调试Kubernetes
节点上的容器运行时和应用程序。支持以下操作:

attach: Attach to a running container
create: Create a new container
exec: Run a command in a running container
version: Display runtime version information
images, image, img: List images
inspect: Display the status of one or more containers
inspecti: Return the status of one or more images
imagefsinfo: Return image filesystem info
inspectp: Display the status of one or more pods
logs: Fetch the logs of a container
port-forward: Forward local port to a pod
ps: List containers
pull: Pull an image from a registry
run: Run a new container inside a sandbox
runp: Run a new pod
rm: Remove one or more containers
rmi: Remove one or more images
rmp: Remove one or more pods
pods: List pods
start: Start one or more created containers
info: Display information of the container runtime
stop: Stop one or more running containers
stopp: Stop one or more running pods
update: Update one or more running containers
config: Get and set crictl client configuration options
stats: List container(s) resource usage statistics

这里有趣的部分是,通过crictl + containerdbundle
,人们可以了解pod
是如何实际实现的。

有关如何crictl
containerd
一起使用的更多信息,请查看此文档(containerd
项目的一部分)。

https://github.com/containerd/cri/blob/68b61297b59e38c1088db10fbd19807a4ffbad87/docs/crictl.md

参考地址[1]

参考资料

[1]

参考地址: https://iximiuz.com/en/posts/containerd-command-line-clients/


文章转载自云原生CTO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论