docker组件介绍

  • docker: dockerd客户端工具
  • dockerd: 即docker daemondocker守护进程
  • containerd: 工业级标准的容器运行时,主要功能:
    • 管理容器的生命周期(从创建容器到销毁容器)
    • 拉取/推送容器镜像
    • 存储管理(管理镜像及容器数据的存储)
    • 调用runC运行容器(与runC等容器运行时交互)
    • 管理容器网络接口及网络 ctr: containerd的客户端工具
  • runC: runC是一个符合OCI规范的命令行工具,用来运行容器。

kubelet创建容器流程

运行时为docker时

  1. kubelet通过CRI远程调用内部的dockershim套接字(/var/run/dockershim.sock
  2. dockershim远程调用dockerd套接字(/var/run/docker.sock
  3. dockerd守护进程调用containerd守护进程套接字(/run/containerd/containerd.sock
  4. containerd进程fork出一个container-shim进程,通过调用runc命令行启动、管理容器,并作为容器进程的父进程。
+--------------------+
|                    |
|                    |  CRI gRPC
|   kubelet          +-----+                                                  +---------------+     +--------------+
|                    |     |                                                  |               |     |              |
|                    |     |   +---------------+       +--------------+ fork  |container-shim +----->  container   |
|      +-------------+     |   |               |       |              +------->               |     |              |
|      |             |     |   |               |       |              |       +---------------+     +--------------+
|      |            A+<----+   |               |       |              |                      runc(OCI)
|      | dockershim  |         |    dockerd    |       |  containerd  |       +---------------+     +--------------+
|      |             +--------->B              +------->C             |       |               |     |              |
|      |             |         |               |       |              +------->container-shim +----->  container   |
|      |             |         |               |       |              |       |               |     |              |
+------+-------------+         +---------------+       +--------------+       +---------------+     +--------------+
                                                                      |
                    A:unix:///var/run/dockershim.sock                 +------> ......

                                                        C:/run/containerd/containerd.sock
                                B:/var/run/docker.sock

container-shim有什么作用?

  • 兼容多种OCI运行时:为了能够支持多种OCI Runtimecontainerd内部使用containerd-shim, 每启动一个容器都会创建一个新的containerd-shim进程,指定容器IDBundle目录、运行时的二进制(比如runc
  • 作为容器进程的父进程:避免containerd进程意外退出导致所有容器进程退出。而containerd进程又是所有containerd-shim进程父进程
    • containerd运行的情况下,杀死containerd-shim进程,容器进程会退出。
    • containerd运行的情况下,杀死容器进程,conainerd-shim进程主动退出,containerd触发exit事件以清理该容器。

进程关系

$ pstree 2762
containerd─┬─6*[containerd-shim─┬─sh───java───21*[{java}]]
           │                    └─9*[{containerd-shim}]]
           ├─6*[containerd-shim─┬─java───48*[{java}]]
           │                    └─9*[{containerd-shim}]]
           ├─163*[containerd-shim─┬─pause]
           │                      └─9*[{containerd-shim}]]
           ├─13*[containerd-shim─┬─redis-server───3*[{redis-server}]]
           │                     └─11*[{containerd-shim}]]
           ├─containerd-shim─┬─java───69*[{java}]
           │                 └─9*[{containerd-shim}]
           └─577*[{containerd}]

参考文章

容器运行时笔记 containerd、containerd-shim和runc的依存关系

https://xuanwo.io/2019/08/06/oci-intro/

Copyright © weiliang 2021 all right reserved,powered by Gitbook本书发布时间: 2024-04-22 16:03:41

results matching ""

    No results matching ""