橘子学K8S01之容器中所谓的隔离

我们一直都在说容器就是一个沙盒,沙盒技术顾名思义就是像一个集装箱一样,把应用(服务,进程之类的)装起来的技术,这样每个进程在自己的沙盒中和其他的沙盒隔离开来,每个沙盒之间存在一个边界使得他们互不干扰,而被装入这个盒子中的应用也就很方便的可以跟着沙盒搬来搬去,这是一种很方便很理想的管理状态。
于是围绕这个状态的实现,需要一种可以真实落地的技术。也就是隔离和限制技术。

一、Namespace隔离技术

1、隔离的现象

我们说容器的核心功能就是通过约束和修改进程的动态表现,从而创造出一个边界,而Cgroups技术就是用来制造约束的能力,而我们这里要说的NameSpace则是用来修改进程的视图的技术,修改视图其实就是修改进程视角下自己能看到的内容。
我们先来操作一下,所以我们需要准备一个Linux环境和docker项目,至于你是哪个Linux的发行版本这不重要。我的环境如下:

CentOS Linux release 7.8.2003
Docker Engine - Community 20.10.14

首先我们先创建一个容器:执行docker run -it busybox /bin/sh命令来创建容器

#root  docker run -it busybox /bin/sh
这句命令的参数我们逐一来解释一下:
-it :在启动docker容器之后,给我们分配一个文本的输入输出环境,有了这个输入输出环境,我们就能在输入端和docker交互然后在输出端
获得交互的结果。

/bin/sh :就是我们在docker容器中运行的程序,bin/sh是一个常用的shell。

所以上面这句话的意思最终表达就是:请帮我启动一个容器,并且在容器里面执行/bin/sh这个shell,并且在启动之后就分配一个命令行的
终端来让我和这个容器交互。

在做完了以上操作之后,我的Linux机器就变成了宿主机,而这个运行着/bin/sh的容器 busybox 就运行在我的这台宿主机里。

在执行完以上这句命令之后,其实我们就进入了容器内部,并且可以通过终端交互。界面如下。
在这里插入图片描述
此时我们在交互终端指定ps,列出容器内的所有进程。
在这里插入图片描述
我们发现里面只有两个进程,我们在启动时运行的/bin/sh就是这个容器内部的一号进程(PID为1),第二个则就是我们执行的ps进程。此时这两个进程已经被隔离在我们这个容器中了。也就是所谓的沙盒世界。那么其中的原理又是为何呢?

2、隔离的原理

本来在我们没有容器的时候,我们直接在宿主机上运行一个/bin/sh程序,此时就会启动一个/bin/sh的进程,操作系统就会给他这个进程分配一个进程ID(PID),这个类似于编号一样的PID,是这个进程的唯一标识,就像一个公司中的员工的工号一眼。比如系统为他分配的是100,那么他就等同于工号为100的员工。公司的boss就是编号为1的员工。

但是此时我们有了容器了,当我们把程序运行在容器中的时候,docker就会给这个进程施展一个障眼法,让他感知不到前面的进程,看不到其他前面的99个员工,此时他就以为自己是1号员工,此时他就在一种忽悠的状态下,认为自己的ID就是1。

所以这种机制类比在linux中,就是在隔离的空间中运行的进程只能看到计算过后的编号,PID=1。实际上,你还是在操作系统上运行,在操作系统的视角看,你还是你100号员工,妄想成为1号,那是你自己认为。
这就是Linux中的Namespace机制,而对应在Linux中的实现中,namespace的实现方式,其实就是Linux创建进程的一个传入的可选参数,在linux中创建进程的系统函数为clone(),也就是如下:

int pid = clone(main_function,stack_size,SIGCHLD,NULL);
这行代码会创建一个进程,然后返回值是这个进程的PID,也就是那个编号。而玄机就在第三个参数中,第三个
形参可以有两种传入实参,CLONE_NEWPID和SIGCHLD,当我们传入的是SIGCHLD就创建真实的进程,不做任何
障眼法,而当我们把参数指定为CLONE_NEWPID,创建出来的进程,就会在自己的视角看到一个全新的空间,在
这个进程空间中,他的PID就是1,而这一切都是一个障眼法,在宿主机的真实的进程空间中,他的进程PID还是
真实的数字,比如100,而不是1.

