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) {//假设,编写了爬虫&…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...