kubernetes之pause容器介绍
一.简单说明
我们在启动Pod的时候,发现有很多pause容器运行。每次启动一个Pod,都会运行一个pause容器。那么这个pause容器究竟是干啥的,它到底有什么作用呢?
Pause容器又叫Infra容器,我们在启动kubelet的服务时,指定了下面的配置参数:
--pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.1
这个Pause容器的版本,我们可以自己构建,也可以直接采用官方提供的版本。关于pause容器的构建,可以参考https://github.com/kubernetes/kubernetes/tree/master/build/pause进行。
这里我们在kubernetes的node节点,执行docker ps,可以发现每个node上运行了很多的pause容器,具体如下:
[root@k8s002 ~]# docker ps |grep pause
d316fa79ddf6 mirrorgooglecontainers/pause-amd64:3.1 "/pause" 6 days ago Up 6 days k8s_POD_kafka-2_kafka_852a
6124-3870-11eb-95e3-000c295ccbe7_0406c946ee75c mirrorgooglecontainers/pause-amd64:3.1 "/pause" 6 days ago Up 6 days k8s_POD_test-redis-5f79b66bc
8-5shqd_test_8cae9d57-386f-11eb-95e3-000c295ccbe7_040c96739a14e mirrorgooglecontainers/pause-amd64:3.1 "/pause" 6 days ago Up 6 days k8s_POD_zk-2_kafka_749c97a
这里,每个Pod都有一个特殊的被称为"根容器"的Pause容器,其它容器则为业务容器。这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此它们之间通信和数据交换更为高效。在设计时,我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。同一个Pod里的容器通过localhost就能互相通信。
二.kubernetes的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 中。
[root@server default]# docker ps |grep redis
de9d250caecc 43e6149871aa "/redis_exporter" 2 months ago Up 2 months k8s_redi
s-exporter_redis-default-0_component_993e6be7-5b3a-4f45-b5ea-545bb45c7a18_3ba732b5e4643 364a8748d03d "sh /data/conf/launc…" 2 months ago Up 2 months k8s_red
is_redis-default-0_component_993e6be7-5b3a-4f45-b5ea-545bb45c7a18_36f12fed25d54 registry.sensetime.com/kubespray/gcr.io/google_containers/pause-amd64:3.1 "/pause" 2 months ago Up 2 months k8s_POD
redis-default-0_component_993e6be7-5b3a-4f45-b5ea-545bb45c7a18_7
所以说一个 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 不会重建,也不会重启,这是非常重要的一个设计。
kubernetes的pause容器主要为每个业务容器提供以下功能:
- 在pod中担任与其它容器namespace共享的基础
- 启用pid命名空间,开启init进程。
这里我们举个示例进行说明:

