容器核心技术之Namespace与Cgroup

        容器是一种流行的虚拟化技术,它允许我们在同一台计算机上与其他进程在独立环境中运行进程。那么容器是如何做到这一点的呢?为此,容器是从 Linux 内核的一些新功能构建的,其中两个主要功能是“namespace”和“cgroup”。

1.Namespace

1.1Namespace简介

        Namespace(命名空间)技术是一种内核级别的特性,它允许将全局系统资源隔离成独立的视图,使得在不同 Namespace 中运行的进程看到的资源是不同的。这为容器化技术提供了基础,使得多个进程或容器可以在同一台主机上独立运行而不会相互干扰。

        容器中的命名空间(Namespace)是一种用于隔离和分割不同容器之间和容器与主机操作系统之间资源的技术。命名空间是Linux内核提供的一种特性,容器技术(如Docker和Kubernetes)利用这些命名空间来实现容器的隔离和资源管理。每个命名空间都提供了一种不同类型的隔离,允许容器内的进程和资源在一个虚拟化的环境中运行,以便它们似乎独立于主机和其他容器。

对应到容器技术,为了隔离不同类型的资源,Linux 内核里面实现了以下几种不同类型的 namespace。

  • PID Namespace(进程命名空间): 这个命名空间隔离了进程ID(PID),使得容器内的进程拥有自己独立的PID空间。这意味着容器内的进程可以以1作为其PID,而不会与主机或其他容器的进程冲突。
  • Network Namespace(网络命名空间): 这个命名空间隔离了网络资源,包括网络接口、IP地址、路由表等。每个容器通常都有自己的网络命名空间,使其能够运行自己的网络栈,与其他容器隔离。
  • Mount Namespace(挂载命名空间): 每个容器都有自己的挂载命名空间,使其能够拥有独立的文件系统挂载点。这允许容器在其内部拥有自己的文件系统视图,而不会影响到主机或其他容器的文件系统。
  • UTS Namespace(UTS命名空间): UTS命名空间用于隔离主机名和域名。每个容器都可以具有自己独立的主机名,这有助于在容器中创建隔离的网络标识。
  • User Namespace(用户命名空间): 这个命名空间允许容器内的进程拥有不同于主机的用户和用户组标识。这增强了安全性,因为容器中的进程无法直接影响主机上的用户。

        通过这些命名空间,容器技术可以提供隔离、安全性和资源管理,使多个容器可以在同一主机上运行而不会相互干扰。容器编排系统(如Kubernetes)可以有效地管理多个容器,并使用这些命名空间来确保它们之间的隔离和资源控制。这有助于实现更高效和可伸缩的应用程序部署和管理。

1.2用户空间与内核空间

为了开始我们的探索,重要的是要注意,在 Linux 中,内核是程序和它们需要访问的资源之间的唯一抽象层。

每个进程进行系统调用:

由于容器是进程,它们也会进行系统调用:

内核为安全性、硬件和内部数据结构提供了抽象。例如,open系统调用通常用于获取文件处理程序并抽象文件操作。

        

如果我们用 ps 查看机器上的 nginx 进程,可以看到 master 和 worker,worker 的父进程是 master。

# ps -ef |grep nginx

root 58212 58195 0 01:43 ? 00:00:00 /bin/sh -c nginx -g "daemon off;"

root 58244 58212 0 01:43 ? 00:00:00 nginx: master process nginx -g daemon off;

33 58250 58244 0 01:43 ? 00:00:00 nginx: worker process

33 58251 58244 0 01:43 ? 00:00:05 nginx: worker process

33 58252 58244 0 01:43 ? 00:00:05 nginx: worker process

33 58253 58244 0 01:43 ? 00:00:05 nginx: worker process

在 /proc/pid/ns 里面,我们能够看到这个进程所属于的 6 种 namespace。我们拿出两个进程来,应该可以看出来,它们属于同一个 namespace。

# ls -l /proc/58212/ns 
lrwxrwxrwx 1 root root 0 Jul 16 19:19 ipc -> ipc:[4026532278]
lrwxrwxrwx 1 root root 0 Jul 16 19:19 mnt -> mnt:[4026532276]
lrwxrwxrwx 1 root root 0 Jul 16 01:43 net -> net:[4026532281]
lrwxrwxrwx 1 root root 0 Jul 16 19:19 pid -> pid:[4026532279]
lrwxrwxrwx 1 root root 0 Jul 16 19:19 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jul 16 19:19 uts -> uts:[4026532277]

