第5关 K8S的新宠Containerd

编程入门 行业动态 更新时间:2024-10-19 15:25:02

第5关 K8S的<a href=https://www.elefans.com/category/jswz/34/1769533.html style=新宠Containerd"/>

第5关 K8S的新宠Containerd

------> 课程视频同步分享在今日头条和B站

大家好,我是博哥爱运维。这节课给大家讲下K8S新版本默认支持的容器运行时(CRI)Containerd 。

时至今日,docker原本的一手好牌被打得稀烂,Google的k8s在1.20明确说明后期将不再支持docker作为容器运行时(后面简称CRI),明面上说kubelet中的模块"dockershim"(该模块实现了对Dcoker的CRI支持)维护给开发团队带来了很大困扰,实则是Docker已经没有了利用价值。

之前在Google、RedHat、IBM几位互联网巨头的忽悠下,Docker公司将libcontainer捐献给了OCI并改名为runC,而随后在容器编排大战中,Docker的Swarm败给了k8s,然后Docker稀里糊涂地将自身核心依赖Containerd捐献给了CNCF,想以此来证明自己Docker是一个PaaS平台。

然而巨头就是巨头,Google明修栈道,暗渡陈仓,首先k8s弄了一个容器运行时的标准CRI(Container Runntime Interface),你只要适配了这个CRI,就能作为k8s的容器运行时一起工作;同时为了不让Docker起疑心,在k8s前期,专门在kubelet中弄了个模块"dockershim",用来将CRI的调用翻译成Docker的API,以使Docker可以作为K8s的容器运行时正常运行。

时间一天天过去,现在Containerd已经羽翼丰满,足以和docker运行时媲美,并且性能比docker更好,目前各大云厂商的k8s服务均推荐用户使用Containerd来作为CRI。

Containerd 和 Docker 组件常用命令是什么?

Containerd 不支持 docker API 和 docker CLI,但是可以通过 ctr 命令实现类似的功能。

镜像相关功能DockerContainerd
显示本地镜像列表docker imagesctr -n k8s.io images ls
下载镜像docker pullctr -n k8s.io images pull -h
上传镜像docker pushctr -n k8s.io images push -h
*删除本地镜像docker rmictr -n k8s.io delete
查看镜像详情docker inspect IMAGE-IDcrictl inspecti IMAGE-ID
*导出离线镜像docker save xxx > xxx.tarctr -n k8s.io images export nginx-1.21.6.tar docker.io/library/nginx:1.21.6
*导入离线镜像docker load -i xxx.tarctr -n k8s.io images import xxx.tar
容器相关功能DockerContainerd
显示容器列表docker pscrictl ps
创建容器docker createcrictl create
启动容器docker startcrictl start
停止容器docker stopcrictl stop
删除容器docker rmcrictl rm
查看容器详情docker inspectcrictl inspect
attachdocker attachcrictl attach
execdocker execcrictl exec
logsdocker logscrictl logs
statsdocker statscrictl stats
POD 相关功能DockerContainerd
显示 POD 列表crictl pods
查看 POD 详情crictl inspectp
运行 PODcrictl runp
停止 PODcrictl stopp
调用链区别有哪些?
  • Docker 作为 k8s 容器运行时,调用关系如下:
    kubelet --> docker shim (在 kubelet 进程中) --> dockerd --> containerd
  • Containerd 作为 k8s 容器运行时,调用关系如下:
    kubelet --> cri plugin(在 containerd 进程中) --> containerd

其中 dockerd 虽增加了 swarm cluster、 docker build 、 docker API 等功能,但也会引入一些 bug,而与 containerd 相比,多了一层调用。

镜像导入/导出操作

注意 k8s 只会使用 k8s.io namespace 中镜像。

使用Containerd时,需要往 k8s.io 导入镜像,containerd worker 终于能正常被调度了

为支持多租户隔离,containerd 有 namespace 概念,不同 namespace 下的 image、container 均不同,直接使用 ctr 操作时,会使用 default namespace

# ctr namespace ls
NAME   LABELS 
k8s.io# containerd需要指定命令空间导入镜像
# docker pull nginx:1.21.6 && docker save nginx:1.21.6 > nginx-1.21.6.tar# ctr -n k8s.io images import nginx-1.21.6.tar

containerd导出镜像,然后通过docker导入也是可以的

# 先查询要导出的镜像名称全名
# ctr -n k8s.io images ls|grep nginx
docker.io/library/nginx:1.21.6                                                                                                   application/vnd.docker.distribution.manifest.list.v2+json sha256:2bcabc23b45489fb0885d69a06ba1d648aeda973fae7bb981bafbb884165e514 54.1 MiB  linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x io.cri-containerd.image=managed 
docker.io/library/nginx@sha256:2bcabc23b45489fb0885d69a06ba1d648aeda973fae7bb981bafbb884165e514                                  application/vnd.docker.distribution.manifest.list.v2+json sha256:2bcabc23b45489fb0885d69a06ba1d648aeda973fae7bb981bafbb884165e514 54.1 MiB  linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x io.cri-containerd.image=managed # 通过ctr导出
# ctr -n k8s.io images export nginx-1.21.6.tar  docker.io/library/nginx:1.21.6
# ll -h nginx-1.21.6.tar 
-rw-r--r-- 1 root root 55M Oct 18 11:51 nginx-1.21.6.tar# 然后用docker导入
# docker images|grep nginx
# docker load -i nginx-1.21.6.tar
ad6562704f37: Loading layer [==================================================>]  31.38MB/31.38MB
58354abe5f0e: Loading layer [==================================================>]  25.35MB/25.35MB
53ae81198b64: Loading layer [==================================================>]     601B/601B
57d3fc88cb3f: Loading layer [==================================================>]     893B/893B
747b7a567071: Loading layer [==================================================>]     667B/667B
33e3df466e11: Loading layer [==================================================>]  1.396kB/1.396kB
Loaded image: nginx:1.21.6# docker images|grep nginx       
nginx                                                1.21.6    0e901e68141f   16 months ago   142MB# docker rmi nginx:1.21.6
Untagged: nginx:1.21.6
Deleted: sha256:0e901e68141fd02f237cf63eb842529f8a9500636a9419e3cf4fb986b8fe3d5d
Deleted: sha256:1e877fb1acf761377390ab38bbad050a1d5296f1b4f51878c2695d4ecdb98c62
Deleted: sha256:834e54d50f731515065370d1c15f0ed47d2f7b6a7b0452646db80f14ace9b8de
Deleted: sha256:d28ca7ee17ff94497071d5c075b4099a4f2c950a3471fc49bdf9876227970b24
Deleted: sha256:096f97ba95539883af393732efac02acdd0e2ae587a5479d97065b64b4eded8c
Deleted: sha256:de7e3b2a7430261fde88313fbf784a63c2229ce369b9116053786845c39058d5
Deleted: sha256:ad6562704f3759fb50f0d3de5f80a38f65a85e709b77fd24491253990f30b6be
Containerd结合docker一起使用的生产案例:

利用docker in docker (简称dind),实际在CRI为Containerd的情况下,还能利用docker 实现打包镜像等功能

# only have docker client ,use dind can be use normal
dindSvc=$(kubectl -n kube-system get svc dind |awk 'NR==2{print $3}')
export DOCKER_HOST="tcp://${dindSvc}:2375/"
export DOCKER_DRIVER=overlay2
export DOCKER_TLS_CERTDIR=""

更多推荐

第5关 K8S的新宠Containerd

本文发布于:2024-03-07 10:24:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1717564.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:新宠   K8S   Containerd

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!