如何优雅地使用containerd?这里有一份必读的技巧攻略
前 言
Docker是我们常用的容器runtime,友好的CLI,丰富的社区资料,外加研发运维人员多年的经验积累,使用Docker几乎是没有任何门槛的事。而k3s为了降低资源消耗,将默认的runtime修改为containerd,虽然containerd很早就已经是Docker的一部分,但是纯粹使用containerd还是给大家带来了诸多困扰。本文收集了一些社区常见的containerd问题,寻求到解决方案后整理成文,供大家需要时查阅。
入门简介
我们都知道Kubernetes定义了自己运行时接口规范CRI,containerd虽然具备容器管理能力,但是不能被直接被Kubernetes使用。k3s作为Kubernetes的精简版本,也是如此,k3s自身的kubelet通过cri-containerd plugin(https://github.com/containerd/cri)来驱动containerd创建Pod。

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

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

目前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
所以我们只能使用其他方式,通常我会这样做:
# 在一台机去上使用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 中,但是如果要修改其配置不能单纯修改它,你需要通过模版修改它:
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配置请参考:
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,才能跟上社区主流的前进方向。
如何优雅地使用containerd?这里有一份必读的技巧攻略的更多相关文章
- 配置 containerd 镜像仓库完全攻略
作者简介 王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营.拥有6年的云计算领域经验,经历了OpenStack到Kubernetes的技术变革,无论底层操作系统Lin ...
- NET经典书籍必读
C#与.NET框架,入门 + 进阶 + 精通,外加并发编程实例,10本C#图书,一本都不能少. 1.<Learning hard C#学习笔记> 作者:李志 书号:978-7-115-3 ...
- 【Pod Terminating原因追踪系列之二】exec连接未关闭导致的事件阻塞
前一阵有客户docker18.06.3集群中出现Pod卡在terminating状态的问题,经过排查发现是containerd和dockerd之间事件流阻塞,导致后续事件得不到处理造成的. 定位问题的 ...
- 缓冲区溢出利用——捕获eip的傻瓜式指南
[译文] 摘要:为一个简单的有漏洞程序写一个简单的缓冲区溢出EXP,聚焦于遇到的问题和关键性的教训,提供详细而彻底的描述 内容表:1. I pity the fool, who can't smash ...
- 转: GUI应用程序架构的十年变迁:MVC,MVP,MVVM,Unidirectional,Clean
十年前,Martin Fowler撰写了 GUI Architectures 一文,至今被奉为经典.本文所谈的所谓架构二字,核心即是对于对于富客户端的 代码组织/职责划分 .纵览这十年内的架构模式变迁 ...
- 新书出版《.NET框架设计—模式、配置、工具》感恩回馈社区!
很高兴我的第一本书由图灵出版社出版.本书总结了我这些年来对框架学习.研究的总结,里面纯干货,无半句废话. 书的详情请看互动网的销售页面:http://product.china-pub.com/377 ...
- Sublime Text 3专题
MarkDown语法记笔记 1.下载&&安装 下载 常用插件安装 Submlit使用教程 [如何优雅地使用Sublime Text3] 2.Sublime Text 便捷技巧 [以PH ...
- fir.im Weekly - Stanford 的 Swift 课程来了
上周提过,Swift 的 Github 主页上已经有了 >>「Port to Android」,这周重点推荐一下 Stanford 的 Swift 课程. Developing iOS 9 ...
- Moon.Orm3.8技术全攻略
Moon.ORM技术全攻略 一.绪论 本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从 ...
随机推荐
- teamviewer早期版本下载链接
https://www.teamviewer.cn/cn/download/previous-versions/
- 并发编程的基石——CAS机制
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 Java中提供了很多原子操作类来保证共享变量操作的原子性 ...
- docker-网桥
使用桥接网络 在网络方面,桥接网络是链路层设备,它在网络段之间转发流量. 网桥可以是硬件设备或在主机内核中运行的软件设备. Docker而言,桥接网络使用软件桥接器,该软件桥接器允许连接到同一桥接网络 ...
- Bandicam(班迪录屏)高清视频录制工具
Bandicam(班迪录屏)简单好用的录屏幕,录游戏,录视频的功能强大的屏幕录像软件,比起其他软件其性能更加卓越. 与其他软件相比,用Bandicam录制的视频大小更小, 不仅保证原文件的质量.
- Go中的Package和Module分析
Package 所谓package(包)其实就是代码的一种组织管理方式,代码多了就需要放入文件,文件多了就需要归类放入文件夹,就好比我们在给电脑装软件时会进行归类安装,其实也是有意无意对电脑软件安装的 ...
- Python - 线性回归(Linear Regression) 的 Python 实现
背景 学习 Linear Regression in Python – Real Python,前面几篇文章分别讲了"regression怎么理解","线性回归怎么理解& ...
- 程序员如何才能跨过高级级别,譬如腾讯T3.1/阿里P7
首先自我介绍下自己履历:5年前过了腾讯的T3.2,最近又在1年多前过了阿里的P8,目前在B站. **腾讯** 在腾讯我是T2.1社招一般水平入职的,3年后到了T3.2.中间是经历过几个转变:刚来的半年 ...
- 小程序中组件公用属性和data-的使用
属性名 类型 描述 注解 hidden Boo ...
- 失衡天平 - 简单dp
链接:https://www.nowcoder.com/acm/contest/186/C来源:牛客网 终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个 ...
- 关于爬虫的日常复习(17)——scrapy系列2