一、容器进程隔离
1)命名空间是什么
命名空间(namespace)是一种由内核提供的进程隔离技术,用以隔离同一个操作系统上不同进程组的干扰与影响。
容器技术实现中以namespace实现了对容器进程组隔离,涉及主要namespace如下:
命名空间 | 类型 | 备注 |
mnt | 挂载点 | 不同容器之间根文件系统和磁盘卷不同 |
pid | 进程号 | 不同容器之间同进程号不同进程 |
ipc | 进程间通信 |
不同容器之间同ipc号标识不同ipc对象 |
user | 用户 | 不同容器之间同uid/gid不同用户/用户组 |
net | 网络 | 不同容器之间网络协议栈不同 |
uts | 系统标识 | 不同容器之间可以有不同的hostname、domainname |
2)命名空间在容器组中实践
在kubernetes中,容器组(pod)代表了一个紧密协作的业务进程集,亦是namespace技术典型落地实践之一。
上图为容器组中业务进程与各namespace技术应用示意。意味着通常情况下:
a)相同容器组不同容器共享了相同的net、uts以及ipc命名空间
b)相同容器组不同容器独占了不同的pid、mnt命名空间
思考:不同的网络命名空间里,你能看到什么差异性的东西? |
二、容器资源配额
1)cgroup是什么
Cgroups 是Linux 内核提供的物理资源隔离机制,通过这种机制,可以实现对Linux 进程或者进程组的资源限制、隔离和统计功能。
当前容器技术落地中以cgroup技术实现对容器资源的配额使用。
资源 | 类型 | 备注 |
CPU | 相对配额 | cpu.share |
绝对配额(核心共享) | cpu_cfs_quota_ns/cpu_cfs_period_ns | |
绝对配额(核心独占) | cpuset | |
内存 | 绝对配额(内存) | memory.limit_in_bytes |
绝对配额(缓存) | memory.memsw.limit_in_bytes | |
块IO | 相对配额(bandwidth) | blkio.weight blkio.weight_device |
绝对配额(iops) | blkio.throttle.read_iops_device blkio.throttle.write_iops_device |
2)cgroup在容器组技术实践中的应用
如大家熟知的,kubernetes中为pod提供了request与limit的资源配置。pod的request与limit配置向上影响了pod在kubernetes中的Qos级别,
向下沉淀为宿主机操作系统上的cgroup配置,内核层面按配额制约着容器对宿主机资源的使用。
思考:kubernetes pod里容器cpu的request&limit是如何生效的? |
三、容器应用封装
1)镜像是什么
镜像作为容器应用载体,封装了应用及其依赖包,是一个容器应用的根文件系统(rootfs)。
2)镜像是怎么实现的
业务镜像通常以overlayfs/aufs/devicemapper等技术封装实现,以overlayfs技术实现为例,示意如下:
对于组成overlayfs的各只读层、可读写层通过下述类似指令绑定挂载到最顶层的统一视图层:
mount -t overlay overlay -olower-dir=lower-dir_3:lower-dir_2: lower-dir_1,upperdir=upper-dir,workdir=merge-dir
overlayfs基本工作机制如下:
1)顶层merged视图文件为下层文件映射,如file1
2)上层视图文件覆盖下层同名文件,如file2
3)删除顶层视图文件并不会真正删除下层原文件,只在可读写层做删除标记,如file3
4)写文件时候,下层文件会被复制到上层可读写层,然后再写入,这就是copy-on-write机制,如file4
四、破茧化蝶
如前文所述,容器是一组被隔离的业务相关进程,受限使用公共资源。换句话说,一组业务相关进程以namespace进行隔离,以cgroup进行资源配额,最后通过chroot或类似方式切入到专属rootfs中,这组进程就破茧化蝶成了容器。
思考:论pivot_root、chroot以及switch_root的根文件系统切换的几种方法? |