根据代码看到,pause容器运行着一个非常简单的进程,它不执行任何功能,一启动就永远把自己阻塞住了,

它的作用就是扮演PID1的角色,并在子进程称为"孤儿进程"的时候,通过调用wait()收割这个子进程,这样就不用担心我们的Pod的PID namespace里会堆满僵尸进程了,这也是为什么kubernetes不随便找个容器,例如Nginx作为父容器,让其他容器加入的原因

共享namespace的意思就是父进程先创建一个namespace,然后其他进程加入到该namespace就共享namespace了

一、从network namespace看pause容器

使用pause容器和共享namespace创建Pod

使用docker启动pause进程,以便可以将其他容器添加到Pod中

docker run  -d --name pause gcr.io/google_containers/pause-amd64:3.0

然后,在Pod中运行其他容器,分别是Nginx代理和ghost博客应用

Nginx代理的后端配置成http://127.0.0.1:2368,也就是ghost进程监听的地址

##创建nginx配置文件
vim nginx.conf
error_log stderr;
events { worker_connections 1024; } http {
access_log /dev/stdout combined;
server {
listen 80 default_server;
server_name www.example.com;
location / {
proxy_pass http://127.0.0.1:2368
}
}
} ##启动nginx容器
docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf -p 8080:80 --net=container:pause --ipc=container:pause --pid=container:pause nginx

为ghost博客应用程序创建另一个容器

docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost

在这个例子中,我们将nginx容器和ghost容器 加入到pause容器的namespace,如果要访问http://localhost:8080,就能看到ghost通过nginx代理运行,因为pause、nginx、ghost容器之间共享network namespace

注意:共享network namespace,一个pod中的nginx容器才能通过127.0.0.1:2368找到ghost,因为在一个network namespace内,才能通过localhost通信,相当于在一台机器里

二、从PID namespace看容器

在UNIX系统中,PID为1 的进程是init进程,即所有进程的父进程.init进程比较特殊,它维护一张进程表并且不断的检查其他进程的状态.init进程其中一个作用就是当某个子进程由于父进程的错误退出而变成了"孤儿进程",就会被init进程"收养"并在该进程退出时回收系统资源

在容器中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中

举例说明用户容器和PID容器的关系

先启动一个pause容器

docker  run -idt --name pause gcr.io/google_containers/pause_amd64:3.0

在运行一个busybox容器,加入pause容器的namespace(Network PID IPC)

docker run -idt --name busybox --net=container:pause --pid=container:pause --ipc=container:pause busybox

上面这种加入的方式也是kubernetes启动pod的原理

进入busybox容器查看里面的进程,发现PID=1的进程是/pause

docker exec -it busybox /bin/bash
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 /pause
5 root 0:00 sh
9 root 0:00 /bin/bash
13 root 0:00 ps aux

为什么不用别的容器做init进程,比如Nginx容器,如果由于子进程的父进程意外退出,那么子进程就成了"孤儿进程",Nginx容器没办法回收子进程退出后的资源

