《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的共享了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值