isolator
概述
Isolator
负责为容器创建一个环境,使得cpu,network,storage,memory等资源能够与其他容器隔离。是在容器的生命周期中用于扩展的接口:
- 启动前:prepare()
- 启动后(在父子的上下文中都要执行?):isolate()
- 终止:cleanup()
- 资源更新:update()
- 达到资源限制:watch()
- agent重启及恢复:recover()
- 统计及状态获取:usage()
Isolator基本上是在每一个容器开始之前或者是在开始之后或者是destroy之后发生的每一个life cycle都有的一个hook,所以用户在任何阶段都可以自己定一个Isolator,放到Mesos里面,在每一个容器上都可以增加或减少一个容器所有的功能。
例子:
各种isolators有:
mesos资源的isolation机制使用了插件式的设计,agent使用容器来提供隔离环境,运行executor及任务。下图展示了不同的isolation机制。
图中,containerizer API目的是支持多种容器化实现,意味着我们可以使用自己的容器实现及isolators。当启动slave进程时,可以指定使用哪种容器实现来启动容器及一系列的isolators。
各种isolator
isolator名称 | 对应的类 |
---|---|
filesystem/posix | PosixFilesystemIsolatorProcess |
filesystem/linux | LinuxFilesystemIsolatorProcess |
filesystem/shared | SharedFilesystemIsolatorProcess |
posix/cpu | PosixCpuIsolatorProcess |
posix/mem | PosixMemIsolatorProcess |
posix/disk | PosixDiskIsolatorProcess |
disk/du | PosixDiskIsolatorProcess |
disk/xfs | XfsDiskIsolatorProcess |
cgroups/cpu | CgroupsCpushareIsolatorProcess |
cgroups/devices | CgroupsDevicesIsolatorProcess |
cgroups/mem | CgroupsMemIsolatorProcess |
cgroups/net_cls | CgroupsNetClsIsolatorProcess |
cgroups/perf_event | CgroupsPerfEventIsolatorProcess |
docker/runtime | DockerRuntimeIsolatorProcess |
docker/volume | DockerVolumeIsolatorProcess |
gpu/nvidia | NvidiaGpuIsolatorProcess |
namespaces/pid | NamespacesPidIsolatorProcess |
network/cni | NetworkCniIsolatorProcess |
调用流程
每一种isolator类都继承MesosIsolatorProcess,定义在src/slave/containerizer/mesos/isolator.cpp中,
其中定义了以下的操作:
- recover
- prepare:设置容器隔离特性,例如创建cgroups
- isolate:隔离进程
- watch:强制隔离,若有冲突则报告
- update
- usage
- status
- cleanup
这些操作的具体实现都在各个具体的isolator类。
Disk space isolation
启动时在--isolation
标志使用posix/disk并使用--enforce_container_disk_quota
启动本isolator。它定期报告磁盘的使用统计情况,可以在/monitor/statistics.json查询到。时间间隔由启动slave时的标志--container_disk_watch_interval
控制,缺省是15秒。
ShreadFilesystem isolator
用于控制每个容器的共享文件系统视图。若要修改它,有两种方法 :
- 在framework的ContainerInfo(在ExecutorInfo内部)指定
- 启动时指定
--default_container_info
标志
ContainerInfo指定了将共享文件系统的某些部分(host_path)映射到容器的文件系统路径(container_path),可以指定是只读还是读写权限。若host_path是绝对路径,则其之下的子目录和文件都能被容器中通过container_path访问到。若host_path是相对路径,则认为是相对于executor工作目录的,目录将被创建。例如,我们可以这样指定:host_path="tmp"且container_path="/tmp",这样会在executor工作目录下创建一个tmp目录作为容器的/tmp目录。
PID namespace isolator
每个容器使用独立的PID名字空间。这样容器中的进程无法看到另外容器中的进程。