DCOS和mesos

Mesos

mesos本身的目的是针对当前的各种分布式系统的抽象,拿原始的操作系统进行对比,内核控制各个进程执行某些任务,而到了分布式时代,要从更高层面去看,把每个物理节点当做一个进程,有专门的服务作为抽象的内核对进程进行调控,分配给各个进程去执行任务,就像下面的图,特别像操作系统的概念。
mesos架构

DC/OS

Data Center Operating System
算是mesos的超集,采用了mesos的kernel,然后把mesos中常用的framework(mesos中的概念,表示进程要执行的任务,具体到节点就是mesos的某些agent节点组成的安装的具体的分布式软件)整合到了dcos中,并且提供了良好的界面和CLI,也继承了许多企业级服务如marathon和chronos等,用dcos来完成mesos的data center功能十分高效便捷。

https://support.mesosphere.com/hc/en-us/articles/205097325-How-is-the-Mesosphere-DCOS-different-from-Apache-Mesos-

DC/OS是运行容器的最好方式

https://mesosphere.com/blog/2016/04/19/open-source-dcos/

mesos可以安装运行各种分布式软件,当然也包括docker,不过在最新的mesos1.0中,mesos也实现了自己的容器化技术,就算不安装docker也可以跑容器了。当然,这些容器化技术大概在2015年都统一了标准,互相兼容的。

mesos的手动配置

按照magnum中的部署mesos环境的步骤,手动配置的话模板里会有以下和mesos相关的参数:

magnum部署mesos的流程

  • 首先准备image文件,在image文件会安装好mesos服务所需的zookeeperd、mesos和marathon服务,以及docker-engine服务。
  • 先启动magnum参数所指定的几个master虚拟机,启动完成后会对master节点的服务进行配置,并且启动这些服务。
  • 然后启动agent节点,启动完成后会在节点内部创建/etc/sysconfig/heat-params文件,然后配置agent节点服务,启动服务,最后要等待执行agent_wc_notify操作,并且设置volume服务。

magnum中coe的设计思路

按照magnum里的coe的设计思路,是希望集群里所需要的软件都在image里安装好,之后只需要根据选项进行配置启动就可以。
那么如果把mesos换成dcos,dcos中涉及到的几十个应用也需要提前安装好,在部署完dcos后也可以随时安装卸载对应应用
这就得舍弃dcos提供的安装流程,相当于舍弃已经整合好的安装脚本,换成手动在magnum里重新实现一遍

dcos的安装流程

说下advanced安装方式,在每个节点进行执行的操作来手动执行

  • 先准备两个文件ip-detectconfig.yaml,检测IP和进行集群的配置
  • 下载安装脚本文件,这个shell文件里,其实除了脚本还包含了压缩包二进制文件
1
$ curl -O https://downloads.dcos.io/dcos/EarlyAccess/commit/14509fe1e7899f439527fb39867194c7a425c771/dcos_generate_config.sh
  • 执行dcos_generate_config.sh脚本文件,默认的参数就是--genconf,生成了安装的配置信息,文件和路径信息就会如下
1
2
3
4
5
6
7
8
9
10
├── dcos-genconf.<HASH>.tar
├── dcos_generate_config.sh
├── genconf
│ ├── serve
│ │ ├── dcos_install.sh
│ ├── config.yaml
│ ├── ip-detect
│ ├── cluster_packages.json
│ ├── ssh_key
│ ├── state
  • 然后执行docker run,这一步会在bootstrap node启动一个nginx的容器服务,映射端口,并且把./genconf/serve/目录映射到nginx容器里的/usr/share/nginx/html,路径映射的结果就是,可以从其他节点访问nginx服务获取serve目录下的文件
1
$ sudo docker run -d -p <your-port>:80 -v $PWD/genconf/serve:/usr/share/nginx/html:ro nginx
  • 剩下的步骤就是登录到各个节点,master和agent节点,下载下来dcos_install.sh,然后执行安装就可以了
    安装时要指定role,即当前机器为哪类节点,支持masterslaveslave_public
