• 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的镜像:

    [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 ~]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    以上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 ~]# 
    
    • 1
    • 2
    • 3

    也就是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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
    
    • 1

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

    docker -H  192.168.238.130:2375 images
    docker -H  registry:2375 images
    
    • 1
    • 2

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

    {
       "exec-opts":[
          "native.cgroupdriver=systemd"
       ],
       "insecure-registries":[
          "http://registry:80"
       ]
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    参考

    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

  • 相关阅读:
    MFC工程的MFC库使用方式与运行时库不一致引起的编译问题
    c++课后作业
    各位大佬,有什么办法能过滤掉箭头所示的标签呢
    阿里面试官最新分享的Java面试宝典,含8大核心内容讲解
    flink状态后端和检查点的关系
    如何使用清华源镜像下载python相关的包?
    危险边缘:揭示 Python 编程中易被忽视的四个安全陷阱
    博客无限滚动加载(html、css、js)实现
    Spring Boot(二)
    uniapp在App端如何动态修改原生导航栏?
  • 原文地址:https://blog.csdn.net/scruffybear/article/details/133874025