如果你创建多个这样的进程,他们自己的视角中自己都是PID=1的进程,他们看不到宿主机的真实进程空间,同时也看不到其他的沙盒里面的状况,换言之,他们实现了隔离。
而且在PID的Namespace隔离之外,Linux还提供了诸如Mount,UTS,IPC,Network,User这些Namespace,用来对其他的网络设备和其他配置做隔离,这样每个进程都只能看到自己的空间里面的隔离内容了。

二、总结

所以我们可以看到,所谓的docker容器,实际就是在创建容器进程的时候,指定了一组关于这个进程需要启动的Namespace,隔离了进程的PID,文件,设备,配置等等。而对于宿主机以及其他和这个进程不相关的进程,他是完全看不到的。

所以,容器,其实就是一种特殊的进程。只是他做了隔离。
所以在这个概念之上,我们就知道,所谓容器,在使用的时候其实并没有一个真实的容器存在,docker启动的其实还是原来的应用,只是在创建这些进程的时候docker加上了很多Namespace参数来限制进程的视角。
当限制完成之后,这些进程就觉得自己是各自的PID Namespace里面的1号进程,只能看到自己各自的Mount Namespace挂载的目录和文件,只能访问各自Network Namespace里面的网络设备,只能看到自己被限制的那一组namespace空间中的内容,仿佛与世隔绝一样。所以一切都是障眼法。

而在完成了隔离之后,在自己那一亩三分地运行的进程对于资源也是需要做限制的,而这个限制就是所谓的Cgroups技术,也就是下面的主角。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【动手学深度学习】(十三)深度学习硬件

文章目录 一、CPU和GPU二、更多的芯片1.DSP:数字信号处理2.可编程阵列(FPGA)3.AI ASIC 三、单机多卡并行 一、CPU和GPU 提升CPU利用率 在计算ab之前,需要准备数据 主内存->L3->L2->L1->寄存器(数据只有进入寄存器才可以参与运算) 提升空间和时间的内存…

Linux基本开发工具

编译器和自动化构建工具 一、编译器——gcc、g1. 安装 gcc/g2. 使用3. 链接库4. 拓展命令:od/file/ldd/readelf 二、自动化构建项目——make、makefile1. 介绍2. 使用例子touch——change file timestampsstat——display file or file system status修改时间 .PHON…

Java入门学习笔记二

一、抽象类 当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的行为方式,那么这些方法都有具体的方法体。 分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功…

国家开放大学 湖南开放大学形成性考核 平时作业 统一资料

试卷代号:1258 房屋建筑混凝土结构设计 参考试题 一、单项选择题(每小题2分,共计40分) 1.( )是将框架结构中的部分跨间布置剪力墙或把剪力墙结构的部分剪力墙抽掉改为框架承重。 A.梁板结构体系 B.框…

区块链的可拓展性研究【05】闪电网络

1.闪电网络:闪电网络是一种基于比特币区块链的 Layer2 扩容方案,它通过建立一个双向支付通道网络,实现了快速、低成本的小额支付。闪电网络的交易速度非常快,可以达到每秒数万笔交易,而且交易费用非常低,几…

Linux---复制、移动文件及目录命令

1. 复制、移动文件及目录命令的使用 命令说明cp拷贝文件、拷贝目录mv移动文件、移动目录、重命名 cp命令效果图: 说明: 拷贝目录需要加上-r选项,-r表示递归拷贝目录及其内容 mv命令移动文件效果图 mv命令移动目录效果图 mv命令重名名效果图 2. 小结 cp&#…

TwinCAT3 Modbus-TCP Client/Server使用

目录 一、环境配置和准备 1、PLC中安装TF6250-Modbus-TCP库 2、勾选TF6250的license 3、PLC工程中添加Tc2_ModbusSrv库文件 4、分别创建测试ModbusTCP测试的Server和Client程序 二、PLC作为Client端 1、设置测试电脑IP地址 2、运行MobusTCP测试工具 3、PLC端程序编写 …

Python 使用 openpyxl 写表格

