摘要:命名空间的一个总体目标是支持轻量级虚拟化工具的实现,机制本身对外提供一组进程,这组进程自己会认为它们就是系统唯一存在的进程。进程注册的信号处理函数里,调用另一个系统调用来获得子进程终止的原因。
大家在使用Docker容器或者Kubernetes时,遇到过这个容器么?gcr.io/google_containers/pause-amd64
docker ps的命令返回的结果:
[root@k8s-minion1 kubernetes]# docker ps |grep pause c3026adee957 gcr.io/google_containers/pause-amd64:3.0 "/pause" 22 minutes ago Up 22 minutes k8s_POD.d8dbe16c_redis-master-343230949-04glm_default_ce3f60a9-095d-11e7-914b-0a77ecd65f3e_66c108d5 202df18d636e gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 hours ago Up 24 hours k8s_POD.d8dbe16c_kube-proxy-js0z0_kube-system_2866cfc2-0891-11e7-914b-0a77ecd65f3e_c8e1a667 072d3414d33a gcr.io/google_containers/pause-amd64:3.0 "/pause" 24 hours ago Up 24 hours k8s_POD.d8dbe16c_kube-flannel-ds-tsps5_default_2866e3fb-0891-11e7-914b-0a77ecd65f3e_be4b719e [root@k8s-minion1 kubernetes]#
Kubernetes的官网解释:
it"s part of the infrastructure. This container is started first in all Pods to setup the network for the Pod.
意思是:pause-amd64是Kubernetes基础设施的一部分,Kubernetes管理的所有pod里,pause-amd64容器是第一个启动的,用于实现Kubernetes集群里pod之间的网络通讯。
对这个特殊容器感兴趣的朋友,可以阅读其源代码:
https://github.com/kubernetes...
我们查看这个pause-amd64镜像的dockerfile,发现实现很简单,基于一个空白镜像开始:
FROM scratch ARG ARCH ADD bin/pause-${ARCH} /pause ENTRYPOINT ["/pause"]
ARG指令用于指定在执行docker build命令时传递进去的参数。
这个pause container是用C语言写的:
https://www.ianlewis.org/en/a...
在运行的Kubernetes node上运行docker ps,能发现这些pause container:
pause container作为pod里其他所有container的parent container,主要有两个职责:
是pod里其他容器共享Linux namespace的基础
扮演PID 1的角色,负责处理僵尸进程
这两点我会逐一细说。在Linux里,当父进程fork一个新进程时,子进程会从父进程继承namespace。目前Linux实现了六种类型的namespace,每一个namespace是包装了一些全局系统资源的抽象集合,这一抽象集合使得在进程的命名空间中可以看到全局系统资源。命名空间的一个总体目标是支持轻量级虚拟化工具container的实现,container机制本身对外提供一组进程,这组进程自己会认为它们就是系统唯一存在的进程。
在Linux里,父进程fork的子进程会继承父进程的命名空间。与这种行为相反的一个系统命令就是unshare:
再来聊聊pause容器如何处理僵尸进程的。
Pause容器内其实就运行了一个非常简单的进程,其逻辑可以从前面提到的Pause github仓库上找到:
static void sigdown(int signo) { psignal(signo, "Shutting down, got signal"); exit(0); } static void sigreap(int signo) { while (waitpid(-1, NULL, WNOHANG) > 0); } int main() { if (getpid() != 1) /* Not an error because pause sees use outside of infra containers. */ fprintf(stderr, "Warning: pause should be the first process "); if (sigaction(SIGINT, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0) return 1; if (sigaction(SIGTERM, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0) return 2; if (sigaction(SIGCHLD, &(struct sigaction){.sa_handler = sigreap, .sa_flags = SA_NOCLDSTOP}, NULL) < 0) return 3; for (;;) pause(); fprintf(stderr, "Error: infinite loop terminated "); return 42; }
这个c语言实现的进程,核心代码就28行:
其中第24行里一个无限循环for(;;), 至此大家能看出来pause容器名称的由来了吧?
这个无限循环里执行的是一个系统调用pause,
因此pause容器大部分时间都在沉睡,等待有信号将其唤醒。
接收什么信号呢?
一旦收到SIGCHLD信号,pause进程就执行注册的sigreap函数。
看下SIGCHLD信号的帮助:
SIGCHLD,在一个进程正常终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。
pause进程注册的信号处理函数sigreap里,调用另一个系统调用waitpid来获得子进程终止的原因。
希望这篇文章对大家理解Kubernetes里的pause容器有所帮助。感谢阅读。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/27630.html
摘要:命名空间的一个总体目标是支持轻量级虚拟化工具的实现,机制本身对外提供一组进程,这组进程自己会认为它们就是系统唯一存在的进程。进程注册的信号处理函数里,调用另一个系统调用来获得子进程终止的原因。 大家在使用Docker容器或者Kubernetes时,遇到过这个容器么?gcr.io/google_containers/pause-amd64 showImg(https://segmentf...
摘要:命名空间的一个总体目标是支持轻量级虚拟化工具的实现,机制本身对外提供一组进程,这组进程自己会认为它们就是系统唯一存在的进程。进程注册的信号处理函数里,调用另一个系统调用来获得子进程终止的原因。 大家在使用Docker容器或者Kubernetes时,遇到过这个容器么?gcr.io/google_containers/pause-amd64 showImg(https://segmentf...
摘要:基于的本地环境搭建与应用部署归纳于分布式容器与编排,参考了一文,更多或者相关资料参阅。最后我们还可以用与命令来删除应用 showImg(https://segmentfault.com/img/remote/1460000006760432); 基于 Docker for MAC 的 Kubernetes 本地环境搭建与应用部署归纳于分布式容器与编排,参考了 Docker + Kub...
摘要:基于的本地环境搭建与应用部署归纳于分布式容器与编排,参考了一文,更多或者相关资料参阅。最后我们还可以用与命令来删除应用 showImg(https://segmentfault.com/img/remote/1460000006760432); 基于 Docker for MAC 的 Kubernetes 本地环境搭建与应用部署归纳于分布式容器与编排,参考了 Docker + Kub...
摘要:序上次虽然写了两篇在装的,但是仅仅限于初步安装,这次再补上跑个,正好也赶上阿里云有相关镜像,于是这里再次记录下。 序 上次虽然写了两篇在mac装kubernetes的,但是仅仅限于初步安装,这次再补上跑个demo,正好也赶上阿里云有相关镜像,于是这里再次记录下。 安装minikube curl -Lo minikube https://storage.googleapis.com/mi...
阅读 2052·2021-11-11 16:55
阅读 1394·2021-09-28 09:36
阅读 1038·2019-08-29 15:21
阅读 1570·2019-08-29 14:10
阅读 2756·2019-08-29 14:08
阅读 1627·2019-08-29 12:31
阅读 3243·2019-08-29 12:31
阅读 975·2019-08-26 16:47