【笔记】容器基础-隔离与限制

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Docker 项目的核心原理为待创建的用户进程

        1.启用 Linux Namespace 配置修改进程视图

        2.设置指定的 Cgroups 参数为进程设置资源限制

        3.切换进程的根目录Change Root

容器的隔离与限制

1.启用 Linux Namespace 配置

namespace 技术是用来修改进程视图的主要方法

1) linux 创建namespace的代码逻辑

以创建PID namespace 为例

namespace 是linux创建进程的一个可选参数在 Linux 系统中创建进程的系统调用是 clone()比如

int pid = clone(main_function, stack_size, SIGCHLD, NULL); 

这个系统调用就会为我们创建一个新的进程并且返回它的进程号 pid。

而当我们用 clone() 系统调用创建一个新进程时就可以在参数中指定 CLONE_NEWPID 参数

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL); 

这时新创建的这个进程将会“看到”一个全新的进程空间在这个进程空间里它的 PID 是 1在宿主机真实的进程空间里这个进程的 PID 还是真实的数值比如 100。

2) linux namespace 介绍

  1. UTS Namespace:隔离主机名
  2. IPC Namespace:隔离进程间通信
  3. PID Namespace:隔离进程ID
  4. Mount Namespace:隔离进程看到的文件层级
  5. User Namespace:隔离用户组ID(举个例子在宿主机上以一个非root用户运行创建一个User Namespace 在UserNamespace里面映射成root用户)
  6. Network Namespace:用来隔离网络设备IP地址端口等网络栈

Mount Namespace 跟其他 Namespace 的使用略有不同的地方它对容器进程视图的改变一定是伴随着挂载操作mount才能生效。 

3) namespace技术缺陷

  • 容器只是运行在宿主机上的一种特殊的进程那么多个容器之间使用的就还是同一个宿主机的操作系统内核。这意味着如果要在 Windows 宿主机上运行 Linux 容器或者在低版本的 Linux 宿主机上运行高版本的 Linux 容器都是行不通的。
  • 在 Linux 内核中有很多资源和对象是不能被 Namespace 化的最典型的例子就是时间。

2.设置指定的 Cgroups 参数

cgroup全称是control groups。control groups控制组被整合在了linux内核当中把进程tasks放到组里面对组设置权限对进程进行控制(它最主要的作用就是限制一个进程组能够使用的资源上限包括 CPU、内存、磁盘、网络带宽等等)。可以理解为用户和组的概念用户会继承它所在组的权限。

cgroup 提供了将进程组织成控制组的能力然后通过使用 资源控制子系统cgroup_subsys 来对控制组进行资源使用的控制cgroup 支持的 资源控制子系统 有以下几种

cpu子系统限制 CPU 的使用。

memory子系统限制内存使用。

cpuset子系统可以为进程组分配单独的 CPU 或者内存节点。

cpuacct子系统统计CPU group的使用情况。

blkio子系统限制I/O一般用于磁盘。

devices子系统限制进程使用的设备。

freezer子系统可以挂起和恢复进程组。

net_cls子系统可以标记进程组的网络数据包使用 tc 模块traffic control对数据包进行控制。

cgroup 通过把进程组织成 控制组然后通过 资源控制子系统 来对 控制组 进行资源使用的限制所以 cgroup 的分析可以分成两部分cgroup框架 和 资源控制子系统。 

cgroup 控制组

控制组 说白了就是一组进程进程组cgroup 就是用来限制 控制组 的资源使用。为了能够方便地向一个 控制组 添加或者移除进程在命令行也能操作内核使用了 虚拟文件系统 来进行管理 控制组。

我们可以把一个 控制组 当成是一个目录由于目录有层级关系所以 控制组 也有层级关系如下图所示

cgroup CPU限制

在cgroup里面跟CPU相关的子系统有cpusets、cpuacct和cpu。

cpuset主要用于设置CPU的亲和性可以限制cgroup中的进程只能在指定的CPU上运行或者不能在指定的CPU上运行

cpuacct包含当前cgroup所使用的CPU的统计信息

cgroup Memory 限制

在上图中我们创建了 2 个 cgroup每个 cgroup 有 4 个进程并且限制它们各自最多只能使用 2GB 的内存。如果使用超过 2GB 的内存那么将会触发 OOMOut Of Memory 错误。

Cgroups缺陷

Cgroups 对资源的限制能力有很多不完善的地方比如 /proc 文件系统的问题。

Linux 下的 /proc 目录存储的是记录当前内核运行状态的一系列特殊文件用户可以通过访问这些文件查看系统以及当前正在运行的进程的信息比如 CPU 使用情况、内存占用率等这些文件也是 top 指令查看系统信息的主要数据来源。

但是你如果在容器里执行 top 指令就会发现它显示的信息居然是宿主机的 CPU 和内存数据而不是当前容器的数据。

造成这个问题的原因就是/proc 文件系统并不知道用户通过 Cgroups 给这个容器做了什么样的资源限制即/proc 文件系统不了解 Cgroups 限制的存在。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6