当前环境:Win10 x64 MS office 2016 Python3.7 openpyxl3.0.9 1 写入表格 from openpyxl import Workbook# 创建一个 workbook workbook_w Workbook()# 获取被激活的 worksheet worksheet_w workbook_w.active# 1 批量插入数据# 设置一行数据 worksheet_w.ap…

鸿蒙ArkTS基础类库——线性容器

容器类库概述 容器类库,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法,作为纯数据结构容器来使用具有一定的优势。容器类采用了类似静态语言的方式来实现,并通过对存储位置以及属性的限制,让每种类型的…

自己动手写数据库: select 查询语句对应查询树的构造和执行

首先我们需要给原来代码打个补丁,在SelectScan 结构体初始化时需要传入 UpdateScan 接口对象,但很多时候我们需要传入的是 Scan 对象,因此我们需要做一个转换,也就是当初始化 SelectScan 时,如果传入的是 Scan 对象&am…

vs2019 配置liblas

vs2019 配置liblas liblas是一个开源的C库,用于读写LAS格式的点云数据。libLAS易于使用,广泛应用于各种点云处理任务。它支持基本的点云数据操作,如读取、写入和编辑LAS文件中的点。 1.源码下载 https://github.com/libLAS/libLAS 2.编译 首…

Docker多平台安装与配置指南

Docker的流行使得它成为开发者和运维人员不可或缺的工具。在本文中,将深入探讨如何在不同平台上安装和配置Docker,旨在为大家提供详尽的指南,确保他们能够顺利地使用这一强大的容器化工具。 Docker基础概念回顾 Docker利用容器技术&#xf…

设计模式-访问者模式

访问者模式是设计模式中行为型模式的一种(其他的还有如创建型、结构型),听说是设计模式中比较难理解的一种,最近项目中用到了该模式,所以今天总结和实践一下。 一、访问者模式要解决的问题: 稳定的数据结…

【系统架构】集群、分布式概念及系统架构演进过程

集群、分布式概念: 对食物没有太高要求的人在肚子饿的时候一般都会选择去兰州拉面、沙县小吃等小饭馆,这类小饭馆有个很显著的特点:洗菜、切菜、炒菜都是同一个人完成,如果厨子不舒服可能饭馆还会歇业。而一些人流量较大的饭馆的分…

MATLAB 平面拟合并可视化(34)

MATLAB 平面拟合并可视化(34) 一、效果二、代码一、效果 二、代码 % 生成三维点数据 x = rand(100, 1); y = rand(100, 1

nest框架的token登录,以及token校验

1.搭建项目 项目初始化: npm i -g nestjs/cli nest new project-name 在终端下执行这四个命令,生成两个新模块: nest g module auth nest g service auth nest g module users nest g service users 然后把这三个文件删掉,是没有…

【LeetCode刷题笔记(4)】【Python】【移动零】【简单】

文章目录 题目描述示例 1示例 2提示 解决方案题意拆解双指针算法双指针法的主要优点双指针法的使用场景举例: 解决方案:【双指针一次遍历】解题心得方案代码运行结果复杂度分析 结束语 移动零 题目描述 给定一个数组 nums,编写一个函数将所…

OWASP ESAPI 预防XSS跨站脚本攻击

跨站脚本攻击XSS案例&#xff1a;跨站脚本攻击XSS案例及其解决方案_xss攻击案例-CSDN博客 Java集成&#xff1a; 1、引入maven <!--OWASP ESAPI&#xff0c;防御 XSS跨站攻击--><dependency><groupId>org.owasp.esapi</groupId><artifactId>esa…

ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角

本节课的内容&#xff0c;就让我们来学习一下ArrayList集合的应用&#xff0c;ArrayList的本质就是一个顺序表&#xff0c;那下面一起来学习吧 目录 一、杨辉三角 1.题目详情及链接 2.剖析题目 3.思路及代码 二、洗牌算法 1.创造牌对象 2.创造一副牌 3.洗牌操作 4.发…

Alibaba分布式事务组件Seata AT实战

1. 分布式事务简介 1.1 本地事务 大多数场景下&#xff0c;我们的应用都只需要操作单一的数据库&#xff0c;这种情况下的事务称之为本地事务(Local Transaction)。本地事务的ACID特性是数据库直接提供支持。本地事务应用架构如下所示&#xff1a; 在JDBC编程中&#xff0c;我…