pause 容器

概述

通过容器资源隔离的原理中知道容器之间是通过 NameSpace 和 cgroups 隔离开的,但是 pod 中的网络和存储却是共享的.

kubernetes 为了解决网络共享问题,引入了 pause 容器,又叫Infra容器,在kubelet的配置中有KUBELET_POD_INFRA_CONTAINER参数,它的默认配置是:

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

而 pause 的代码可见Github

网络共享实现原理

只看linux部分。

非常简单,我直接把它贴出来

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>#define STRINGIFY(x) #x
#define VERSION_STRING(x) STRINGIFY(x)#ifndef VERSION
#define VERSION HEAD
#endifstatic void sigdown(int signo) {psignal(signo, "Shutting down, got signal");exit(0);
}static void sigreap(int signo) {while (waitpid(-1, NULL, WNOHANG) > 0);
}int main(int argc, char **argv) {int i;for (i = 1; i < argc; ++i) {if (!strcasecmp(argv[i], "-v")) {printf("pause.c %s\n", VERSION_STRING(VERSION));return 0;}}if (getpid() != 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)return 1;if (sigaction(SIGTERM, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0)return 2;if (sigaction(SIGCHLD, &(struct sigaction){.sa_handler = sigreap,.sa_flags = SA_NOCLDSTOP},NULL) < 0)return 3;for (;;)pause();fprintf(stderr, "Error: infinite loop terminated\n");return 42;
}

按照主流程看:

  • -v 输出版本号 (不看)
  • if(getpid() !=1) 确保自己是 pid为 1 的进程。(warning)
  • 检查 SIGINTSIGTERM信号,收到此信号关闭应用(ctrl-c之类的)
  • 检查 SIGCHLD,当子进程停止(ctrl-z之类的行为)或终结(kill之类的行为)时,调用waitpid方法收割僵尸进程
  • 然后一直暂停(循环调用pause())。

waitpid函数的作用: 收割僵尸进程。 -1 表示所有子进程,WNOHANG表示没有子进程被退出就立即返回。 pause 函数的作用为:使调用进程(线程)进入休眠状态(就是挂起);直到接收到信号且信号函数成功返回 pause函数才会返回。

发现主要有两部分功能:

  • 承担PID 1的角色,它将通过调用wait来收割这些僵尸进程(见sigreap)。保证不会有僵尸堆积在Kubernetes pods的PID命名空间中。
  • pause 容器一直处于暂停状态

有了这个不退出的容器之后, 其它所有的容器就可以利用 Join Namespace 这个特性,加入到 pause container 的 NetWork Namespace 中。

此时,所有容器的网络试图就完全一样了,他们看到的都是 pause container 的网络视图,例如 网络设备、IP 地址、Mac 地址等等。

当然了,这也就要求其它容器必须在 pause 容器之后启动。同时,其它任何容器做重建之类操作,整个pod 也不会重启,因为 pause 容器一直存在。

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

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

相关文章

Vim和Nano简介

**Vim**&#xff1a; - Vim 是一个文本编辑器&#xff0c;它是 Vi 编辑器的一个改进版本&#xff0c;Vi 编辑器最初由 Bill Joy 在1976年为 BSD Unix 开发。 - Vim 由 Bram Moolenaar 开发&#xff0c;其第一个版本在1991年发布。Vim 的设计理念是“持继改进”&#xff0c;它的…

SpringMVC系列五: SpringMVC映射请求数据

SpringMVC映射请求数据 &#x1f49e;获取参数值说明应用实例 &#x1f49e;获取http请求消息头&#x1f49e;获取JavaBean对象使用场景说明应用实例注意事项和细节 &#x1f49e;获取servlet api说明应用实例注意事项和细节 上一讲, 我们学习的是SpringMVC系列四: Rest-优雅的…

VUE 项目用 Docker+Nginx进行打包部署

一、Docker Docker 是一个容器化平台&#xff0c;允许你将应用程序及其依赖项打包在容器中。使用 Docker&#xff0c;你可以创建一个包含 Vue.js 应用程序的容器镜像&#xff0c;并在任何支持 Docker 的环境中运行该镜像。 二、Nginx Nginx 是一个高性能的 HTTP 服务器和反向…

Eureka 学习笔记(1)

一 、contextInitialized() eureka-core里面&#xff0c;监听器的执行初始化的方法&#xff0c;是contextInitialized()方法&#xff0c;这个方法就是整个eureka-server启动初始化的一个入口。 Overridepublic void contextInitialized(ServletContextEvent event) {try {init…

React useRef 组件内及组件传参使用

保存变量&#xff0c; 改变不引起渲染 import { useRef} from react; const dataRef useRef(null) ... dataRef.current setTimeout(()>console.log(...),1000)绑定dom const inputRef useRef(null) <input ref {inputRef} />绑定dom列表 - ref 回调 const ite…

无声短视频:成都柏煜文化传媒有限公司

无声短视频&#xff1a;视觉艺术的独特魅力 在数字化时代的浪潮中&#xff0c;短视频以其简短、直观、易于传播的特点迅速崛起&#xff0c;成为当下最热门的媒体形式之一。而在众多的短视频类型中&#xff0c;无声短视频以其独特的视觉表达方式&#xff0c;逐渐吸引了越来越多…

mysql竖表变横表不含聚合

文章目录 前言一、vertical_table二、转换1.要将其转换为横表形式&#xff0c;例如&#xff1a;2.sql 总结 前言 在MySQL中将竖表转换为横表&#xff08;也称为行转列操作&#xff09;&#xff0c;不涉及聚合函数&#xff0c;通常可以通过使用条件判断和自连接来实现。假设有一…

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景&#xff1a; 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时&#xff0c;在配置文件均与eclipse一致的情况下出现了如下报错&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…

leetcode118 杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] public List…