Kubernetes学习之pause容器的更多相关文章

  1. kubernetes中的Pause容器如何理解?

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

  2. 深入剖析Kubernetes学习笔记:容器基础(05-06)

    05 :从进程说起 1.容器本身没有价值,有价值的是"容器编排" 2.什么是进程? 一旦"程序"被执行起来,它就从磁盘上的二进制文件,变成 1.计算机内存中的数 ...

  3. kubernetes集群中的pause容器

    昨天晚上搭建好了k8s多主集群,启动了一个nginx的pod,然而每启动一个pod就伴随这一个pause容器,考虑到之前在做kubelet的systemd unit文件时有见到: 1 2 3 4 5 ...

  4. Kubernetes学习之路(十一)之Pod状态和生命周期管理

    一.什么是Pod? Pod是kubernetes中你可以创建和部署的最小也是最简的单位.一个Pod代表着集群中运行的一个进程. Pod中封装着应用的容器(有的情况下是好几个容器),存储.独立的网络IP ...

  5. pause容器作用

    1.概念 Pause容器 全称infrastucture container(又叫infra)基础容器. 作为init pod存在,其他pod都会从pause 容器中fork出来. 每个Pod里运行着 ...

  6. Kubernetes学习笔记(八):Deployment--声明式的升级应用

    概述 本文核心问题是:如何升级应用. 对于Pod的更新有两种策略: 一是删除全部旧Pod之后再创建新Pod.好处是,同一时间只会有一个版本的应用存在:缺点是,应用有一段时间不可用. 二是先创建新Pod ...

  7. 深入剖析Kubernetes学习笔记:开篇词(00)

    一.关于Kubernetes初学的疑惑 就在这场因"容器"而起的技术变革中,kubernetes项目已经成为容器技术的事实标准,重新定义了基础设置领域对应用编排与管理的种种可能 1 ...

  8. kubernetes学习资源

    参考文章: 1.kubernetes学习资源 1. <Kubernetes与云原生应用>系列之Kubernetes的系统架构与设计理念 2.[docker专业介绍的网站dockerinfo ...

  9. Docker+Kubernetes(k8s)微服务容器化实践

    第1章 初识微服务微服务的入门,我们从传统的单体架构入手,看看在什么样的环境和需求下一步步走到微服务的,然后再具体了解一下什么才是微服务,让大家对微服务的概念有深入的理解.然后我们一起画一个微服务的架 ...

随机推荐

  1. keil mdk+stm32的ac5和 ac6两个编译器下的字节对齐操作方法

    最近在使用ac6.9的编译器,编译速度是真的很快,使用stm32的hal库编译速度也比ac5的编译器快很多.本文试验stm32中字节对齐的代码测试,主要是结构体,因为结构体中实际项目中用到最多,同时在 ...

  2. Webpack 一些核心概念了解

    Webpack的几个核心概念 Entry:入口,Webpack执行构建的第一步将从Entry开始,可抽象成输入. Module:模块,在Webpack里一切皆模块,一个模块对应一个文件.Webpack ...

  3. PowerShell常用命令及美化(现代化的CMD)

    PowerShell可谓现代终端,是微软用来替代古老的CMD的. PowerShell拥有面向对象的思想,非常方便. 常用命令 下载文件(此处以install.ps1文件为例) $client = n ...

  4. 4,VS常见问题解决(一闪而过、等问题)不断更新

    当然入门学c可以用VS,但是深入就不应该用VS(MSVC)编译器了,毕竟VS2017还没有完全支持C99(这个从VS2017没有实现变长数组可见) 但是想看c源码,还是 1. 推荐用 *nix系统 2 ...

  5. loj 2135 「ZJOI2015」幻想乡战略游戏 - 动态点分治

    题目传送门 传送门 题目大意 给定一棵树,初始点权都为0,要求支持: 修改点权 询问带权重心 询问带权重心就在点分树上跑一下就行了.(枚举跳哪个子树更优) 剩下都是基础点分治. 学了一下11-dime ...

  6. SQL ------------ 对表中字段的操作 alter

    ALTER TABLE 语句用于在现有表中添加.删除或修改列. 注意不同的数据库的语句有所不一样 增加和删除都基本一致. 进行修改表中字段的时候注意: 本文主要介绍  sqlserver/mysql/ ...

  7. CycleBarrier与CountDownLatch原理

    CountDownLatch 众所周知,它能解决一个任务必须在其他任务完成的情况下才能执行的问题,代码层面来说就是只有计数countDown到0的时候,await处的代码才能继续向下运行,例如: im ...

  8. 集成Spring-Boot与gRPC,grpc-spring-boot-starter

    项目地址:grpc-spring-boot-starter grpc是一个出身名门的RPC框架,性能高,灵活度高,支持多语言. 支持多语言,如果你的项目在使用多种语言做开发,非常推荐使用. 作为Jav ...

  9. 详解XOR(异或)运算加密

    逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为"异或运算".它的定义是:两个值相同时,返回false,否则返回true.也就是说,XOR可以用来判断两个值是 ...

  10. 补习系列(12)-springboot 与邮件发送【华为云技术分享】

    目录 一.邮件协议 关于数据传输 二.SpringBoot 与邮件 A. 添加依赖 B. 配置文件 C. 发送文本邮件 D.发送附件 E. 发送Html邮件 三.CID与图片 参考文档 一.邮件协议 ...