所属技术领域:
K8s
|名词定义|
容器之所以被称为特殊的进程,是因为容器这个进程是有边界的。上一篇博客提到容器是一种沙盒技术,即能够向集装箱一样把应用装起来,这样应用与应用之间因为存在边界而不至于互相干扰,而被装进集装箱的应用也能被方便的搬运——这就是PaaS最理想的状态。容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其人为打造“边界”。在Linux中,Cgroup技术是用来制造约束的主要手段,而Namespace技术则是修改进程视图的主要方法,即让进程看到的资源信息与实际资源信息不同,俗称“障眼法”。
|技术特点|
namespace
namespace 是用来做资源隔离的,在 Linux 内核上有七种 namespace,docker 中用到了前六种。第七种 cgroup namespace 在 docker 本身并没有用到,但是在 runC 实现中实现了 cgroup namespace。
我们先从头看一下:
第一个是 mout namespace。mout namespace 就是保证容器看到的文件系统的视图,是容器镜像提供的一个文件系统,也就是说它看不见宿主机上的其他文件,除了通过 -v 参数 bound 的那种模式,是可以把宿主机上面的一些目录和文件,让它在容器里面可见的。
第二个是 uts namespace,这个 namespace 主要是隔离了 hostname 和 domain。
第三个是 pid namespace,这个 namespace 是保证了容器的 init 进程是以 1 号进程来启动的。
第四个是网络 namespace,除了容器用 host 网络这种模式之外,其他所有的网络模式都有一个自己的 network namespace 的文件。
第五个是 user namespace,这个 namespace 是控制用户 UID 和 GID 在容器内部和宿主机上的一个映射,不过这个 namespace 用的比较少。
第六个是 IPC namespace,这个 namespace 是控制了进程兼通信的一些东西,比方说信号量。
第七个是 cgroup namespace,上图右边有两张示意图,分别是表示开启和关闭 cgroup namespace。用 cgroup namespace 带来的一个好处是容器中看到的 cgroup 视图是以根的形式来呈现的,这样的话就和宿主机上面进程看到的 cgroup namespace 的一个视图方式是相同的。另外一个好处是让容器内部使用 cgroup 会变得更安全。
这里我们简单用 unshare 示例一下 namespace 创立的过程。容器中 namespace 的创建其实都是用 unshare 这个系统调用来创建的。
cgroup
1.两种 cgroup 驱动
cgroup 主要是做资源限制的,docker 容器有两种 cgroup 驱动:一种是 systemd 的,另外一种是 cgroupfs 的。
cgroupfs 比较好理解。比如说要限制内存是多少,要用 CPU share 为多少,其实直接把 pid 写入对应的一个 cgroup 文件,然后把对应需要限制的资源也写入相应的 memory cgroup 文件和 CPU 的 cgroup 文件就可以了。
另外一个是 systemd 的一个 cgroup 驱动。这个驱动是因为 systemd 本身可以提供一个 cgroup 管理方式。所以如果用 systemd 做 cgroup 驱动的话,所有的写 cgroup 操作都必须通过 systemd 的接口来完成,不能手动更改 cgroup 的文件。
2.容器中常用的 cgroup
CPU cpuset cpuacct
memory
device
freezer
blkio
pid
3.不常用的 cgroup
net_cls
net_prio
hugetlb
perf_event
rdma
|资料来源|
名词定义: https://blog.csdn.net/lhl1124281072/article/details/87900751