1
2
3
4
$ ssh <master-ip>
$ mkdir /tmp/dcos && cd /tmp/dcos
$ curl -O http://<bootstrap-ip>:<your_port>/dcos_install.sh
$ sudo bash dcos_install.sh master
  • 最后一步就是等待安装完成并且各个节点之间同步完成,如何检测状态,查看Exhibitor服务的信息
1
http://<master-ip>:8181/exhibitor/v1/ui/index.html
  • 现在可以启动DCOS的web界面
1
http://<master-node-public-ip>/

bootstrap node

bootstrap节点是干啥的,在安装过程中都会先启动bootstrap node,把要安装的东西压下载到bootstrap node,生成配置文件,然后进行安装。
安装时也会通过某种方式把配置文件和安装脚本拷贝到master或者agent节点去,然后在具体的节点上执行安装。
文档说bootstrap node是集群的永久性节点,但是个人感觉不是必须的,只是集群必须有一个执行安装程序的节点,卸载时也会需要一个节点来跑执行程序,那么就放到了bootstrap node上,然后bootstrap node也提供了界面化的安装和卸载。
如果把安装放到magnum里去做,那么执行安装程序的操作就交给了magnum的HOT去做,拷贝文件也可以由magnum去做,卸载就是直接删除集群节点,整个流程就用不到bootstrap node了。
另外,在dcos官网的design页面看到,components需要提前下载,并且是在bootstrap node下载,并且build完成,打包,然后再copy到master或agent节点去安装。
那么如果修改的话就方便了,因为dcos_install.sh脚本做的工作就是一个下载,解压,修改配置文件和启动服务。之前的操作放置到DIB里去做。

在安装过程中,master节点,agent节点和bootstrap节点都做了什么具体的工作

参照官网文档:https://dcos.io/docs/1.8/overview/architecture/

DC/OS的安装脚本生成流程,以及安装流程

dcos的源码下载下来后,根目录执行build_local.sh

1
2
3
4
5
# Install the DC/OS tools
./prep_local

# Build a release of DC/OS
release create `whoami` local_build

第一步pre_local会执行setuptools的打包脚本,打包出一些需要的命令,比如release命令(python命令)
第二步就正式执行打包命令

  • 下载packages,编译,保存编译结果
  • 把一些模板文件和配置文件初始化
  • 把上述的文件根据Dockerfile,docker build出docker image的tar包
  • 最终把docker image和脚本文件合并成为dcos_generate_config.sh

dcos_generate_config.sh是最初的安装脚本,由脚本和一个docker image二进制数据共同组成。

  • 脚本由dcos_generate_config.sh.in模板生成
  • docker image由配置的各个文件和Dockerfile,一起docker build后进行docker save的一个tar包。所以不能只看tar包信息,需要看docker build前的原始信息。

执行dcos_generate_config.sh --genconf会生成配置文件,这一步会执行docker run,运行的就是docker image里的内容。那么要看如何生成配置文件,就需要看docker image是如何生成的。
dcos_generate_config.sh --genconf在源码中的entry_point是ext/dcos-installer/cli.py:main

综上,要抽出安装脚本中需要的部分:packages文件、配置文件以及安装脚本
其中packages文件要放到DIB中,配置文件无需改动的放到DIB中,安装脚本和部分需要改动的配置文件放在外面
对应到执行命令,就是dcos_generate_config.sh --genconf这个操作时,会变动的配置文件放到外面,其他的放到DIB中

  • 下载dcos源码,从头制作安装文件
    这种需要重新下载和build各个packages包,还要初始化各个配置文件,耗时长,也有很多不确定因素会导致失败
  • 直接下载编译好的dcos_generate_config.sh
    这种需要执行docker run才能生成配置文件,依赖docker,但是解压文件后都是编译好的packages,节省时间,但是下载整个文件也需要花一定时间。

制作DIB

  • 下载dcos_generate_config.sh,执行dcos_generate_config.sh --genconf,生成配置文件
  • 找到安装过程脚本,单独执行,把packages文件和配置文件放置到对应位置,生成DIB

magnum中的可配置文件

  • 找到生成配置文件的脚本,把ip-detect和cloud-config.yaml所影响的配置文件集中放置在magnum中,初始化这些模板文件后,拷贝到对应位置
  • ext/dcos-installer/cli.py:main