【云原生】Pause 容器介绍

news2024/11/16 11:36:50

Pause 容器

Pause 容器,又叫 Infra 容器

我们知道在 kubelet 的配置中有这样一个参数:

KUBELET_POD_INFRA_CONTAINER=--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest

上面是 openshift 中的配置参数,kubernetes 中默认的配置参数是:

KUBELET_POD_INFRA_CONTAINER=--pod-infra-container-image=gcr.io/google_containers/pause-amd64:3.0

Pause 容器,是可以自己来定义,官方使用的 gcr.io/google_containers/pause-amd64:3.0 容器的代码见 Github,使用 C 语言编写。

Pause 容器特点

  • 镜像非常小,目前在 700KB 左右
  • 永远处于 Pause (暂停) 状态

Pause 容器背景

像 Pod 这样一个东西,本身是一个逻辑概念。那在机器上,它究竟是怎么实现的呢?这就是我们要解释的一个问题。

既然说 Pod 要解决这个问题,核心就在于如何让一个 Pod 里的多个容器之间最高效的共享某些资源和数据。

因为容器之间原本是被 Linux Namespace 和 cgroups 隔开的,所以现在实际要解决的是怎么去打破这个隔离,然后共享某些事情和某些信息。这就是 Pod 的设计要解决的核心问题所在。

所以说具体的解法分为两个部分:网络和存储。

Pause 容器就是为解决 Pod 中的网络问题而生的。

Pause 容器实现

Pod 里的多个容器怎么去共享网络?下面是个例子:

比如说现在有一个 Pod,其中包含了一个容器 A 和一个容器 B,它们两个就要共享 Network Namespace。在 Kubernetes 里的解法是这样的:它会在每个 Pod 里,额外起一个 Infra container 小容器来共享整个 Pod 的 Network Namespace。

Infra container 是一个非常小的镜像,大概 700KB 左右,是一个 C 语言写的、永远处于 “暂停” 状态的容器。由于有了这样一个 Infra container 之后,其他所有容器都会通过 Join Namespace 的方式加入到 Infra container 的 Network Namespace 中。

所以说一个 Pod 里面的所有容器,它们看到的网络视图是完全一样的。即:它们看到的网络设备、IP 地址、Mac 地址等等,跟网络相关的信息,其实全是一份,这一份都来自于 Pod 第一次创建的这个 Infra container。这就是 Pod 解决网络共享的一个解法。

在 Pod 里面,一定有一个 IP 地址,是这个 Pod 的 Network Namespace 对应的地址,也是这个 Infra container 的 IP 地址。所以大家看到的都是一份,而其他所有网络资源,都是一个 Pod 一份,并且被 Pod 中的所有容器共享。这就是 Pod 的网络实现方式。

由于需要有一个相当于说中间的容器存在,所以整个 Pod 里面,必然是 Infra container 第一个启动。并且整个 Pod 的生命周期是等同于 Infra container 的生命周期的,与容器 A 和 B 是无关的。这也是为什么在 Kubernetes 里面,它是允许去单独更新 Pod 里的某一个镜像的,即:做这个操作,整个 Pod 不会重建,也不会重启,这是非常重要的一个设计。

Pause 容器的作用

我们检查 node 节点的时候会发现每个 node 上都运行了很多的 pause 容器,例如如下。