1)运行一个pause容器:
[root@k8s001 ~]# docker run -d --name pause -p 8080:80 registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1
2)运行一个nginx容器,nginx将为localhost:2368创建一个代理
[root@k8s001 ~]# 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
[root@k8s001 ~]# docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf --net=container:pause --ipc=container:pause --pid=container:pause nginx
3)为ghost创建一个应用容器(这是一个博客软件)
[root@k8s001 ~]# docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost
4)验证
# 查看运行的容器
[root@k8s001 ~]# docker ps | grep -E "pause|nginx|ghost"
f72edf025141 ghost "docker-entrypoint.s…" About a minute ago Up About a minute
ghost7ac2d677fbf7 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes
nginxb33f3b7c705d registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 "/pause" 15 minutes ago Up 15 minutes 0.0.0.0:8880->80
/tcp pause
# 通过浏览器访问http://ip:8880端口,查看是否可以访问到ghost界面
# 或者通过curl抓取页面内容
[root@k8s001 ~]# curl http://localhost:8080
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Ghost</title>
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
......
从上面的步骤可见:
- pause容器将内部80端口映射到宿主机8080端口。
- pause容器在宿主机上设置好网络namespace后,nginx容器加入到该网络的namespace中。
- nginx容器启动的时候指定了-net=container:pause。
- ghost容器启动时,同样方式加入到该网络的namespace中。
- 这样三个容器共享了网络,互相之间就可以使用localhost直接通信。
- --ipc=container:pause,--pid=container:pause就是三个容器的ipc和pid处于同一个namespace中,init进程为pause。
这里,我们进入ghost容器内部查看:
[root@k8s001 ~]# docker exec -it f72edf025141 /bin/bash
root@b33f3b7c705d:/var/lib/ghost# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1012 4 ? Ss 02:45 0:00 /pause
root 8 0.0 0.0 10648 3400 ? Ss 02:57 0:00 nginx: master process nginx -g daemon off;
101 37 0.0 0.0 11088 1964 ? S 02:57 0:00 nginx: worker process
node 38 0.9 0.0 2006968 116572 ? Ssl 02:58 0:06 node current/index.js
root 108 0.0 0.0 3960 2076 pts/0 Ss 03:09 0:00 /bin/bash
root 439 0.0 0.0 7628 1400 pts/0 R+ 03:10 0:00 ps aux
在ghost容器中可以看到pause和nginx容器的进程,并且pause容器的PID为1,而在kubernetes中容器的PID=1的进程则为容器本身的业务进程。
kubernetes之pause容器介绍的更多相关文章
- kubernetes中的Pause容器如何理解?
前几篇文章都是讲的Kubernetes集群和相关组件的部署,但是部署只是入门的第一步,得理解其中的一些知识才行.今天给大家分享下Kubernets的pause容器的作用. Pause容器 全称infr ...
- Kubernetes学习之pause容器
根据代码看到,pause容器运行着一个非常简单的进程,它不执行任何功能,一启动就永远把自己阻塞住了, 它的作用就是扮演PID1的角色,并在子进程称为"孤儿进程"的时候,通过调用wa ...
- kubernetes集群中的pause容器
昨天晚上搭建好了k8s多主集群,启动了一个nginx的pod,然而每启动一个pod就伴随这一个pause容器,考虑到之前在做kubelet的systemd unit文件时有见到: 1 2 3 4 5 ...
- 基于Kubernetes构建企业容器云
前言 团队成员有DBA.运维.Python开发,由于需要跨部门向公司私有云团队申请虚拟机, 此时我在思考能否在现有已申请的虚拟机之上,再进行更加细粒度的资源隔离和划分,让本团队的成员使用, 也就是在私 ...
- 腾讯基于Kubernetes的企业级容器云平台GaiaStack (转)
GaiaStack介绍 GaiaStack是腾讯基于Kubernetes打造的容器私有云平台.这里有几个关键词: 腾讯:GaiaStack可服务腾讯内部所有BG的业务: Kubernetes:Gaia ...
- Kubernetes+Docker+Istio 容器云实践
随着社会的进步与技术的发展,人们对资源的高效利用有了更为迫切的需求.近年来,互联网.移动互联网的高速发展与成熟,大应用的微服务化也引起了企业的热情关注,而基于Kubernetes+Docker的容器云 ...
- 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)
[编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...
- pause容器作用
1.概念 Pause容器 全称infrastucture container(又叫infra)基础容器. 作为init pod存在,其他pod都会从pause 容器中fork出来. 每个Pod里运行着 ...
- kubernetes构架及组件介绍
传统部署时代 早期在物理机上直接运行应用程序,无法对其定义资源边界,导致资源不分配,其他的程序性能下降 虚拟化部署时代 虚拟化允许应用程序在VM之间隔离,并提供安全界别,但是不能自由访问应用程序 因为 ...
- kubernetes中 pause的作用
pause的作用 重要概念:Pod内的容器都是平等的关系,共享Network Namespace.共享文件 pause容器的最主要的作用:创建共享的网络名称空间,以便于其它容器以平等的关系加入此网络名 ...
随机推荐
- 理解Python中的元类(metaclass)
类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Pytho ...
- 面试题-MySQL和Redis(更新版)
前言 MySQL和Redis部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,并添加了一些比较重要的问题,希望对大家起到 ...
- 如何在 IIS 上部署 Go API?
问题场景 我这边原先的技术栈主要是 .NET(Core), 所以服务器基本上都是 Windows Server + IIS. 这次有个 API 服务用 Go 重写, 但是部署有点不美, 直接执行黑框框 ...
- GitLab 服务器宕机时的项目代码恢复方法
重要前提:GitLab 数据挂载盘必须能够正常读取,且 /var/opt/gitlab/git-data/repositories 目录下的数据可以完整拷贝. 当 GitLab 服务器意外宕机且没有备 ...
- FireDAC的数据库的FDConnect
通常,我们设置一个ini文件,按照FDConnection的ini格式要求配置好.然后直接调用通知连接数据库是否OK. FireDAC可以通过FDManager管理ini文件简单实现.即由FDConn ...
- 0x03 搜索与图论
搜索与图论 广度优先搜索\(BFS\) 概念 广度优先搜索(Breadth-First Search)是一种图遍历算法,用于在图或树中按层次逐层访问节点.它从源节点(起始节点)开始,首先访问源节点的所 ...
- 在 Ubuntu 上安装 Python 3.11、创建虚拟环境并设置 pip 阿里云源的主要命令
在 Ubuntu 上安装 Python 3.11.创建虚拟环境并设置 pip 阿里云源的主要命令流程如下: 安装 Python 3.11 sudo apt update sudo apt instal ...
- ConcurrentHashMap扩容过程
一.ConcurrentHashMap扩容过程 1.ConcurrentHashMap扩容时新建数组 1.1 每个线程负责的数据迁移区域的长度:stride 1.2 关于transferIndex的说 ...
- 2025dsfz集训Day10:区间、树形DP
Day10:区间.树形DP 区间DP 区间类型动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系.(例:\(f[i][j]=f[i][ ...
- 我们离Agent终极形态又近了一步:全球首个支持谷歌A2A(Agent-to-Agent)协议的智能体注册网站上线Product Hunt,未来智能体协作网络
AI 的终点,不是更强大的对话,而是一个真正协作的智能体社会. 这种形态已经在悄然出现. 全球首个支持 Google A2A(Agent-to-Agent)协议 的智能体注册与协作平台同步上线Prod ...