为什么有两个容器对应一个k8s pod?

why there are two containers corresponding to a k8s pod?

每当我执行“docker ps -a”时,我都会看到两个容器对应于 pod,这里的 pod 只有容器。通常,“docker ps”下列出的两个容器具有以下前缀:- k8s_POD_kubernetes- 和 k8s_kubernetes-

谁能帮我理解为什么我们在“docker ps”中看到两个条目?

_POD_ 一个是唯一一个具有 Pod 的 IP 地址的,其他的是来自 PodSpec 的 container: 和 [=12] 的每个 workload 容器=] 数组,因为 Kubernetes 的合同之一是 all containers in a Pod share the same network identity

其中的细节涉及 Linux 内核中使“容器”运行的不同名称空间,以及用于 cpu、内存、进程 ID 和网络堆栈的 cgroup。就像 nsenter 允许主机临时将其 cgroup 切换到容器的 cgroup 一样,容器运行时机制是否让 Pod 中的“兄弟”容器切换到该“沙盒”容器的分配网络 cgroup,否则流量从 container[0]container[1] 发送的将显示为不同的主机,违反了网络身份承诺

这也是为什么 Pod 中的容器可以在 Pod 不丢失其 IP 地址的情况下重新启动,并且 .metadata.name 因为只有工作负载容器重新启动,_POD_ 版本保持 运行。这也是为什么您总是会在 Node 的 docker images 列表中看到 k8s.gcr.io/pause images,因为该容器旨在“不执行任何操作”,除了存在