$ docker ps
CONTAINER ID        IMAGE                                                                                                                    COMMAND                  CREATED             STATUS              PORTS               NAMES
2c7d50f1a7be        docker.io/jimmysong/heapster-grafana-amd64@sha256:d663759b3de86cf62e64a43b021f133c383e8f7b0dc2bdd78115bc95db371c9a       "/run.sh"                3 hours ago         Up 3 hours                              k8s_grafana_monitoring-influxdb-grafana-v4-5697c6b59-76zqs_kube-system_5788a3c5-29c0-11e8-9e88-525400005732_0
5df93dea877a        docker.io/jimmysong/heapster-influxdb-amd64@sha256:a217008b68cb49e8f038c4eeb6029261f02adca81d8eae8c5c01d030361274b8      "influxd --config ..."   3 hours ago         Up 3 hours                              k8s_influxdb_monitoring-influxdb-grafana-v4-5697c6b59-76zqs_kube-system_5788a3c5-29c0-11e8-9e88-525400005732_0
9cec6c0ef583        jimmysong/pause-amd64:3.0                                                                                                "/pause"                 3 hours ago         Up 3 hours                              k8s_POD_monitoring-influxdb-grafana-v4-5697c6b59-76zqs_kube-system_5788a3c5-29c0-11e8-9e88-525400005732_0
54d06e30a4c7        docker.io/jimmysong/kubernetes-dashboard-amd64@sha256:668710d034c4209f8fa9a342db6d8be72b6cb5f1f3f696cee2379b8512330be4   "/dashboard --inse..."   3 hours ago         Up 3 hours                              k8s_kubernetes-dashboard_kubernetes-dashboard-65486f5fdf-lshl7_kube-system_27c414a1-29c0-11e8-9e88-525400005732_0
5a5ef33b0d58        jimmysong/pause-amd64:3.0  

kubernetes 中的 pause 容器主要为每个业务容器提供以下功能:

  • 在 pod 中担任 Linux 命名空间共享的基础;
  • 启用 pid 命名空间,开启 init 进程。

pause 容器的作用可以从这个例子中看出,首先见下图
在这里插入图片描述
我们首先在节点上运行一个 pause 容器。

docker run -d --name pause -p 8880:80 --ipc=shareable jimmysong/pause-amd64:3.0

然后再运行一个 nginx 容器,nginx 将为 localhost:2368 创建一个代理。

$ cat <<EOF >> nginx.conf
error_log stderr;
events { worker_connections  1024; }
http {
    access_log /dev/stdout combined;
    server {
        listen 80 default_server;
        server_name example.com www.example.com;
        location / {
            proxy_pass http://127.0.0.1:2368;
        }
    }
}
EOF
$ docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf --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

现在访问 http://localhost:8880/ 就可以看到 ghost 博客的界面了

解析

pause 容器将内部的 80 端口映射到宿主机的 8880 端口,pause 容器在宿主机上设置好了网络 namespace 后,nginx 容器加入到该网络 namespace 中,我们看到 nginx 容器启动的时候指定了 --net=container:pause,ghost 容器同样加入到了该网络 namespace 中,这样三个容器就共享了网络,互相之间就可以使用 localhost 直接通信,–ipc=container:pause --pid=container:pause 就是三个容器处于同一个 namespace 中,init 进程为 pause,这时我们进入到 ghost 容器中查看进程情况。

# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   1024     4 ?        Ss   13:49   0:00 /pause
root         5  0.0  0.1  32432  5736 ?        Ss   13:51   0:00 nginx: master p
systemd+     9  0.0  0.0  32980  3304 ?        S    13:51   0:00 nginx: worker p
node        10  0.3  2.0 1254200 83788 ?       Ssl  13:53   0:03 node current/in
root        79  0.1  0.0   4336   812 pts/0    Ss   14:09   0:00 sh
root        87  0.0  0.0  17500  2080 pts/0    R+   14:10   0:00 ps aux

在 ghost 容器中同时可以看到 pause 和 nginx 容器的进程,并且 pause 容器的 PID 是 1。而在 Kubernetes 中容器的 PID=1 的进程即为容器本身的业务进程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Java类加问题我竟让面试官哑口无言

学习类加载之前我们先看看从面试官的角度会问哪些问题&#xff1f;毕竟带着问题学习会比较高效。 直击面试 看你简历写得熟悉 JVM&#xff0c;那你说说类的加载过程吧&#xff1f; 我们可以自定义一个 String 类来使用吗&#xff1f; 什么是类加载器&#xff0c;类加载器有哪些…

