前 言

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?这里有一份必读的技巧攻略的更多相关文章

  1. 配置 containerd 镜像仓库完全攻略

    作者简介 王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营.拥有6年的云计算领域经验,经历了OpenStack到Kubernetes的技术变革,无论底层操作系统Lin ...

  2. NET经典书籍必读

    C#与.NET框架,入门 + 进阶 + 精通,外加并发编程实例,10本C#图书,一本都不能少. 1.<Learning hard C#学习笔记> 作者:李志  书号:978-7-115-3 ...

  3. 【Pod Terminating原因追踪系列之二】exec连接未关闭导致的事件阻塞

    前一阵有客户docker18.06.3集群中出现Pod卡在terminating状态的问题,经过排查发现是containerd和dockerd之间事件流阻塞,导致后续事件得不到处理造成的. 定位问题的 ...

  4. 缓冲区溢出利用——捕获eip的傻瓜式指南

    [译文] 摘要:为一个简单的有漏洞程序写一个简单的缓冲区溢出EXP,聚焦于遇到的问题和关键性的教训,提供详细而彻底的描述 内容表:1. I pity the fool, who can't smash ...

  5. 转: GUI应用程序架构的十年变迁:MVC,MVP,MVVM,Unidirectional,Clean

    十年前,Martin Fowler撰写了 GUI Architectures 一文,至今被奉为经典.本文所谈的所谓架构二字,核心即是对于对于富客户端的 代码组织/职责划分 .纵览这十年内的架构模式变迁 ...

  6. 新书出版《.NET框架设计—模式、配置、工具》感恩回馈社区!

    很高兴我的第一本书由图灵出版社出版.本书总结了我这些年来对框架学习.研究的总结,里面纯干货,无半句废话. 书的详情请看互动网的销售页面:http://product.china-pub.com/377 ...

  7. Sublime Text 3专题

    MarkDown语法记笔记 1.下载&&安装 下载 常用插件安装 Submlit使用教程 [如何优雅地使用Sublime Text3] 2.Sublime Text 便捷技巧 [以PH ...

  8. fir.im Weekly - Stanford 的 Swift 课程来了

    上周提过,Swift 的 Github 主页上已经有了 >>「Port to Android」,这周重点推荐一下 Stanford 的 Swift 课程. Developing iOS 9 ...

  9. Moon.Orm3.8技术全攻略

    Moon.ORM技术全攻略  一.绪论 本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从 ...

随机推荐

  1. 解决springmvc报错,java.lang.IllegalArgumentException:No converter found for return value of type: class .......

    1.背景 最近在自学java中的三大框架 ssm,在 springmvc 与 mybatis 整合过程中用到 json 数据交互.因为看的视频的是比较早的嘛,一些配置.jar包什么的,要么跟 jdk ...

  2. vue-cli3 中 sockjs-node/info?t=报错 的解决方法

    页面突然出现这种报错: 查看Network看到是info接口报错,我项目中没有调用过该项目,然后百度查询sockjs-node/info?t=1562204191563, 首先 sockjs-node ...

  3. 物理ceph集群+K8s

    前提条件 在Ceph为k8s创建一个pool ceph osd pool create k8s 128 创建admin用户 ceph auth get-or-create client.admin m ...

  4. [Windows10]记一次修复注册表相关血案:该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置”页面中创建关联。

    今天闲得蛋疼清理了一下右键菜单,于是在之后某时刻使用Everything的“双击路径列打开目录”功能时发现异常: [Window Title] Everything.exe [Content] 该文件 ...

  5. NetCore 启动地址配置详解

    背景 程序在发布部署时候,设置环境ASPNETCORE_URLS不生效,也没在代码里使用UseUrls("xxxx"),启动一直是http://localhost:5000.最后测 ...

  6. react-antd-input-onPressEnter

    2020-01-11 ant-Design ,Input , onPressEnter 和 onChange 的区别 需求:看下图,右边栏配置开关组件的内容.输入内容,不想要左边实时更改 原来的代码: ...

  7. linux入门系列6--软件管理之rpm和yum仓库

    前面系列文章中,我们对vi编辑器和46个基本命令进行了介绍,本文将演示在centos7下使用RPM和YUM安装和管理软件. 一.RPM软件包管理器 1.1 RPM背景介绍 ​ RPM(RedHat P ...

  8. P2756 飞行员配对方案问题 二分图匹配 匈牙利算法

    题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外 ...

  9. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  10. Spring Boot自动装配

    前言 一些朋友问我怎么读源码,这篇文章结合我看源码时候一些思路给大家聊聊,我主要从这三个方向出发: 确定目标,这个目标要是一个具体,不要一上来我要看懂Spring,这是不可能的,目标要这么来定,比如看 ...