kubernetes集群pod中的pause容器作用
kubernetes集群pod中的pause容器作用
我们搭建完集群了以后,可以使用最简单的方式创建一个pod,随意你建立什么pod,去访问相应node上执行docker ps 就会看到有一种pause容器,但是你可能从来没有启用
etrics-scraper_dashboard-metrics-scraper-7b59f7d4df-pqntv_kubernetes-dashboard_0516991e-e13a-4830-826f-6bb3a543b314_2
9a69b76f1410 lizhenliang/pause-amd64:3.0 "/pause" 2 hours ago Up 2 hours k8s_POD_dashboard-metrics-scraper-7b59f7d4df-pqntv_kubernetes-dashboard_0516991e-e13a-4830-826f-6bb3a543b314_2
1dab2142e86c lizhenliang/pause-amd64:3.0 "/pause" 2 hours ago Up 2 hours k8s_POD_calico-node-9w6vz_kube-system_26c6db9f-a21a-46da-b22e-32b5c980db3c_2

那么它是啥呢?看看源码(C语言写的,简单看看吧)
知识普及
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。
SIGHUP 1 A 终端挂起或者控制进程终止
SIGINT 2 A 键盘中断(如break键被按下)
SIGQUIT 3 C 键盘的退出键被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)发出的退出指令
SIGFPE 8 C 浮点异常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道
SIGALRM 14 A 由alarm(2)发出的信号
SIGTERM 15 A 终止信号
SIGUSR1 30,10,16 A 用户自定义信号1
SIGUSR2 31,12,17 A 用户自定义信号2
SIGCHLD 20,17,18 B 子进程结束信号
SIGCONT 19,18,25 进程继续(曾被停止的进程)
SIGSTOP 17,19,23 DEF 终止进程
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键
SIGTTIN 21,21,26 D 后台进程企图从控制终端读
SIGTTOU 22,22,27 D 后台进程企图从控制终端写
strcasecmp用忽略大小写比较字符串.,通过strncasecmp函数可以指定每个字符串用于比较的字符数,strcasecmp用来比较参数s1和s2字符串前n个字符,比较时会自动忽略大小写的差异。
fprintf 函数的功能是: Print formatted data to a stream格式化输出数据到流
strerr是作为程序运行过程中的错误显示出来的
#include <signal.h> #角度啊啥的函数库
#include <stdio.h> #C最基础的库
#include <stdlib.h>
#include <string.h>
#include <sys/types.h> #系统类型的函数库
#include <sys/wait.h> #系统进程wait控制函数库
#include <unistd.h> #从开始到现在都是调用库,会用到库里面的一些函数库#define STRINGIFY(x) #x
#define VERSION_STRING(x) STRINGIFY(x) #ifndef VERSION
#define VERSION HEAD
#endif #到这里是重定义一些变量,不会C的可以理解为alias static void sigdown(int signo) { psignal(signo, "Shutting down, got signal"); #一个函数,意思让signal软中断信号停止exit(0);
} static void sigreap(int signo) { while (waitpid(-1, NULL, WNOHANG) > 0) #循环waitpid函数获取相应的pid;
} int main(int argc, char **argv) { #主函数终于来了***************int i; for (i = 1; i < argc; ++i) { #循环判断if (!strcasecmp(argv[i], "-v")) { #比较字符串组 argv[i]版本是否与需求版本一致printf("pause.c %s\n", VERSION_STRING(VERSION)); #不是这输出pause版本return 0; } } if (getpid() != 1) #判断获取的pid号是否为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) #A 键盘中断(如break键被按下)return 1; if (sigaction(SIGTERM, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0) # A 终止信号return 2; if (sigaction(SIGCHLD, &(struct sigaction){.sa_handler = sigreap, .sa_flags = SA_NOCLDSTOP}, NULL) < 0) # B 子进程结束信号return 3; for (;;) #死循环pause(); #等待fprintf(stderr, "Error: infinite loop terminated\n"); #将错误信息打印,并打印提示信息return 42;
}
由以上我们差不多读懂了,这个玩意很傲娇啊,抢到了pid为1后执行一个等待函数,就死循环等待了。
那么它为啥要抢pid等于1的init进程呢?
先了解一下init进程
描述init进程,它是内核启动的第一个用户级进程。init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。
x86和x86-64是Linux作业系统的常用指令集架构。
BIOS/UEFI针对实际的硬件平台执行硬件初始化任务。
由启动程式载入initrd/initramfs,并由启动程式载入Linux核心。
内核将配置系统功能,譬如配置硬件,称为start_kernel(),这会执行大部分系统配置(中断、内存管理、设备和驱动程式初始化等)。然后它分别启动内存管理进程、init进程等在用户空间执行的进程。
Init有特定的运行级别(System V)或目标(Systemd),每个运行级别或目标都是由特定的一组服务(守护进程)组成。
一个典型的桌面环境从X显示管理器开始初始化,X显示管理器显示登入画面,成功登入后由X显示管理器启动桌面环境(如GNOME、KDE)。
关机时,init会结束所有用户空间处理程序。init随后终止,内核自行关闭。
Init是Linux的根进程。进程号为1,它是所有进程的父进程
我们知道pod内的所有容器共用一个namespace(名字空间),就意味着,他们之间pid号是公用的,根据init的意思,给其他容器的pid造了一个爹(一切进程的父进程)出来。它活着还好,init没了,pod就嘎了。
那么这个爹有啥用呢?
站在进程角度,它可以回收僵尸进程。哦哦哦,可以回收僵尸进程啊,真棒(听懂了耶)
算了吧,那我们还是一块说说什么是僵尸进程吧。
书上说:
僵尸进程是已停止运行但是进程表条目依然存在的进程,父进程尚未通过wait系统调用进行检索。僵尸进程无法通过kill命令清除。只能通过父进程wait进行索检。
系统有过多僵尸进程将会占用大量操作系统进程表资源
如果父进程在子进程完成前退出,OS将子进程分配给init进程,init进程就“收养”子进程并成为其父进程。
简单的说,就是pod的其他容器意外退出时候产生的僵尸子进程会被pause容器进行收养,并且wait系统函数回收减少进程表占用。
好的第一个功能占用pid 1说完了,那么循环执行pause()暂停函数几个意思?
一个意思,作为pod共享namespace的基础,pod内其他所有容器都是用它的名字空间
namespace即“命名空间”,也称“名称空间” 。是许多编程语言使用的一种代码组织的形式,通过命名空间来分类,区别不同的代码功能,避免不同的代码片段(通常由不同的人协同工作或调用已有的代码片段)同时使用时由于不同代码间变量名相同而造成冲突。
这么说又蒙了,docker这种容器不是有分割名字空间能力吗?要它干啥?
几个问题
你重启docker后,IP变了吗?
重启docker以后你的容器hostname改变还存在吗?
你要运行三个软件作为一个pod,难道运行在一个docker里面吗?以达到在同一名字空间下的目的
那要是一百个软件呢?那还是容器吗?还能体现容器的优越性吗?
我们说的单pod单ip段,单pod单namespace就是靠它来的
它利用暂停的容器,一直占用着属于它pod的namespace,防止应用容器的死亡,导致整个pod资源被释放,给我的感觉就是像火种,不论部落里有啥变化,火种不灭,生生不息。
#总结
一共有俩作用
pod的其他容器意外退出时候产生的僵尸子进程会被pause容器进行收养,并且wait系统函数回收减少进程表占用
作为pod共享namespace的基础,pod内其他所有容器都是用它的名字空间
相关文章:
kubernetes集群pod中的pause容器作用
kubernetes集群pod中的pause容器作用 我们搭建完集群了以后,可以使用最简单的方式创建一个pod,随意你建立什么pod,去访问相应node上执行docker ps 就会看到有一种pause容器,但是你可能从来没有启用 etrics-scraper_dashboard-me…...
【2.24】malloc()分配内存、MySQL事务、项目、动态规划
malloc是如何分配内存的? 在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统,如下所示: 内核空间与用户空…...
Unity——使用铰链关节制作悬挂物体效果
目的在场景中创建一个悬挂的物体,是把多个模型悬挂在一起可以自由摇摆,类似链条的效果效果图前言什么是铰链关节?铰链关节 将两个刚体(Rigid body)组会在一起,从而将其约束为如同通过铰链连接一样进行移动。…...
plsql过程语言之uxdb与oracle语法差异
序号场景uxdboracle1在存储过程中使用goto子句create or replace procedure uxdbc_oracle_extension_plsql_goto_0001_procedure01(t1 int) language plsql as $$ begin if t1%20 then goto even_number; else goto odd_number; end if; <<even_number>> raise…...
file_get_contents 打开本地文件报错: failed to open stream: No such file or directory
php 使用file_get_contents时报错 failed to open stream: No such file or directory (打开流失败,没有这样的文件或目录) 1. 首先确保文件路径没问题 最好是直接复制一下文件的路径 2. windows电脑可以右键该文件 → 属性→安全 →对象名称 选中后复制一下 3. 然后…...
Candence allegro 创建等长的方法
随着源同步时序电路的发展,越来越多的并行总线开始采用这种时序控制电路,最典型的代表当属目前炙手可热的DDRx系列。下图这种点到点结构的同步信号,对于攻城狮来说,设置等长约束就非常easy了图片。 But,对于有4、6、8、、、等多颗DDR芯片的ACC同步信号来说,要设置等长约束…...
使用Python批量修改文件名称
下载了一些图片,想要更改其文件的名称。 试了许多方法,都不太理想。 于是想到了使用Python来实现。 需要用到的模块及函数: import osrename() 函数用于改变文件或文件夹的名称。它接受两个参数:原文件名和新文件名。 os.rena…...
【跟我一起读《视觉惯性SLAM理论与源码解析》】第八章 ORB-SLAM2中的特征匹配
特征匹配在ORB-SLAM2中是很重要的内容,函数有多次重载,一般而言分为以下 单目初始化下的特征匹配通过词袋进行特征匹配通过地图点投影进行特征匹配通过Sim(3)变化进行特征匹配 在单目初始化下的特征匹配是参考帧和当前帧之间的特…...
【Leedcode】数据结构中链表必备的面试题(第四期)
【Leedcode】数据结构中链表必备的面试题(第四期) 文章目录【Leedcode】数据结构中链表必备的面试题(第四期)1.题目2.思路图解(1)思路一(2)思路二3.源代码总结1.题目 相交链表: 如下(示例)&…...
【2023】助力Android金三银四面试
前言 新气象,新生机。在2023年的Android开发行业中,又有那些新的面试题出现呢?对于Android面试官的拷问,我们又如何正确去解答?万变不离其宗,其实只要Android的技术层面没变化,面试题也就是差不…...
Leetcode.1801 积压订单中的订单总数
题目链接 Leetcode.1801 积压订单中的订单总数 Rating : 1711 题目描述 给你一个二维整数数组 orders,其中每个 orders[i] [pricei, amounti, orderTypei]表示有 amounti笔类型为 orderTypei、价格为 pricei的订单。 订单类型 orderTypei 可以分为两种…...
红帽Linux技术-cp命令
cp是一个复制文件或者目录的命令,其作用是将一个或多个文件或目录从源位置复制到目标位置。 格式:cp [选项] 源文件或目录 目标文件或目录 常用选项: -r:复制目录及其子目录下的所有文件和目录; -p:保留…...
代码随想录算法训练营day41 | 动态规划 01背包问题基础 01背包问题之滚动数组
01背包问题基础 问题描述 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 举个栗子 背包最大重量为4。 物品为: 重量价值…...
MyBatis学习笔记(三) —— MyBatis核心配置文件详解
3、核心配置文件详解 id是唯一标识,不能重复,但是在真正开发过程中,不可能一个项目中同时使用两个环境,肯定会使用其中的某一个,这时候它的default就比较重要了。 default是设置我们当前使用的默认环境的id <?x…...
使用GDAL进行坐标转换
1、地理坐标系与投影坐标系空间参考中主要包含大地水准面、地球椭球体、投影坐标系等几部分内容。地图投影就是把地球表面的任意点,利用一定数学法则,转换到地图平面上的理论和方法,一般有两种坐标系来进行表示,分别是地理坐标系和…...
日常编程中和日期相关的代码和bug
本文主要是Java中和日期时间相隔的几个常用代码函数代码,做了总结,希望在日常编码中,可以帮到大家。 1.计算闰年 记住一个短语,“四年一润,百年不闰,四百再润”,不管换啥语言,相信…...
ATT与Intel汇编语法区别
寄存器、变量(常量)与立即数 在Intel汇编中,无论是寄存器、变量(常量)还是立即数,都是直接使用的,例如下列例子中分别加载一个变量(常量)与立即数到寄存器中:…...
Spring Cloud Alibaba全家桶(一)——Spring Cloud Alibaba介绍
前言 本文为 Spring Cloud Alibaba介绍 相关知识,下边将对微服务介绍(包括:系统架构演变、微服务架构介绍、常见微服务架构),Spring Cloud Alibaba介绍(包括:Spring Cloud Alibaba 的定位、Spri…...
2023年网红营销10大趋势解读:品牌出海必看
前不久influencermarketinghub发布了《2023年影响者营销基准报告》,报告总结了3500多家营销机构、品牌和其他相关专业人士对当前网红营销现状的看法,以及预测了未来网红营销的一个发展趋势。本期Nox聚星就带领大家详细解读关于2023年网红营销的10大趋势。…...
Java学习笔记 --- 正则表达式
一、体验正则表达式 package com.javase.regexp;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 体验正则表达式,给文本处理带来哪些便利*/ public class Regexp_ {public static void main(String[] args) {//假设,编写了爬虫&…...
学习---3
有序数组的排序:一、暴力解法:思路:遍历数组,对每个数组元素进行平方,再用sort排序。时间复杂度:O(nlog n)二、双指针解法:思路:如果有序数组中有负数,那么这个负数平方之…...
C++ ONNX Runtime推理踩坑记:为什么我的全局Session一Run就报ORT_RUNTIME_EXCEPTION?
C ONNX Runtime推理异常解析:全局Session与Env生命周期的陷阱 在C项目中使用ONNX Runtime进行模型推理时,许多开发者都遇到过这样一个令人困惑的场景:明明代码逻辑看起来完全正确,却在调用Session.Run()时突然抛出ORT_RUNTIME_EXC…...
GTE-Base-ZH模型服务监控与运维:使用Prometheus和Grafana
GTE-Base-ZH模型服务监控与运维:使用Prometheus和Grafana 当你把GTE-Base-ZH模型部署上线,开始对外提供服务后,心里是不是总有点不踏实?服务现在运行得怎么样?有没有人用?响应快不快?服务器资源…...
eSearch一站式屏幕效率工具安装指南
eSearch一站式屏幕效率工具安装指南 【免费下载链接】eSearch 截屏 离线OCR 搜索翻译 以图搜图 贴图 录屏 万向滚动截屏 屏幕翻译 Screenshot Offline OCR Search Translate Search for picture Paste the picture on the screen Screen recorder Omnidirectional scrolling sc…...
原神帧率解锁终极指南:3步轻松突破60FPS限制,享受极致流畅体验
原神帧率解锁终极指南:3步轻松突破60FPS限制,享受极致流畅体验 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 还在为原神60帧限制而苦恼吗?高端显卡却…...
大模型部署成本优化:面向测试从业者的云服务省钱技巧
随着大模型在自动化测试、缺陷智能分析、测试用例生成等领域的应用日益深入,其部署与调用成本已成为测试团队必须面对的核心挑战。高昂的GPU算力费用、未被充分利用的资源以及复杂的定价模型,都可能使技术创新的预算捉襟见肘。一、理解成本构成ÿ…...
如何在5分钟内开始使用Ivy Wallet:新手入门教程
如何在5分钟内开始使用Ivy Wallet:新手入门教程 【免费下载链接】ivy-wallet Ivy Wallet is an open-source money manager app for android that you can either build or download from Google Play. 项目地址: https://gitcode.com/gh_mirrors/iv/ivy-wallet …...
事务隔离级别全景解析:从脏读到幻读的深度剖析
事务隔离级别全景解析:从脏读到幻读的深度剖析在数据库并发控制的宏大叙事中,事务隔离级别扮演着“交通规则”的角色。当多个用户同时访问和修改数据时,如果没有合理的隔离机制,数据的一致性和完整性将面临巨大风险。本文将深入探…...
从大疆NAZA换到匿名P2飞控:一个DIY玩家的真实体验与参数调试避坑指南
从大疆NAZA到匿名P2飞控:一位DIY玩家的深度迁移指南 当我的F450机架在狭小卧室里显得笨拙不堪时,我意识到需要一次彻底的"瘦身计划"。这不是简单的机架更换,而是一次从商业飞控到开源系统的完整迁移——将大疆NAZA积累的经验移植到…...
小觅相机‘凉了’之后,我们如何用它的SDK和开源工具链构建自己的SLAM数据集?
从废弃硬件到研究利器:小觅相机SDK与开源工具链的SLAM数据集构建指南 当一款硬件产品的厂商突然消失,官网关闭、技术支持中断,那些被遗弃的设备往往会被贴上"电子垃圾"的标签。但作为一名SLAM研究者或爱好者,你是否想过…...