# ls -l /proc/58253/ns 
lrwxrwxrwx 1 33 tape 0 Jul 16 19:20 ipc -> ipc:[4026532278]
lrwxrwxrwx 1 33 tape 0 Jul 16 19:20 mnt -> mnt:[4026532276]
lrwxrwxrwx 1 33 tape 0 Jul 16 19:20 net -> net:[4026532281]
lrwxrwxrwx 1 33 tape 0 Jul 16 19:20 pid -> pid:[4026532279]
lrwxrwxrwx 1 33 tape 0 Jul 16 19:20 user -> user:[4026531837]
lrwxrwxrwx 1 33 tape 0 Jul 16 19:20 uts -> uts:[4026532277]

2.Cgroup

2.1Cgroup简介

在容器技术中,控制组(Control Group,通常简称为cgroup)是一种用于资源限制、管理和隔离的 Linux 内核功能。Cgroup 允许你对容器内的资源进行精细的控制,确保容器在主机上共享的资源(如CPU、内存、磁盘I/O、网络带宽等)得到合理的分配和隔离。

首先,cgroup 定义了下面的一系列子系统,每个子系统用于控制某一类资源。

  • cpu: 这个子系统用于控制和限制 CPU 资源的分配。它可以设置容器或进程组在一段时间内可以使用的 CPU 时间比例,以及最大 CPU 时间。这使得你可以为容器分配特定的 CPU 资源,确保它们不会占用过多的处理器资源。
  • memory: memory 子系统用于控制和限制内存的使用。你可以设置容器或进程组可以使用的最大内存量,以及当内存达到限制时如何处理(如进行内存交换或终止进程)。
  • blkio: 这个子系统用于控制块设备的 I/O(包括磁盘读写)访问。你可以设置容器或进程组的磁盘 I/O 限制,以确保它们不会占用过多的磁盘带宽。
  • cpuset: cpuset 子系统用于将进程或容器绑定到特定的 CPU 和内存节点。这使得你可以将特定的任务限制在特定的 CPU 核心上运行,或者将它们限制在特定的内存区域中。
  • pids: pids 子系统用于限制进程组内的进程数量。你可以设置容器或进程组可以创建的最大进程数量。
  • net_cls 和 net_prio: 这两个子系统用于网络流量控制。net_cls 允许你标记特定的网络数据包,而 net_prio 则用于设置不同网络流量的优先级。
  • hugetlb: 这个子系统用于管理大页内存的分配和使用。
  • rdma: rdma 子系统用于控制远程直接内存访问(RDMA)资源的分配。
  • freezer: freezer 子系统用于暂停和恢复容器内的进程。

这些子系统允许你在容器内或进程组内对特定类型的资源进行精细的控制和限制。在容器编排系统(如Kubernetes)或容器管理工具(如Docker)中,这些子系统通常会被自动配置和管理,以确保容器能够在共享主机上安全、高效地运行。

2.2Cgroup的工作机制

第一步,系统初始化的时候,初始化 cgroup 的各个子系统的操作函数,分配各个子系统的数据结构。

第二步,mount cgroup 文件系统,创建文件系统的树形结构,以及操作函数。

第三步,写入 cgroup 文件,设置 cpu 或者 memory 的相关参数,这个时候文件系统的操作函数会调用到 cgroup 子系统的操作函数,从而将参数设置到 cgroup 子系统的数据结构中。

第四步,写入 tasks 文件,将进程交给某个 cgroup 进行管理,因为 tasks 文件也是一个 cgroup 文件,统一会调用文件系统的操作函数进而调用 cgroup 子系统的操作函数,将 cgroup 子系统的数据结构和进程关联起来。

第五步,对于 CPU 来讲,会修改 scheduled entity,放入相应的队列里面去,从而下次调度的时候就起作用了。对于内存的 cgroup 设定,只有在申请内存的时候才起作用。

创建cgroup

以下命令创建一个名为 v1 cgroup(您可以通过路径名格式判断)foo并将其内存限制设置为 50,000,000字节 (50 MB)。

root # mkdir -p /sys/fs/cgroup/memory/foo

root # echo 50000000 > /sys/fs/cgroup/memory/foo/memory.limit_in_bytes

