《Kubernetes网络权威指南》读书笔记 | Pod的核心:pause容器

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Kubernetes网络权威指南》读书笔记 | Pod的核心:pause容器相关的知识,希望对你有一定的参考价值。

书籍来源:《Kubernetes网络权威指南:基础、原理与实践》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客


在Kubernetes中,pause容器被当作Pod中所有容器的“父容器”,并为每个业务容器提供以下功能:

  • 在Pod中,它作为共享Linux namespace(Network、UTS等)的基础;
  • 启用PID namespace共享,它为每个Pod提供1号进程,并收集Pod内的僵尸进程。

pause容器源码

在Kubernetes中,pause容器运行着一个非常简单的进程,它不执行任何功能,基本上是永远“睡觉”的。

当然它不会只知道“睡觉”。它执行另一个重要的功能——即它扮演PID 1的角色,并在子进程成为“孤儿进程”的时候,通过调用wait()收割这些僵尸子进程。

  1. namespacepause容器

下面来看一下如何使用pause容器和共享namespace创建Pod。

首先,使用Docker启动pause容器,以便可以将其他容器添加到Pod中:

然后,在Pod中运行其他容器,分别是nginx代理和ghost博客应用。

Nginx代理的后端配置成http://127.0.0.1:2368 ,也就是ghost进程监听的地址,如下所示:

为ghost博客应用程序创建另一个容器,如下所示:

在这个例子中,将pause容器指定为要加入其namespace的容器。如果访问http://localhost:8080/ ,那么应该能够看到ghost通过Nginx代理运行,因为pause、Nginx和ghost容器之间共享networknamespace,如图3-9所示。

通过Pod,Kubernetes屏蔽了以上所有复杂度。

图3-9 Pod的底层实现原理

  1. PIDpause容器

容器使用PID namespace对PID进行隔离,因此每个容器中均可以有独立的init进程。当在主机上发送SIGKILL或者SIGSTOP(也就是docker kill或者docker stop命令)强制终止容器的运行时,其实就是在终止容器内的init进程。一旦init进程被销毁,同一PID namespace下的进程也随之被销毁。

在容器中,必须要有一个进程充当每个PID namespace的init进程,使用Docker的话,ENTRYPOINT进程是init 进程。如果多个容器之间共享PID namespace,那么拥有PID namespace的那个进程须承担init进程的角色,其他容器则作为init进程的子进程添加到PID namespace中。

Pod的init进程,pause容器舍它其谁?

  1. Kubernetes中使用PID namespace共享 / 隔离

Pod内容器共享PID namespace是很有意义的,那为什么还要开放这个禁止PID namesapce共享的开关呢?那是因为当应用程序不会产生其他进程,而且僵尸进程带来的问题可以忽略不计时,就用不到PID namespace的共享了。

以上是关于《Kubernetes网络权威指南》读书笔记 | Pod的核心:pause容器的主要内容,如果未能解决你的问题,请参考以下文章

《Kubernetes网络权威指南》读书笔记 | iptables

《Kubernetes网络权威指南》读书笔记 | 打通CNI与Kubernetes:Kubernetes网络驱动

《Kubernetes网络权威指南》读书笔记 | Kubernetes网络策略:为你的应用保驾护航

《Kubernetes网络权威指南》读书笔记 | 最常用的Docker网络技巧

《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN

《Kubernetes网络权威指南》读书笔记 | 主角登场:Linux容器