雨水情自动监测报警系统解决方案

随着夏季雨季的到来&#xff0c;对全国各地的防汛工作形成挑战&#xff0c;为了实现有效的雨水管理和应对极端天气情况&#xff0c;建立一套科学高效的雨水情监测系统有着重要作用。雨水情监测系统能够提供及时准确的雨水信息&#xff0c;帮助决策者进行全面的天气分析和预警&a…

数字化转型排头兵,金融行业如何利用科技赋能业务 | TVP金融交流会

引言 金融行业&#xff0c;是数字化转型浪潮中的排头兵。这个上千年来&#xff0c;不断创新的行业&#xff0c;从以物易物到纸币发行再到数字资产&#xff0c;承袭至今的是保障客户资产安全&#xff0c;提升资产流通效率的本心。进入产业互联网时代以后&#xff0c;金融科技的发…

第5讲:使用ajax技术实现局部刷新功能(xml数据)

使用ajax技术实现局部刷新功能&#xff0c;每2秒刷新一次数据&#xff0c;本案例使用原生态xmlhttprequest对象&#xff0c;GET方法通讯&#xff0c;使用responseXML属性返回xml格式数据&#xff0c;同时刷新界面数据。 ajax封装库(ajax.js) var xmlhttpnull; //创建XMLHttpRe…

adb-学会查看日志文件

目录 一、获取日志文件 二、日志级别 三、日志缓冲区 四、缓冲区的类型 &#x1f381;更多干货 完整版文档下载方式&#xff1a; 一、获取日志文件 一般情况下&#xff0c;我们在做app测试时&#xff0c;其实并不需要经常使用adb去抓取我们的日志&#xff0c;通常情况下…

使用GPIO来模拟UART

前言 最近在看一些秋招的笔试和面试题&#xff0c;刚好看到一个老哥的经验贴&#xff0c;他面试的时候被问到了如果芯片串口资源不够了该怎么办&#xff1f;其实可以用IO口来模拟串口&#xff0c;但我之前也没有具体用代码实现过&#xff0c;借此机会用32开发板上的两个IO口来…

力扣 404. 左叶子之和

题目来源&#xff1a;https://leetcode.cn/problems/sum-of-left-leaves/description/ C题解1&#xff1a;递归法&#xff0c;前序遍历。 1. 确定输入参数&#xff1a;当前节点&#xff0c;左叶子的和&#xff1b; 2. 确定终止条件&#xff1a;空节点时返回&#xff1b; 3. …

【每日一短语】在必要情况下

1、短语及释义 in a pinch 释义&#xff1a; 在紧要关头&#xff1b;在必要情况下 2、示例及出处 美剧&#xff1a;《生活大爆炸》第七季第21集 The Big Bang Theory, Season 7 Episode 21 Sheldon Cooper: Penny, there’s only one cookie with something in the middle tha…

基于STM32设计的城市绿化云端监控系统(华为云IOT)

一、设计需求 1.1 项目背景 随着科技的蓬勃发展改变了很多传统行业的作业方式,当我们用移动支付代替现金交易时,当我们足不出户就能满足饥饿的身体时,我们的生活方式因为科技而发生了改变;同样科技也在改变着我们周围的点点滴滴,城市绿化养护亦是如此。 通过智慧控制系统…

在Docker中使用MindSpore GPU版本

文章目录 在Docker中使用MindSpore GPU版本获取安装命令安装安装nvidia-container-toolkit获取MindSpore镜像测试运行MindSpore镜像运行代码 使用VSCode开发 在Docker中使用MindSpore GPU版本 参考官方文档&#xff1a;安装指南 获取安装命令 如图所示 命令为 docker pull…

MFC将二维数组写入文件中并进行读取