现在我可以将一个进程分配给 cgroup,从而对其施加 cgroup 的内存限制。我编写了一个名为 的 shell 脚本test.sh,它打印cgroup testing tool到屏幕上,然后等待什么都不做。就我而言,这是一个持续运行的过程,直到我停止它为止。

我test.sh在后台启动,其 PID 报告为 2428。脚本生成其输出,然后通过将其 PID 通过管道传输到 cgroup 文件/sys/fs/cgroup/memory/foo/cgroup.procs ,将进程分配给 cgroup 。

root # ./test.sh &
[1] 2428
root # cgroup testing tool
root # echo 2428 > /sys/fs/cgroup/memory/foo/cgroup.procs

为了验证我的进程实际上受到我为 cgroup 定义的内存限制foo,我运行以下ps命令。该-o cgroup标志显示指定进程 (2428) 所属的 cgroup。输出确认其内存 cgroup 是foo。

为了验证我的进程实际上受到我为 cgroup 定义的内存限制foo,我运行以下ps命令。该-o cgroup标志显示指定进程 (2428) 所属的 cgroup。输出确认其内存 cgroup 是foo。我们在 /sys/fs/cgroup/ 下面能看到下面的目录结构。

drwxr-xr-x 5 root root  0 May 30 17:00 blkio
lrwxrwxrwx 1 root root 11 May 30 17:00 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 May 30 17:00 cpuacct -> cpu,cpuacct
drwxr-xr-x 5 root root  0 May 30 17:00 cpu,cpuacct
drwxr-xr-x 3 root root  0 May 30 17:00 cpuset
drwxr-xr-x 5 root root  0 May 30 17:00 devices
drwxr-xr-x 3 root root  0 May 30 17:00 freezer
drwxr-xr-x 3 root root  0 May 30 17:00 hugetlb
drwxr-xr-x 5 root root  0 May 30 17:00 memory
lrwxrwxrwx 1 root root 16 May 30 17:00 net_cls -> net_cls,net_prio
drwxr-xr-x 3 root root  0 May 30 17:00 net_cls,net_prio
lrwxrwxrwx 1 root root 16 May 30 17:00 net_prio -> net_cls,net_prio
drwxr-xr-x 3 root root  0 May 30 17:00 perf_event
drwxr-xr-x 5 root root  0 May 30 17:00 pids
drwxr-xr-x 5 root root  0 May 30 17:00 systemd

3.参考资料

Deep into Container — Linux Namespaces and Cgroups: What are containers made from? | by Quân Huỳnh | FAUN — Developer Community 🐾

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

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

相关文章

蓝桥杯 题库 简单 每日十题 day5

01 字符计数 字符计数 题目描述 给定一个单词,请计算这个单词中有多少个元音字母,多少个辅音字母。 元音字母包括a,e,i,o,u,共五个,其他均为辅音字母。 输入描述 输入格式: 输入一行&#xff0…

形式化验证方法研究综述

摘要:形式化验证是证明软件、硬件或系统正确性的一种方法,近年来受到了越来越多的关注。 本文对形式化验证的研究进行了综述。首先介绍了形式化验证的基本概念,然后重点介绍了形式化验证的三种技术,包括模型检测、定理证明和等价性…

三维模型3DTile格式轻量化在数据存储的重要性分析

三维模型3DTile格式轻量化在数据存储的重要性分析 三维模型3DTile格式轻量化在数据存储中占有重要地位。随着科技的不断发展,尤其是空间信息科技的进步,人们对于三维地理空间数据的需求日益增长。然而,这类数据通常具有大尺度、高精度等特点&…

实例讲解Spring boot动态切换数据源

前言 在公司的系统里,由于数据量较大,所以配置了多个数据源,它会根据用户所在的地区去查询那一个数据库,这样就产生了动态切换数据源的场景。 今天,就模拟一下在主库查询订单信息查询不到的时候,切换数据…

[C++基础]-继承

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、模板的…

LabVIEW崩溃问题解决方法

LabVIEW崩溃问题解决方法 LabVIEW在运行中出现崩溃的情况,确实让人很崩溃。不过按照下面的方法可以逐步排查解决。 在LabVIEW开发环境中浏览时,LabVIEW崩溃并显示以下错误: 解决方案 LabVIEW内部错误和崩溃的初步故障排除步骤:…

