docker - 在 k8s 进程中,“kube-controller-manager”是来自 docker conainer 的“子进程”。为什么 k8s 有这样的架构?
问题描述
进程 ID 21186 是 runc。而 21257 是 kube-controller-manager。
我不明白为什么主机的进程是子进程。
而且,我不知道 docker 容器可以运行主机的进程。
为什么 k8s 采用这种架构。
其他过程同形式。
你能帮忙吗?谢谢
[root@instance-3 ~]# ps -ef | grep 21186
root 21186 10930 0 06:20 ? 00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/3fd66799d02cb2c2f195fd85fadf852b7a7c0905707e6c25d1fdec93c1dc850b -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root 21257 21186 1 06:20 ? 00:00:08 kube-controller-manager --aut....
解决方案
这就是容器化一个符合OCI的核心容器运行时在 kubernetes 中的工作方式。
Kubelet 通过 CRI 运行时服务 API 调用 cri-containerd 创建 pod;
cri-containerd 使用 containerd 创建和启动一个特殊的暂停容器(沙盒容器),并将该容器放入 pod 的 cgroups 和命名空间(为简洁起见省略步骤);
cri-containerd 使用 CNI 配置 pod 的网络命名空间;
Kubelet 随后通过 CRI 镜像服务 API 调用 cri-containerd 来拉取应用容器镜像;
如果节点上不存在镜像,cri-containerd 进一步使用 containerd 拉取镜像;
Kubelet 然后通过 CRI 运行时服务 API 调用 cri-containerd,使用拉取的容器镜像在 Pod 内创建和启动应用程序容器;
cri-containerd 最后调用 containerd 来创建应用容器,将其放入 pod 的 cgroups 和命名空间中,然后启动 pod 的新应用容器。在这些步骤之后,一个 pod 及其对应的应用程序容器被创建并运行。
https://kubernetes.io/blog/2017/11/containerd-container-runtime-options-kubernetes/
推荐阅读
- rest - 如何使用 Chef REST API 获取特定对象数据?
- javascript - Pusher/Chatkit:路径中的 InstanceID 和访问令牌不匹配
- java - @DynamoDBIndexHashKey 必须指定 HASH GSI 名称之一
- python - 更新 download.default_directory chromedriver 以下载不同的文件
- f# - 如何在 F# 代码中调试没有详细信息的 TypeLoadException?
- android - 从 firebase 检索 hashmap 以填充 FirebaseRecycler,null HashMap
- azure - OpenSIPS Azure 信令不转发呼叫
- batch-file - 变量是净使用批次
- spring-mvc - 如何将 Thymeleaf th:field 与 java 8 LocalDate 绑定
- postgresql - 如何使用 PostgreSQL 和 TypeORM 进行查询)其中表具有 JSON 类型列