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名字空间。这样容器中的进程无法看到另外容器中的进程。

results matching ""

    No results matching ""