------> 课程视频同步分享在今日头条和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 命令实现类似的功能。
镜像相关功能 | Docker | Containerd |
---|---|---|
显示本地镜像列表 | docker images | ctr -n k8s.io images ls |
下载镜像 | docker pull | ctr -n k8s.io images pull -h |
上传镜像 | docker push | ctr -n k8s.io images push -h |
*删除本地镜像 | docker rmi | ctr -n k8s.io delete |
查看镜像详情 | docker inspect IMAGE-ID | crictl inspecti IMAGE-ID |
*导出离线镜像 | docker save xxx > xxx.tar | ctr -n k8s.io images export nginx-1.21.6.tar docker.io/library/nginx:1.21.6 |
*导入离线镜像 | docker load -i xxx.tar | ctr -n k8s.io images import xxx.tar |
容器相关功能 | Docker | Containerd |
---|---|---|
显示容器列表 | docker ps | crictl ps |
创建容器 | docker create | crictl create |
启动容器 | docker start | crictl start |
停止容器 | docker stop | crictl stop |
删除容器 | docker rm | crictl rm |
查看容器详情 | docker inspect | crictl inspect |
attach | docker attach | crictl attach |
exec | docker exec | crictl exec |
logs | docker logs | crictl logs |
stats | docker stats | crictl stats |
POD 相关功能 | Docker | Containerd |
---|---|---|
显示 POD 列表 | 无 | crictl pods |
查看 POD 详情 | 无 | crictl inspectp |
运行 POD | 无 | crictl runp |
停止 POD | 无 | crictl 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导入也是可以的文章来源:https://www.toymoban.com/news/detail-792930.html
# 先查询要导出的镜像名称全名
# 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 实现打包镜像等功能文章来源地址https://www.toymoban.com/news/detail-792930.html
# 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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!