深入解析DC/OS 1.8 – 高可靠的微服务及大数据管理平台

  MESOS_DOCKER_REMOVE_DELAY=1hrs

  MESOS_DOCKER_STOP_TIMEOUT=20secs

  MESOS_DOCKER_STORE_DIR=/var/lib/mesos/slave/store/docker

  MESOS_GC_DELAY=2days

  MESOS_HOSTNAME_LOOKUP=false

  GLOG_drop_log_memory=false

  默认的mesos-containerizer的隔离只包括cpu和memory,然而在最新的mesos版本里面,多了provisioner这一层,在上面的配置里面隔离了MESOS_ISOLATION=cgroups/cpu,cgroups/mem,disk/du,network/cni,filesystem/linux,docker/runtime,docker/volume,从而可以启动docker的镜像了。

  第二个最重要的功能是CNI, container network interface。

物联网

  CNI要工作需要三部分:

  首先DC/OS不需要外置的IPAM,而是由mesos-master的replicated_log负责管理分配IP地址,Mesos需要启动的时候,载入overlay network的modules。

  在路径/opt/mesosphere/etc/mesos-slave-modules下面有文件overlay_slave_modules.json

  ip-10-0-1-78 mesos-slave-modules # cat overlay_slave_modules.json

  {

  "libraries":

  [

  {

  "file": "/opt/mesosphere/active/mesos-overlay-modules/lib/mesos/libmesos_network_overlay.so",

  "modules":

  [

  {

  "name": "com_mesosphere_mesos_OverlayAgentManager",

  "parameters" :

  [

  {

  "key": "agent_config",

  "value" : "/opt/mesosphere/etc/overlay/config/agent.json"

  }

  ]

  }

  ]

  }

  ]

  }

  其次需要载入CNI isolator,这个在MESOS_ISOLATION这个环境变量里面已经配置了。

  最后还需要navstar服务来实现跨节点之间的IP互访问

  每个mesos-agent的机器上都有opt/mesosphere/packages/navstar--589afdaef03114a17576ee648ae433a052f7a4b9/,都会运行一个navstar进程。

  每个机器上都会创建网卡d-dcos,如果Docker容器使用CNI获取IP的容器都Attach到这个网卡上,而非docker0上。

  每个机器上都会创建网卡m-dcos,如果mesos容器使用CNI获取IP的容器都Attach到这个网卡上。

  每台机器的d-dcos和m-dcos的网段都不同。

  每台机器都会创建一个vtep1024的网卡,作为VTEP,背后是vxlan。

  每台机器都会创建默认的路由表,从本节点连接到其他的节点默认走vtep1024这个网卡。

  9.0.0.0/24 via 44.128.0.1 dev vtep1024

  9.0.1.0/24 via 44.128.0.2 dev vtep1024

  9.0.3.0/24 via 44.128.0.4 dev vtep1024

  对DC/OS的网络的配置在/opt/mesosphere/etc/dcos/network/cni路径下

物联网

  为了试验这两个新的功能,我们首先创建一个使用CNI的Mesos容器,但是启动的是Docker的Image nginx

  {

  "id":"nginxmesos",

  "cmd":"env; ip -o addr; sleep 3600",

  "cpus":0.10,

  "mem":512,

  "instances":1,

  "ipAddress":{

  "networkName":"dcos"

  },

  "container":{

  "type":"MESOS",

  "docker":{

  "network":"USER",

  "image":"nginx",

  "portMappings":[

  {

  "host_port": 0,

  "container_port": 80,

  "protocol": "tcp"

  }

  ]

  }

  }

  }

  在日志里面,打印出来容器的IP地址是m-dcos网段的。

物联网

  然后我们再启动一个使用CNI的Docker容器

  {

  "id":"nginxmesos1",

  "cmd":"env; ip -o addr; sleep 3600",

  "cpus":0.10,

  "mem":512,

  "instances":1,

  "ipAddress":{

  "networkName":"dcos"

  },

  "container":{

  "type":"DOCKER",

  "docker":{

  "network":"USER",

  "image":"nginx",

  "portMappings":[

  {

  "host_port": 0,

  "container_port": 80,

  "protocol": "tcp"

  }

  ]

  }

  }

  }

  从日志我们看出,配置的IP是d-dcos网段的,而非docker0网段的。

物联网