本文根据DCOS联盟第一期线上分享整理而成
刘金烨
数人云运维工程师
负责Mesos、Marathon、Docker环境维护,运维自动化建设。
曾任职于金山西山居,拥有丰富的Java开发和运维开发经验。
- 云平台部署使用的服务、组件
- Docker化服务组件
- 初始化安装控制主机
- 集群主机系统检测
- 使用Ansible初始化集群主机
- 使用Ansible安装、检测DCOS相关服务
一、使用的服务、组件简介
- Ansible 批量管理配置服务
- 初始化主机、批量安装各服务使用
- test yum repo 部署软件包源
- 启动一个简单 http 服务,把安装使用的软件包全放到这个项目中
- Docker 轻量级容器服务
- Cadvisor 监控服务
- test-registry 组件安装使用镜像仓库
- Haproxy 负载均衡组件
- Keepalived 高可用组件
部署在master1 和 master2 两台主机,通过检查这两台主机部署的haproxy进行VIP 漂移。
- MySQL数据库
- 自研组件
- Consul 服务发现、健康检查、健值存储外访问的切换
- Zookeeper Mesos Marathon
- DCOS 核心组件,负责集群资源管理,应用调试
二、主要服务的功能说明及逻辑架构
上面简单介绍了安装整个 DCOS 服务的完整过程,在安装各组件前,我们都会先检测是否已经安装了该服务,如果已经存在会中止安装,人工检查后,再进行后续操作。
1、test yum repo
test-yumrepo 是一个简单的 yum 源服务,里面放置了安装 DOCS 需要使用的所有 rpm 包,使用 createrepo 命令进行创建和更新yum 源。
2、test registry
在安装 DCOS 前会把组件镜像全 push 到 registry ,不设置认证用户,配置申请好的证书。
使用这个 registry 时,只需要添加域名解析就可以。
registry 的数据目录,直接复制目录到其它主机。
再启动 registry 服务容器就可以直接使用,而不需要导入导出浪费时间。
因为 docker 镜像是分层的,不同的镜像,也会共用一些公共的镜像层。
使用这个原理,镜像大多数的服务都使用相同的 base 镜像,这样所有的镜像都放置到 registry 中,就可以减少占用磁盘的容量。
3、自研组件
DCOS 自研的控制界台
4、Consul
用它来做各服务的健康检查、服务发现、MySQL主从切换等。
consul 分为server 和 client ,我们注册、注销服务都是通过 client API 进行,这样的好处是 client 上的主机服务都绑定在 client 端,健康检查也都是通过 client 端进行本地检查。
服务本身的状态查询查询则是通过 Server 端。
consul 的服务发现
consul 有多种服务发现机制,我们使用的是比较简单的 dns 模式,通过 consul 自带的 DNS 解析功能实现的。
各服务安装好后,通过调用 consul 的 API 注册服务。
需要服务发现的组件通过 docker run 参数 添加 `–dns` , 在容器内部就可以解析到 consul 中注册的服务地址 , 例如: 访问数据库的配置就可以设置为 mysql.service.consul:3306, 这样的配置。(当然支持srv 服务可以直接用)
5、Haproxy
haproxy做为平台服务的负载均衡服务,对外服务配置服务时,配置的是 consul 中的服务域名。
这里有个坑,原来使用 haproxy 1.5 版本, 后端服务使用域名时,启动后只解析一次(和nginx类似),这时如果解析到的服务挂掉,访问haproxy页面时会503.
查询官网得知 haproxy 1.6 支持了动态 dns 域名解析的配置,后升级为 haproxy 1.6。
下面是动态 dns 解析相关的配置内容:
6、MySQL 基于 Consul 的主从切换
最初的MySQL主从切换是基于 haproxy+keepalived 来做高可用的。
这种机制下,MySQL主从切换的简单需求需要引入2个开源组件,架构上也非常复杂。
为了减轻架构复杂度和可维护性,我们将主从切换改为了使用 Consul 进行主从切换。MySQL是安装了两台,一主一从,设置权限时,主是读写的,从是普通用户只读权限。
通过将服务注册到 consul 来做健康检查。
MySQL Master 和 Slave 注册到一共注册四个服务到Consul, 如下代码:
正常情况 mysql-vip.service.consul 解析到 主mysql ip。
这里会分两种情况切换到从解析:
- 主MySQL挂掉后,ip解析到从mysql ip,mysql-vip 切换到从Mysql IP
- 主库的 consul 挂掉也会导致服务无法解析,即使 mysql-master 正常,所以如果 consul 挂掉也会被激活切换。
请注意:因为MySQL从是只读的,相当于降级服务。
7、Zookeeper Mesos Marathon
参考以前写的文章:容器公司如何用容器进行产品迭代
http://blog.dataman-inc.com/shurenyun-docker-164/
三、Docker化服务
1、dockerfile语法
dockerfile 的语法比较简单,类似shell, 常用的命令主要有:
- FROM 依赖的基础镜像
- RUN 执行的shell命令
- ADD 添加本地文件目录或下载网络中的文件并且解压到镜像中
- COPY 复制本地文件或目录到镜像中
- ENTRYPOINT docker容器启动时的默认命令
- CMD docker容器启动时的默认参数
参考:https://docs.docker.com/engine/reference/builder/
下面是dockerfile的示例
2、dockerfile 的一些小技巧
docker 镜像的默认启动命令可以是一个自定义的 shell 脚本,例如我们编写一个 entrypoint.sh 脚本,可以在启动脚本中做很多事情,比如初始化服务、拉取配置、替换变量等等。
3、Dockerfile示例:Zookeeper
Dockerfile
Zookeeper启动脚本:
cat /data/run/dataman_zookeeper.sh
4、docker build
5、docker run
参考 https://docs.docker.com/engine/reference/commandline/run/
6、数人云开放的一些服务的 Dockerfile
https://github.com/Dataman-Cloud/OpenDockerFile
四、初始化安装控制主机
1、启动test yum repo
启动test yum repo,把 test yum repo 配置到当前主机的/etc/yum.repos.d/test.repo
配置内容如下:
然后就可以很方便的安装一些必要的工具服务。
test yum repo的使用方法
其中 –disablerepo=\* 是禁用其它 yum repo, –enablerepo=repo 是开启数人云 testrepo ,这样做是为了防止其它 的yum repo 影响 yum 安装 的过程,减少出错。
2、安装需要使用的基础服务
安装需要部署DOCS需要使用的服务,和一些调试工具
yum –disablerepo=\* –enablerepo=testrepo install -y net-tools iptables ansible 等。
修改 NTP server 的配置。
3、启动安装集群组件使用的镜像仓库test-registry服务
五、集群主机系统安装前配置及检测
安装机准备好 yum repo 和 test registry, 我们就可以准备安装 DCOS集群了。
安装前我们会先检测当前安装机的服务是否是我们要求的主机状态,检查包括:
- yum repo 状态正常
- test registry 状态正常
- NTP server 状态正常
然后修改ansible 配置ansible/inventory/hosts。
规划好主机列表及角色,内容示例如下:
修改自定义的主配置文件config.cfg,这个配置中主要包含了,集群使用的 DCOS master 列表,mysql 主机、用户、初始密码,Keepalived 主机、VIP地址,以后面各服务就从这两个配置中读取内容生成最终配置,再进行安装。
在安装服务前会检测各主机:
- 系统版本、内核版本检测
- 文件系统检测
- 磁盘容量检测
如果检测到的结果异常会跟中止安装。
六、初始化集群主机
前面的初步检测步骤通过后,我们就会对集群主机进行初始化操作。
包含的内容有:
- 基础操作
防火墙、selinux 等 - 主机名
设置主机机名解析 - NTP 客户端
设置 ntp 服务 - Docker
安装配置等 - 安装运维调试工具
出问题检查的各种工具,比如 netstat\dig等 - 主机初始化后的环境检查
以上初始化的检查
七、总结
最终我们通过 Ansible 完成了将整套的分布式部署抽象成了两步完成:
- 在一个配置文件中配置整套安装方案的服务;
- 执行安装脚本。
这个服务并不是完美的,还有很多可以优化的,比如大数量主机安装的效能问题等,我们会持续对其进行改进。
欢迎大家一起交流、探讨经验。谢谢大家。
评论前必须登录!
注册