信创服务器操作系统的适配迁移分析

浅谈信创服务器操作系统的适配迁移 01 服务器操作系统迁移适配流程复杂 随着CentOS停服临近和红帽RHEL源码权限受限&#xff0c;服务器操作系统安全漏洞风险加剧。国内众多企业面临CentOS、REHL等系统升级替换的挑战。同时&#xff0c;出于安全、功能升级和合规需求&#xff0…

33、循环语句--函数---递归+阶乘

一、函数 1.1、shell的函数 1.1.1、函数的定义&#xff1a;将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。 for i in {}do命令序列doneif []then 命令序列else命令序列fi #可以作为一个命令序列作用&#xff1a;方便重复使用&#xff0c;函数库&…

CubeMx打不开

问题点&#xff1a;打开CubeMx一直这个界面&#xff0c;然后就消失了。 问题所在&#xff1a;java版本过高。 博主的版本是合适的&#xff0c;如果你的版本是17什么的肯定是不合适的。 解决方法&#xff1a;卸载重装 卸载工具站内下载&#xff0c;免安装&#xff1a;&#xf…

相机的标定

文章目录 相机的标定标定步骤标定结果影响因素参数分析精度提升一、拍摄棋盘格二、提升标定精度 标定代码实现 相机的标定 双目相机的标定是确保它们能够准确聚焦和成像的关键步骤。以下是详细的标定步骤和可能的结果&#xff0c;同时考虑了不同光照条件和镜头光圈大小等因素对…

4.1. 马氏过程及其构造

马氏过程及其构造 1. 马氏过程与转移概率1.1. Markov过程1.2. 示例1.3. 四元函数(转移概率)2. 活动概率空间: P x , P μ P_x,P_\mu Px​,Pμ​2.1. 初始点为 x x x活动概率空间 P x P_x Px​2.2. 初始分布为 μ \mu μ的活动概率空间 P μ P_\mu Pμ​对于围棋, 如果某个时刻形…

极速解析,精准合规 — Ada,现代C++的URL解析器

Ada&#xff1a;用Ada&#xff0c;让URL解析变得轻而易举。- 精选真开源&#xff0c;释放新价值。 概览 Ada是一个用现代C编写的快速且符合WHATWG标准的URL解析库。它通过了WHATWG网站提供的全部规范测试&#xff0c;并在包括Windows、Linux、macOS在内的多个平台上表现卓越。…

Python机器学习分类算法(二)-- 决策树(Decision Tree)

决策树&#xff08;Decision Tree&#xff09;是一种基于树形结构的分类和回归方法&#xff0c;它主要用于在给定输入特征的情况下预测目标变量的值。以下是关于决策树的详细解释&#xff1a; 定义 决策树是一种直观的决策分析方法&#xff0c;通过构成树形结构来求取净现值的…

LeetCode 2288.价格减免:模拟

【LetMeFly】2288.价格减免&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/apply-discount-to-prices/ 句子 是由若干个单词组成的字符串&#xff0c;单词之间用单个空格分隔&#xff0c;其中每个单词可以包含数字、小写字母、和美元符号 $ 。如果单…

关于vue elementUi校验slot插槽中的表单项

项目场景&#xff1a;在父组件表单中使用子组件&#xff0c;并使用子组件插槽功能来管理父组件的单个表单项 重点提示&#xff1a;这里要明确一个概念&#xff0c;凡是在组件内插槽的内容都属于组件管理&#xff0c;因此&#xff0c;要校验父组件使用子组件的slot插槽展示表单…

Python将Markdown格式转为HTML:轻松实现博客文章的自动化处理

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 引言 编写一篇高质量的博客文章并非易事&#xff0c;尤其是在排版和格式方面。Markdown作为一种轻量级的标记语言&#xff0c;为博主们提供了一种简洁、高效的写作方式。而Python作为一门强大的编程语言&#xff0c…

反射的原理和操作

反射是框架设计的灵魂 &#xff08;使用的前提条件&#xff1a;必须先得到代表的字节码的Class&#xff0c;Class类用于表示.class文件&#xff08;字节码&#xff09;&#xff09; 在Java中&#xff0c;反射是指在运行时动态地获取、检查和操作类、对象、方法和属性的能力。J…