Kubernetes与Docker和Containerd是个什么关系

文章目录

小结

Kubernetes 在不停地迭代演进,Kubernetes停止使用Docker做为Container Runtime,改为Containerd或者CRI-O等与与Container Runtime Interface (CRI)更兼容的Container Runtime,进行了小结。

容器组(Pod)-> 一个Pod封装一个或多个容器(container)

容器(container)

存储资源(volume)

仓库(repository)

镜像(image)
Container Runtime Interface (CRI)

CRI-O: OCI (Open Container Initiative) conformant runtimes.

描述

运行Kubernetes环境需要Container Runtime的支持,最熟知的CRI就是Docker了,Docker是最早被Kubernetes使用的Container Runtime之一,除了Docker以外,还有很多其它的Container Runtime。由于Kubernetes整个环境和它所使用的Container Runtime都在不停地迭代演进,早期Docker的Container Runtime与Kubernetes耦合过紧,不利于模块化。后来Kubernetes引入了Container Runtime Interface (CRI),也就是一个Plug-In API,这样就优先使用了与Container Runtime Interface (CRI)兼容的Container Runtime,例如ContainerdCRI-O,并停止了使用Docker的Container Runtime

一直以来,用户对Docker的使用很熟悉,也就是Docker与直接用户很友好,但它对Kubernetes的融合并不友好。 想要与Kubernetes整合,必须要使用到额外的叫作Dockershim的工具模块,也就是Docker + Dockershim 功能上成为了 Containerd,而Containerd可以用于Kubernetes的CRI. 既然Containerd支持了Docker + Dockershim的功能, Kubernetes在后面的发布版本中就去掉了Dockershim,这也就是Kuberntes停止使用Docker作为Container Runtime

虽然Kubernetes停止使用Docker的Container Runtime,但是Docker依然有其它用途,例如docker build,由Docker编译出来的镜像是OCI (Open Container Initiative)兼容的镜像,兼容于Containerd和CRI-O(OCI (Open Container Initiative) conformant runtimes)。

实例

以上的描述比较复杂, 用实际部署的Kubernetes的环境实例演示一下。

以下是Containerd的镜像:

shell 复制代码
[root@Master ~]#  crictl  --runtime-endpoint=unix:///run/containerd/containerd.sock images
IMAGE                                     TAG                 IMAGE ID            SIZE
docker.io/flannel/flannel-cni-plugin      v1.1.2              7a2dcab94698c       8.25MB
docker.io/flannel/flannel                 v0.22.0             38c11b8f4aa19       70.9MB
docker.io/weaveworks/weave-kube           latest              62fea85d60522       30.9MB
docker.io/weaveworks/weave-npc            latest              690c3345cc9c3       12.8MB
quay.io/metallb/speaker                   v0.13.10            191b3797a6626       50.3MB
registry.k8s.io/coredns/coredns           v1.10.1             ead0a4a53df89       16.2MB
registry.k8s.io/etcd                      3.5.7-0             86b6af7dd652c       102MB
registry.k8s.io/kube-apiserver            v1.27.3             08a0c939e61b7       119MB
registry.k8s.io/kube-apiserver            v1.27.4             e7972205b6614       33.4MB
registry.k8s.io/kube-apiserver            v1.27.6             19b9246d37c8b       33.4MB
registry.k8s.io/kube-controller-manager   v1.27.3             7cffc01dba0e1       111MB
registry.k8s.io/kube-controller-manager   v1.27.4             f466468864b7a       31MB
registry.k8s.io/kube-controller-manager   v1.27.6             7810e6aed9778       31MB
registry.k8s.io/kube-proxy                v1.27.3             5780543258cf0       60.8MB
registry.k8s.io/kube-proxy                v1.27.4             6848d7eda0341       23.9MB
registry.k8s.io/kube-proxy                v1.27.6             ec57bbfaaae73       23.9MB
registry.k8s.io/kube-scheduler            v1.27.3             41697ceeb70b3       56.9MB
registry.k8s.io/kube-scheduler            v1.27.4             98ef2570f3cde       18.2MB
registry.k8s.io/kube-scheduler            v1.27.6             993d768b9b96e       18.2MB
registry.k8s.io/pause                     3.6                 6270bb605e12e       298kB
registry.k8s.io/pause                     3.9                 e6f1816883972       319kB
[root@Master ~]# 

以上crictl是CRI的客户端指令, --runtime-endpoint指定了Endpoint of CRI container runtime service,指向了unix:///run/containerd/containerd.sock

而Docker指令所看到的镜像为空:

shell 复制代码
[root@Master ~]# docker images ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@Master ~]# 

也就是Kubernetes的镜像是放在Containerd下的,并不是放在docker下的。在Kubernetes的使用过程中,Docker被使用为进行镜像的编译。

查看docker服务设置vim /lib/systemd/system/docker.service

可以看到以下设置:

shell 复制代码
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

参考51CTO: docker查看远程仓库 docker 远程 ,进行如下设置可以对Docker的镜像进行远程访问:

shell 复制代码
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

访问指令如下,registry在本机的/etc/hosts文件里有设置:

shell 复制代码
docker -H  192.168.238.130:2375 images
docker -H  registry:2375 images

查看daemon.json设置:/etc/docker/daemon.json,如下:

json 复制代码
{
   "exec-opts":[
      "native.cgroupdriver=systemd"
   ],
   "insecure-registries":[
      "http://registry:80"
   ]
}

参考

51CTO: docker查看远程仓库 docker 远程
Kubernetes: Don't Panic: Kubernetes and Docker
Kubernetes is deprecating Docker as a container runtime after v1.20.
Introducing Container Runtime Interface (CRI) in Kubernetes
Open Container Initiative

相关推荐
Sheffield15 小时前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield1 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽1 天前
win10下运行Start Broker and Proxy报错解决
docker
用户13573999256602 天前
Windows 从 0 搭建 WSL2 原生 AI 开发环境:Codex + Docker + VSCode
docker
vi_h2 天前
在 macOS 上通过 Docker 安装并运行 Ollama(详细可执行教程)
macos·docker·ollama
黑心老魔2 天前
通过 Docker 创建开发环境
docker·开发环境
冬奇Lab3 天前
一天一个开源项目(第41篇):Workout.cool - 现代化开源健身教练平台,训练计划与进度追踪
docker·开源·资讯
天朝八阿哥3 天前
使用Docker+vscode搭建离线的go开发调试环境
后端·docker·visual studio code
可观测性用观测云4 天前
云原生网关 Ingress-Nginx 链路追踪实战:OpenTelemetry 采集与观测云集成方案
nginx·kubernetes
阿虎儿4 天前
Docker安装(非sudo用户可用)
docker