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
,例如Containerd
和CRI-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的镜像:
[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指令所看到的镜像为空:
[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
可以看到以下设置:
[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的镜像进行远程访问:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
访问指令如下,registry在本机的/etc/hosts
文件里有设置:
docker -H 192.168.238.130:2375 images
docker -H registry:2375 images
查看daemon.json设置:/etc/docker/daemon.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