大家在使用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/kubernetes/tree/master/build/pause
我们查看这个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/almighty-pause-container
在运行的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) < 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\n");
return 42;
}
这个c语言实现的进程,核心代码就28行:
其中第24行里一个无限循环for(;;), 至此大家能看出来pause容器名称的由来了吧?
这个无限循环里执行的是一个系统调用pause,
因此pause容器大部分时间都在沉睡,等待有信号将其唤醒。
接收什么信号呢?
一旦收到SIGCHLD信号,pause进程就执行注册的sigreap函数。
看下SIGCHLD信号的帮助:
SIGCHLD,在一个进程正常终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。
pause进程注册的信号处理函数sigreap里,调用另一个系统调用waitpid来获得子进程终止的原因。
希望这篇文章对大家理解Kubernetes里的pause容器有所帮助。感谢阅读。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
总结,"kubernetes-node-linux-amd64.tar.gz"是Kubernetes为Linux AMD64架构准备的节点安装包,通过下载、解压、配置和启动服务,我们可以将一个普通的CentOS系统转变为一个能够运行和管理容器的Kubernetes节点。...
lizhenliang-pause-amd64.tar
kubernetes镜像pause-amd打包
pause容器作用_kubernetes pod为什么需要pause容器_盐真的博客-CSDN博客.html
"vlc-pause-click-plugin-windows-64bit" 是一个专为VLC媒体播放器设计的插件,适用于Windows操作系统64位版本。这个插件的核心功能是通过点击屏幕来实现播放和暂停的操作,提供了更加便捷的交互方式。 对于VLC媒体...
Kubernetes v1.18.4 kubeadm安装全部组件。 images/ ├── load.sh ├── node │ ├── cni-v3.15.1.tar.gz │ ├── coredns-1.6.7.tar.gz │ ├── kube-proxy-v1.18.4.tar.gz │ ├── node-v3.15.1.tar....
pause-amd64:3.1 kubernetes-dashboard-amd64:v1.8.3 k8s-dns-sidecar-amd64:1.14.9 k8s-dns-kube-dns-amd64:1.14.9 k8s-dns-dnsmasq-nanny-amd64:1.14.9 ) for imageName in "${images[@]}"; do docker pull...
说明:kubernetes-v1.20.6镜像完整包,包含 k8s.gcr.io/kube-apiserver:v1.20.6 k8s.gcr.io/kube-controller-manager:v1.20.6 k8s.gcr.io/kube-scheduler:v1.20.6 k8s.gcr.io/kube-proxy:v1.20.6 k8s.gcr.io/pause:...
kubernetes之pause-3.4.1.tar.gz下载
k8s.gcr.io/pause:3.1镜像tar包,使用 docker load --input pause_3.1.tar进行导入
k8s pause容器镜像3.0,有需要直接下载使用,docker load -i pause.tar
- `VK_PAUSE`: 13 - Pause 键 - `VK_CAPITAL`: 14 - Caps Lock 键 - `VK_ESCAPE`: 1B - Esc 键 - `VK_SPACE`: 20 - Spacebar 空格键 - `VK_PRIOR`: 21 - Page Up 键 - `VK_NEXT`: 22 - Page Down 键 - `VK_END`: 23 ...
pause-3.1镜像,镜像使用方法: docker load -i pause-3.1.tar.gz
pause-3.6.tar coredns-v1.8.6.tar etcd-3.5.1-0.tar 安装包: Docker containerd.io-1.3.7-3.1.el7.x86_64.rpm container-selinux-2.107-3.el7.noarch.rpm docker-ce-19.03.9-3.el7.x86_64.rpm docker-ce-cli-19.03...
registry.aliyuncs.com/google_containers/pause:3.6 registry.aliyuncs.com/google_containers/etcd:3.5.1-0 registry.aliyuncs.com/google_containers/coredns:v1.8.6 操作: 镜像包上传到集群的各个节点后执行...
* pod可以由一个或者多个容器组合而成 * pod中的多个容器只需要localhost就可以相互访问 * pod中的多个容器通过pause pod共享存储和网络资源 Pod种类 ---------- Pod种类包括普通pod、pause pod、static pod等。 ...
Kubernetes调度器是负责将Pod分配到合适集群节点上的组件,这个过程在Kubernetes中至关重要。调度器的工作原理涉及到一系列复杂的判断和优化算法,以保证整个集群资源的合理利用和调度工作的高效率。 调度器的核心...
说明:kubernetes-v1.20.6镜像完整包,包含 k8s.gcr.io/kube-apiserver:v1.20.6 k8s.gcr.io/kube-controller-manager:v1.20.6 k8s.gcr.io/kube-scheduler:v1.20.6 k8s.gcr.io/kube-proxy:v1.20.6 k8s.gcr.io/pause:...
- `--pod-infra-container-image=mritd/pause-amd64`: 指定基础Pod基础设施镜像。 - `--feature-gates="Accelerators=true"`: 同样开启了加速器支持。 ##### 2. systemd服务配置 ```sh [Service] ExecStart=/opt/...