大家在使用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之间的网络通讯。

我们查看这个pause-amd64镜像的dockerfile,发现实现很简单,基于一个空白镜像开始:

FROM scratch

ARG ARCH

ADD bin/pause-${ARCH} /pause

ENTRYPOINT ["/pause"]

ARG指令用于指定在执行docker build命令时传递进去的参数。

这个pause container是用C语言写的:

在运行的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\n");  if (sigaction(SIGINT, &(struct sigaction){.sa_handler = sigdown}, NULL)

.sa_flags = SA_NOCLDSTOP},                NULL)

pause();  fprintf(stderr, "Error: infinite loop terminated\n");  return 42;

}

这个c语言实现的进程,核心代码就28行:

其中第24行里一个无限循环for(;;), 至此大家能看出来pause容器名称的由来了吧?

这个无限循环里执行的是一个系统调用pause,

因此pause容器大部分时间都在沉睡,等待有信号将其唤醒。

接收什么信号呢?

一旦收到SIGCHLD信号,pause进程就执行注册的sigreap函数。

看下SIGCHLD信号的帮助:

SIGCHLD,在一个进程正常终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。

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

希望这篇文章对大家理解Kubernetes里的pause容器有所帮助。感谢阅读。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

pause容器作用_Kubernetes pod里一个特殊的容器:pause-amd64相关推荐

  1. pause容器作用_Kubernetes学习之pause容器

    根据代码看到,pause容器运行着一个非常简单的进程,它不执行任何功能,一启动就永远把自己阻塞住了, 它的作用就是扮演PID1的角色,并在子进程称为"孤儿进程"的时候,通过调用wa ...

  2. pause容器作用_kubernetes中的Pause容器如何理解?

    前几篇文章都是讲的Kubernetes集群和相关组件的部署,但是部署只是入门的第一步,得理解其中的一些知识才行.今天给大家分享下Kubernets的pause容器的作用. Pause容器 全称infr ...

  3. k8s mysql容器镜像_kubernetes(二)之Docker容器及镜像

    容器及镜像 容器 常见的容器状态 running stopped paused created deleted 注意: 查看docker状态使用的命令: docker ps: 查看running状态的 ...

  4. 查看k8s中Pod里容器的数量和名称

    查看Pod里容器的名称 初始化一个包含两个容器的Pod(tomcat和nginx),其中文件名为ini-pod.yaml apiVersion: v1 kind: Pod metadata:name: ...

  5. 5. Kubernetes 进阶之容器组(Pod)

    Pod详解 Pod介绍 术语中英文对照: 英文全称 英文缩写 中文翻译 Pod Pod 容器组 Container Container 容器 Controller Controller 控制器 什么是 ...

  6. pause容器作用_容器编排之战(四)连载

    Master Master主要负责资源调度,控制副本,和提供统一访问集群的入口.--核心节点也是管理节点 Node Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或min ...

  7. k8s pod里访问不到外部ip_K8S容器网络如何实现通信?

    Kubernetes(简称K8S)正迅速成为云计算中部署和管理软件的新标准,那么K8S的容器网络是如何通信的呢?在了解容器网络通信原理之前,我们先学习下K8S中主要组件的定义,包括:节点(Node). ...

  8. docker 解决php 502,Docker里两个php容器一个正常访问,一个出现502 Bad Gateway nginx/1.17.8。...

    问题描述 Docker里两个php容器一个镜像是phpfpm5.6,运行的程序是emlog,正常访问.一个镜像是phpfpm7.3,运行的程序是wordpress,运行的出现502 Bad Gatew ...

  9. k8s pod生命周期、初始化容器、钩子函数、容器探测、重启策略

    pod结构 Pause容器 Pause容器是每个Pod都会有的一个根容器,它的作用有两个 可以以它为根据,评估整个pod的健康状态 可以在根容器上设置IP地址,其他容器都以此IP(Pod IP),以实 ...

  10. 图解 K8S(04):吃透 Pod 中的第三类容器 -- init 容器

    本系列教程目录(已发布): 图解 K8S(01):基于ubuntu 部署最新版 k8s 集群 图解 K8S(02):认识 K8S 中的资源对象 图解 K8S(03):从 Pause 容器理解 Pod ...

最新文章

  1. 蓝桥杯比赛常考算法_蓝桥杯总结-常用函数及算法
  2. 【数据结构与算法】之线性表的应用和操作
  3. 删除已弃用的CMS垃圾收集器的JEP草案
  4. Duplicate interface definition for class
  5. 回溯法采用的搜索策略_急性阑尾炎最典型的症状为:
  6. 怎样利用Python制作守护进程
  7. java测试接口_Java测试普通Java接口记录-TestHrmInterface
  8. 小程序源码:开心锤锤超火动态表情包
  9. WPA3也不安全啦?WPA3-R3 H2E了解一下
  10. python实现——文件操作(超详细)
  11. UVALive - 5713 Qin Shi Huang's National Road System
  12. maven本地仓库设置
  13. PowerMock注解PowerMockIgnore的使用方法
  14. pygame实现动态小鸟飞行 + 打包发布
  15. Java中值得你小心的事(一)——继承
  16. 云南财经大学龙泉校区 计算机学院,云南财经大学有几个校区
  17. 10 怎么写USB驱动,Cadence USB 2.0 Controller和PHY IP驱动移植
  18. Qt实现一个简单的应用程序——桌面助手
  19. 互联网产品设计进阶(11)产品设计师的职责
  20. JavaScript-0817

热门文章

  1. freemarker 自己常用方法
  2. 利用工作流给Windows SharePoint Service 3.0添加Skype通知功能
  3. html css 时钟,css3时钟
  4. syslog日志转换器_图解将windows日志转成syslog格式并发送
  5. 雪花算法生成数字id_全局唯一iD的生成 雪花算法详解及其他用法
  6. C语言的全局变量和局部变量的作用域
  7. python升级导致yum命令无法使用的解决办法(修改版)
  8. 【LA4992】Jungle Outpost(半平面交+二分)
  9. 画面逐渐放大_故宫一幅800年古画,放大55倍,4个老人喝醉了?
  10. html最大化和最小化,电脑上最大化最小化图标变了怎么办