【蓝桥杯选拔赛真题62】Scratch判断小球 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch判断小球 一、题目要求 编程实现 二、案例分析 1、角色分析

docker 操作redis

1查看容器 2进入容器 exec表示在运行的容器中执行命令it表示以终端交互的方式执行命令/bin/bash表示需要指定的命令 3进入容器后可通过redis-cli命令连接容器内的redis服务器,可通过set创建变量,get获取变量的值 4key * 查看所有key 通过ping 查看redi…

从CNN(卷积神经网络),又名CAM获取热图

一、说明 卷积神经网络(CNN)令人难以置信。如果你想知道它如何看待世界(图像),有一种方法是可视化它。 这个想法是,我们从最后的密集层中得到权重,然后乘以最终的CNN层。这需要全局平均…

安防监控视频云存储平台EasyNVR对接EasyNVS时,一直不上线该如何解决?

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。 近期有用户在使用安防视频平台EasyNVR对接上级平台EasyNVS时,出现了一直不上线…

CentOS 7 制作openssl 1.1.1w 版本rpm包 —— 筑梦之路

源码下载地址: https://www.openssl.org/source/openssl-1.1.1w.tar.gz 参考之前的文章: openssl 1.1.1L /1.1.1o/1.1.1t rpm包制作——筑梦之路_openssl的rpm包_筑梦之路的博客-CSDN博客 直接上spec文件: Name: openssl Version: 1.1…

10.5 串联型稳压电路(1)

稳压管稳压电路输出电流较小,输出电压不可调,不能满足很多场合下的应用。串联型稳压电路以稳压管稳压电路为基础,利用晶体管的电流放大作用,增大负载电流;在电路中引入深度电压负反馈使输出电压稳定;并且&a…

【全网最全】2023华为杯研究生数学建模B题完整思路+python代码+20页超详细启发式算法+FFT(后续会更新)

目录 点击资料获取入口 DFT在通信等领域的重要应用,以及目前采用FFT计算DFT的硬件开销大的问题。提出了将DFT矩阵分解为整数矩阵乘积逼近的方法来降低硬件复杂度。 建模目标是对给定的DFT矩阵F_N,找到一组K个矩阵A,使F_N和A的乘积在Frobenius范数意义下尽可能接近,即最小化目标…

【算法思想】排序

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

小土堆pytorch学习笔记

想入门pytorch强化学习,就去找pytorch的课来看。B站上播放量最高的就是小土堆的课,整体跟下来感觉内容还是很详细的,但和我的预期不太一样,这个是DL的不是RL的,不过作为对于pytorch使用的初期了解也是很好的&#xff0…

ChatGLM OPENCL 和 CUDA 哪个 GPU 加速计算框架更快

OpenCL和CUDA都是强大的GPU加速计算框架,CUDA在与NVIDIA GPU的紧密结合下提供了更高性能,适用于专注于NVIDIA平台开发者;而OpenCL具有跨平台兼容性和多厂商支持的优势,适用于需要在不同硬件平台上进行开发的场景。 在现代计算领域,GPU 加速已经成为一种强大的工具,能够显…

hexo使用指南

一、git设置 git ssh配置 本地操作: git config --global user.name "你的git用户名" git config --global user.email "你的git登录邮箱" #生成ssh公钥 ssh-keygen -t rsa -C "你的git登录邮箱"github官网操作: 将公…

Linux学习-HIS系统部署(1)

Git安装 #安装中文支持(选做) [rootProgramer ~]# echo $LANG #查看当前系统语言及编码 en_US.UTF-8 [rootProgramer ~]# yum -y install langpacks-zh_CN.noarch #安装中文支持 [rootProgramer ~]# vim /etc/locale.co…

RSD处理气象卫星数据——常用投影

李国春 气象卫星扫描刈幅宽覆盖范围广,在地球的不同位置可能需要不同的投影以便更好地表示这些观测数据。这与高分辨率的局地数据有很大不同,高分数据更倾向于用使用处理局地小范围的投影方式。本文选择性介绍几种RSD常用的适合低、中、高纬和极地地区的…

Java笔记:看清类加载过程

1 类加载的过程 1.1 加载 “加载”是“类加载”(Class Loading)过程的第一步。这个加载过程主要就是靠类器实现的,包括用户自定义类加载器。 加载的过程 在加载的过程中,JVM主要做3件事情 1)通过一个类的全限定名来获取定义此类的二进制字节…