专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
沉默王二  ·  后端行情变了,差别真的挺大! ·  1 周前  
沉默王二  ·  后端行情变了,差别真的挺大! ·  1 周前  
51好读  ›  专栏  ›  分布式实验室

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

分布式实验室  · 公众号  · 后端  · 2016-10-17 07:45

正文



DC/OS 1.8的新功能

对于最新的DC/OS 1.8,有一个博客《Introducing DC/OS 1.8 GA!》(https://dcos.io/blog/2016/introducing-dc-os-1-8-ga/index.html)描述了最新的功能。

其中第一个重要的功能为Mesos 1.0 and the Universal Container Runtime,也即可以使用mesos-containerizer来运行Docker的镜像了。这也是DC/OS对于容器的管理越来越独立的体现。

我们在mesos-agent所在的机器上可以查看

ip-10-0-1-78 dcos.target.wants_slave # ps aux | grep mesos-agent
root 1824 0.6 0.3 1069204 46948 ? Ssl Oct03 9:57 /opt/mesosphere/packages/mesos--19a545facb66e57dfe2bb905a001a58b7eaf6004/bin/mesos-agent

mesos-agent的配置在路径/opt/mesosphere/packages/mesos–19a545facb66e57dfe2bb905a001a58b7eaf6004下面,在/opt/mesosphere/packages/mesos–19a545facb66e57dfe2bb905a001a58b7eaf6004/dcos.target.wants_slave/dcos-mesos-slave.service里面是mesos-slave的启动参数的设置,通过Mesos的文档,我们知道对于Mesos的参数可以使用环境变量进行设置。

ip-10-0-1-78 dcos.target.wants_slave # cat dcos-mesos-slave.service
[Unit]
Description=Mesos Agent: DC/OS Mesos Agent Service

[Service]
Restart=always
StartLimitInterval=0
RestartSec=5
KillMode=control-group
Delegate=true
LimitNOFILE=infinity
TasksMax=infinity
EnvironmentFile=/opt/mesosphere/environment
EnvironmentFile=/opt/mesosphere/etc/mesos-slave-common
EnvironmentFile=/opt/mesosphere/etc/mesos-slave
EnvironmentFile=/opt/mesosphere/etc/proxy.env
EnvironmentFile=-/opt/mesosphere/etc/mesos-slave-common-extras
EnvironmentFile=-/var/lib/dcos/mesos-slave-common
EnvironmentFile=-/var/lib/dcos/mesos-resources
EnvironmentFile=-/run/dcos/etc/mesos-slave
ExecStartPre=/bin/ping -c1 ready.spartan
ExecStartPre=/bin/ping -c1 leader.mesos
ExecStartPre=/opt/mesosphere/bin/bootstrap dcos-mesos-slave
ExecStartPre=/opt/mesosphere/bin/make_disk_resources.py /var/lib/dcos/mesos-resources
ExecStartPre=/bin/bash -c 'for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 2 > $i; echo -n "$i: "; cat $i; done'
ExecStart=/opt/mesosphere/packages/mesos--19a545facb66e57dfe2bb905a001a58b7eaf6004/bin/mesos-agent

在文件/opt/mesosphere/etc/mesos-slave-common中配置了大量的mesos-agent的参数,

MESOS_MASTER=zk://zk-1.zk:2181,zk-2.zk:2181,zk-3.zk:2181,zk-4.zk:2181,zk-5.zk:2181/mesos
MESOS_CONTAINERIZERS=docker,mesos
MESOS_LOG_DIR=/var/log/mesos
MESOS_MODULES_DIR=/opt/mesosphere/etc/mesos-slave-modules
MESOS_CONTAINER_LOGGER=org_apache_mesos_LogrotateContainerLogger
MESOS_ISOLATION=cgroups/cpu,cgroups/mem,disk/du,network/cni,filesystem/linux,docker/runtime,docker/volume
MESOS_DOCKER_VOLUME_CHECKPOINT_DIR=/var/lib/mesos/isolators/docker/volume
MESOS_IMAGE_PROVIDERS=docker
MESOS_NETWORK_CNI_CONFIG_DIR=/opt/mesosphere/etc/dcos/network/cni
MESOS_NETWORK_CNI_PLUGINS_DIR=/opt/mesosphere/active/cni/
MESOS_WORK_DIR=/var/lib/mesos/slave
MESOS_SLAVE_SUBSYSTEMS=cpu,memory
MESOS_EXECUTOR_ENVIRONMENT_VARIABLES=file:///opt/mesosphere/etc/mesos-executor-environment.json
MESOS_EXECUTOR_REGISTRATION_TIMEOUT=10mins
MESOS_CGROUPS_ENABLE_CFS=true
MESOS_CGROUPS_LIMIT_SWAP=false
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网段的。


从Mesos上我们看出这两个容器是在两个节点上的。


登入Docker的容器,ping另外一个CNI的Mesos的IP是没有问题的。

ip-10-0-1-78 cni # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7908deb3017 nginx "/bin/sh -c 'env; ip " 28 minutes ago Up 28 minutes 80/tcp, 443/tcp mesos-b3fbe6d9-236a-4856-a986-9babbba9c02c-S2.e3c96fa7-b5ff-4af6-9099-bbed399c7c37
a992929fb0d1 nginx "nginx -g 'daemon off" 6 hours ago Up 6 hours 443/tcp, 0.0.0.0:4989->80/tcp mesos-b3fbe6d9-236a-4856-a986-9babbba9c02c-S2.fca41f8d-816c-49cd-9b19-ba059b95e885
8032756dd66e nginx "nginx -g 'daemon off" 6 hours ago Up 6 hours 443/tcp, 0.0.0.0:27003->80/tcp mesos-b3fbe6d9-236a-4856-a986-9babbba9c02c-S2.c0fdd3db-6f17-41d3-ab05-6f2d4d0bfa13
ip-10-0-1-78 cni # docker exec -it e7908deb3017 bash
root@e7908deb3017:/# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
   valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
   valid_lft forever preferred_lft forever
51: eth0@if52:  mtu 1420 qdisc noqueue state UP group default
link/ether 02:42:09:00:03:82 brd ff:ff:ff:ff:ff:ff
inet 9.0.3.130/25 scope global eth0
   valid_lft forever preferred_lft forever
inet6 fe80::42:9ff:fe00:382/64 scope link
   valid_lft forever preferred_lft forever
root@e7908deb3017:/# ping 9.0.2.13
PING 9.0.2.13 (9.0.2.13): 56 data bytes
64 bytes from 9.0.2.13: icmp_seq=0 ttl=62 time=0.709 ms
64 bytes from 9.0.2.13: icmp_seq=1 ttl=62 time=0.535 ms


Q&A

Q:请问DC/OS目前测试的最大集群是多少节点的?

A: Mesos的节点数Tweeter和Apple网上说的数目都万节点以上,我们公司现在的客户有千节点级别的。

Q:DC/OS目前用在什么场景?

A:DC/OS目前的应用场景主要还是微服务和大数据混合部署比较多,也是其设计核心所在。

Q:请问有部署Stateful的应用,比如MySQL吗?

A:是用DC/OS还是建议从无状态的服务开始,随着运维能力的提高,可以部署有状态的服务,但是有状态的服务不建议直接使用Marathon进行部署,一方面它无法区分多个instance之间的区别,另一方面需要配合统一存储来实现。对于有状态的服务,可以自己实现Framework,例如我们使用的数据库是MongoDB,也是写了自己的Framework的。