关注分享主机优惠活动
国内外VPS云服务器

Kubernetes Pod 的特殊容器:pause-amd64

总结:命名空间的总体目标之一是支持轻量级虚拟化工具的实现。 该机制本身向外界提供了一组进程,它认为这些进程是系统内存在的唯一进程。 在进程注册的信号处理函数中,调用另一个系统调用来获取子进程终止的原因。

您在使用 Docker 容器或 Kubernetes 时遇到过这个容器吗? gcr.io/google_containers/pause-amd64

docker ps 命令返回的结果:

[root@k8s-minion1 kubernetes ]# docker ps |grep stopc3026adee957 gcr.io/google_containers/pause -amd64:3.0 " /pause " 22 分钟前 d636e gcr.io/google_containers/pause- amd64:3.0 "/pause" 24 小时前 Up 24 小时 k8s_POD.d8dbe16c_kube-proxy-js0z0_kube[k4 ]system_2866cfc2-0891-11e7-914b-0a77ecd65f3e_c8e1a667072d3414d33a gcr.io/google_containers/pause-amd64:3.0“/pause”24小时前 k8s_POD.d8dbe16c_kube-flannel-ds- _default_2866e3fb- 0891[k4 ]11e7-914b-0a77ecd65f3e_be4b719e[root@k8s-minion1 kubernetes]#

Kubernetes官网说明:

它是基础设施的一部分,这个容器。首先在每个 Pod 上启动以设置 Pod 的网络。  

这意味着pause-amd64是Kubernetes管理的每个Pod的一部分。 amd64 容器最初启动并用于实现 Kubernetes 集群中 pod 之间的网络通信。

对这个特殊容器感兴趣的朋友可以阅读它的源码:
https://。 /github.com/kubernetes...

我查看了这个pose-amd64图像的dockerfile,发现从空图像开始实现非常简单。

scratchARG ARCADD bin /pause-${ARCH} /pauseENTRYPOINT ["/pause"]

ARG指令用于指定运行docker build命令时要传递的参数。

这个挂起容器是用C写的:

https://www.ianlewis.org/en/a...

在正在运行的 Kubernetes 节点上运行 docker ps,您将发现以下暂停的容器:

暂停容器是 Pod 中所有其他容器的父容器。 主要有两个。 职责:

与 Pod 内的其他容器共享 Linux 命名空间的基础。

充当PID 1,负责处理僵尸进程。

这两点我将一一详细解释。 解释。 在Linux上,当父进程派生一个新进程时,子进程会继承父进程的命名空间。 目前,Linux 实现了六种类型的命名空间。 每个命名空间都是一个抽象集合,封装了一些全局系统资源。 这个抽象集合允许全局系统资源在进程的命名空间中可见。 命名空间的总体目标是支持轻量级虚拟化工具容器实现。 容器机制本身向外界暴露了一组进程。 这组进程认为自己是系统中唯一存在的进程。

在 Linux 上,由父进程派生的子进程继承父进程的命名空间。 反对这种行为的系统命令是unshare。

我们来谈谈挂起的容器如何处理僵尸进程。

Pause容器内实际上运行着一个非常简单的进程。 该逻辑可以在上面提到的 Pause github 存储库中找到。

static void sigdown(int Signo) { pssignal(signo, "正在关闭,收到信号");xit(0);}static void sigreap(intsigno) { while (waitpid(-1, NULL, WNOHANG) > 0);}int main() { if (getpid() != 1) /* 非暂停识别基础设施容器外部的使用并导致错误。   */ fprintf(stderr, "警告:挂起必须是第一个进程"); if (sigaction(SIGINT, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0 ) 返回 1 。   if (sigaction(SIGTERM, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0) 返回 2。   if (sigaction(SIGCHLD, &(struct sigaction){.sa_handler = sigreap, .sa_flags = SA_NOCLDSTOP}, NULL) < 0) 返回 3;   for (;;)pause(); fprintf(stderr, "Error: Infinite loop returned"); return 42;}

这个过程是用C实现的,核心代码只有28行。

第 24 行有一个 for(;; ) 无限循环。 至此,你就可以看到 SuspendContainer 这个名字的由来了。

这个无限循环的作用是挂起系统调用。

因此,暂停容器大部分时间都会休眠,等待信号将其唤醒。

收到什么信号?

当收到SIGCHLD信号时,暂停进程执行注册的sigreap函数。

查看SIGCHLD信号的帮助:

SIGCHLD,当进程正常终止或停止时,SIGCHLD信号时发送到父进程,系统默认忽略。 如果父进程想要​​收到有关其子系统的此状态的通知,则它必须捕获此信号。

挂起进程注册的信号处理函数sigreap调用另一个系统调用waitpid来获取子进程终止的原因。

我希望本文能帮助您了解 Kubernetes 中的挂起容器。 感谢您的阅读。

获取更多Jerry原创文章,请关注公众号“王子熙”:

未经允许不得转载:主机频道 » Kubernetes Pod 的特殊容器:pause-amd64

评论 抢沙发

评论前必须登录!