Home

cgroup__namespace

容器技术的基石

为了尽量协调隔离运行环境与尽量减少资源占用的需求。微服务这一套框架主要是以共享同一套内核空间,在用户空间上做隔离。而不是完全模拟出一套完全独立的系统。

最早的“容器”就是chroot,实现思想很简单:将某个子目录视为根目录,然后将其当做另一套体系看待,将这个子环境看做一个独立的“空间”。这套理论看似可行,但是有很严重的环境隔离问题,容易引起安全问题,比如在这篇文章就讲到,我们通过在chroot进一个目录之前先创建一个指向目录外的一个句柄,然后在chroot内部再调用这个句柄,就能回到chroot外的一个目录

chroot技术只能做到一个低限制性的轻容器环境,在实际环境里面既不安全也不够好用。例如:chroot里面的进程在某种意义上与外部系统的进程“平起平坐”,管理他们和管理任何一个进程的复杂度差不多。换言之,很难直接控制这个容器使用的资源

namespce

namespace是Linux内核提供的一项服务,

namespace 的主要作用:封装抽象,限制,隔离,使命名空间内的进程看起来拥有他们自己的全局资源;

namespace包含了隔离多项资源的功能,例如CPU,内存,网络这些,灵活得搭配这些服务可以高度自定义容器的隔离度。在外部系统看来,namespace环境只是一个普通的进程,我们可以直接通过控制这个进程来直接控制这个容器

cgroup

Cgroups are, therefore, a facility built into the kernel that allow the administrator to set resource utilization limits on any process on the system.

cgroup是一个“资源限制器”,精准地对某个进程进行某种类型的资源限制。

在操作系统原理中我们可以知道的是,进程使得某个应用程序认为自己在独占得使用系统中的CPU等资源,实际上CPU却是在不同的进程中不断切换的。而虚拟内存使得进程认为自己在独占的使用内存资源,这两种技术实现了应用程序互相的隔离,换言之,他们是现代操作系统运行程序的基石

有的时候,特别是docker环境,我们特别需要在更细颗粒度上对容器资源进行进一步的掌控,现有的独占资源模式不再适合了,于是产生了cgroup

值得一提的是cgroup以文件形式提供接口,直接创建对应的文件即可:

cgroup_cpu_path=/sys/fs/cgroup/cpu/dra
mkdir ${cgroup_cpu_path} | :
echo 10000 >${cgroup_cpu_path}/cpu.cfs_period_us
echo 1000 >${cgroup_cpu_path}/cpu.cfs_quota_us

cgroup_mem_path=/sys/fs/cgroup/memory/dra
mkdir ${cgroup_mem_path} | :
# limit 500MB
echo 524288000 >${cgroup_mem_path}/memory.limit_in_bytes

按照标准创建好对应的目录,然后挂载,就能实现对某个进程的资源限制

一般来说这些由systemd来管理,人为写还是比较麻烦的

Implement a docker

通过这些技术,甚至可以自己手搓一个docker运行时(当然是简陋版)最小实现。Link

Reference

https://moelove.info/2021/11/17/一篇搞懂容器技术的基石-cgroup/

https://learn.lianglianglee.com/专栏/由浅入深吃透 Docker-完/17 原理实践:自己动手使用 Golang 开发 Docker(上).md

https://shoppon.github.io/linux/cgroup.html

https://docs.sylabs.io/guides/3.9/user-guide/cgroups.html

https://moelove.info/2021/12/10/搞懂容器技术的基石-namespace-上/#namespace-是什么

https://www.redhat.com/sysadmin/cgroups-part-one