如何优雅地使用containerd?这里有一份必读的技巧攻略

前 言

Docker是咱们经常使用的容器runtime,友好的CLI,丰富的社区资料,外加研发运维人员多年的经验积累,使用Docker几乎是没有任何门槛的事。而k3s为了下降资源消耗,将默认的runtime修改成containerd,虽然containerd很早就已是Docker的一部分,可是纯粹使用containerd仍是给你们带来了诸多困扰。本文收集了一些社区常见的containerd问题,寻求到解决方案后整理成文,供你们须要时查阅。git

入门简介

咱们都知道Kubernetes定义了本身运行时接口规范CRI,containerd虽然具有容器管理能力,可是不能被直接被Kubernetes使用。k3s做为Kubernetes的精简版本,也是如此,k3s自身的kubelet经过cri-containerd plugin(https://github.com/containerd/cri)来驱动containerd建立Pod。github

在这里插入图片描述

单纯的Containerd没有Docker CLI,对于常用Docker的用户来讲,一下就会感到不习惯。根据CRI规范,Kubernetes社区也定义了专门CLI工具crictl(https://github.com/kubernetes-sigs/cri-tools)。k3s中也内置了crictl,它被直接编译到k3s binary中,你在安装k3s时,会自动建立crictl的软链接。crictl具有了和Docker CLI相似的功能:docker

在这里插入图片描述

除了crictl,k3s还内置了ctr(https://github.com/containerd/containerd/tree/master/cmd/ctr),ctr是containerd自己的CLI,更对容器和镜像API的基本封装:ubuntu

在这里插入图片描述

目前k3s的containerd使用的runc-v2版本,这个版本有个巨大的优化就是针对每一个Pod建立containerd-shim进程。以Traefik Pod为例,pause容器和traefik容器都是containerd-shim的子进程,这种进程划分方式更加合理,对Kubernetes更加友好。运维

在这里插入图片描述

经常使用技巧

containerd相关的CLI确实没有Docker CLI方便,好比笔者在使用containerd时碰到一个场景,指望实现对镜像从新tag的操做,这在Docker下很是容易作到,可是在containerd下很是麻烦。crictl中并不支持这种操做,社区中也有相关issue解释:工具

https://github.com/kubernetes-sigs/cri-tools/issues/438优化

因此咱们只能使用其余方式,一般我会这样作:3d

# 在一台机去上使用docker tag转换image
# 导出镜像,并拷贝到k3s机器上
docker tag busybox busyboxaaa
docker save -o busybox.tar busyboxaaa
scp busybox.tar ubuntu@172.31.24.12:~/
 
# 用ctr导入
ctr image import busybox.tar

k3s集成的containerd的配置文件被存放在 /var/lib/rancher/k3s/agent/etc/containerd/config.toml 中,可是若是要修改其配置不能单纯修改它,你须要经过模版修改它:rest

cd /var/lib/rancher/k3s/agent/etc/containerd
cp config.toml config.toml.tmpl
 
# update config.toml.tmpl
# reboot k3s to take affect
systemctl restart k3s

一般来讲,咱们都会在本地环境使用k3s,使用私有Registry也是不可避免的,Docker中配置私有registry是很是方便的,而在containerd中该如何配置?关于containerd的registry配置请参考:code

https://github.com/containerd/cri/blob/master/docs/registry.md

值得一提的是一个特殊场景,一般你会在内网在用registry镜像启用一个镜像仓库服务,为了简单方便,你能够不启用tls证书而单纯使用http模式。这种状况下,k3s有一个方便的配置方式,即编辑/etc/rancher/k3s/registries.yaml,好比:

$ cat /etc/rancher/k3s/registries.yaml
mirrors:
  "172.31.7.129:5000":
    endpoint:
      - "http://172.31.7.129:5000”
 
$ systemctl restart k3s

重启后,containerd的配置会出现变化,直接使用crictl命令便可拉取镜像:

在这里插入图片描述

后 记

从业界的技术发展趋势上看,Docker愈来愈被Kubernetes社区所抛弃,以实现CRI接口的各类容器runtime会与Kubernetes兼容性愈加友好。Docker自己的迭代速度已经没法知足容器的发展,k3s直接使用containerd能够很快跟踪各类容器技术自己的新特性,对技术人员来讲,尽早适应Docker之外的runtime,才能跟上社区主流的前进方向。

相关文章
相关标签/搜索