MFC将二维数组写入文件中并进行读取 当前项目需要将二维数组写入到本地文件中&#xff0c;并在另一个对话框中进行读取。网上查了很多资料&#xff0c;基本都是写字符串到文件中的&#xff0c;想依葫芦画瓢仿照字符串的写法来写二维数组&#xff0c;发现在写文件状态下&#x…

护网是什么?为什么【网安人】都想参加!

一、什么是护网行动&#xff1f; 护网行动是以公安部牵头的&#xff0c;用以评估企事业单位的网络安全的活动。 具体实践中。公安部会组织攻防两方&#xff0c;进攻方会在一个月内对防守方发动网络攻击&#xff0c;检测出防守方&#xff08;企事业单位&#xff09;存在的安全漏…

Flink之FileSink将数据写入parquet文件

Flink之FileSink将数据写入parquet文件 在使用FileSink将数据写入列式存储文件中时必须使用forBulkFormat,列式存储文件如ORCFile、ParquetFile,这里就以ParquetFile为例结合代码进行说明. 在Flink1.15.3中是通过构造ParquetWriterFactory然后调用forBulkFormat方法将构造好的…

第9章 异常处理

第9章 异常处理 9.1 Java异常处理 try-catch-finally ​ ​ 9.2 Scala异常处理 ​ ​ package chapter09object Test01_Exception {def main(args: Array[String]): Unit {try {val n 10 / 1} catch {case e: ArithmeticException > {println("发生算数异常&quo…

【Java高级编程】Java常用类

Java常用类 1、字符串相关的类1.1、字符串相关的类&#xff1a;String1.2、字符串相关的类&#xff1a;String常用方法1.3、String与基本数据类型、包装类之间的转换1.4、String与char[]之间的转换1.5、String与byte[]之间的转换1.6、String、StringBuffer、StringBuilder三者的…

element-plus中的el-table如何动态合并行(复制粘贴即可使用 亲测有效!)

demo场景&#xff1a; 一个 table&#xff0c;由5列组成&#xff0c;其 prop 分别为’resource_name’, ‘scene_name’, ‘type’, ‘content’, ‘desc’&#xff0c;渲染 table 的数据来源于接口。现在需要将 propdesc的这一列&#xff0c;按照resource_name 相等时进行合并…

使用EVPN构建二层VPN

一、业务背景 EVPN实例用于将EVPN路由与公网路由隔离。不同EVPN实例的路由之间也是相互隔离的。在所有EVPN组网方案中,都需要配置EVPN实例。 二、业务拓扑 三、配置步骤 1、配置基本接口IP 2、配置核心网IGP和LDP 3、配置PE和PE之间的BGP EVPN邻居关系 4、配置EVPN的源地址 …

Linux5.10 NoSQL 之 Redis配置与优化及数据类型

文章目录 计算机系统5G云计算第四章 LINUX NOSQL 之 Redis配置与优化及数据类型一、关系数据库与非关系型数据库1.关系型数据库2.非关系型数据库3.关系型数据库和非关系型数据库区别4.非关系型数据库产生背景5.总结 二、Redis简介1.Redis 具有以下几个优点2.使用场景3.哪些数据…

一、枚举类型——使用 EnumMap 分发

使用 EnumMap 可以实现“真正的”双路分发&#xff0c;它是专门为 enum 设计的高效 Map。我们的目标是在两个未知类型中切换&#xff0c;因此由 EnumMap 组成的 EnumMap &#xff08;嵌套 EnumMap &#xff09;可以实现双路分发。 RoShamBo5.java import java.util.EnumMap;imp…

如何 设计一个高质量的 API 接口?

目录 你是否也感同身受&#xff1f; 优秀API的特质 自解释 易学习 易使用 难误用 API 设计原则 1. 充分原则 2. 单一视角原则 3. 单一功能原则 4. 简单原则 5. 抽象原则 6. 兼容扩展原则 7. 最小惊讶原则 8. 低耦合原则 9. 正交原则 10. 易测试原则 11. 统一原…