数人云工程师手记 | 双剑合璧,分布式部署两步走

今天小数给你们带来的是数人云工程师金烨的分享,有关于自动快速部署DCOS服务相关组件的一些实践。
当Ansible与Docker相遇,双剑合璧,一切变得如此简单有趣。mysql

本次分享将包括如下内容:linux

  • 云平台部署使用的服务、组件nginx

  • Docker化服务组件git

  • 初始化安装控制主机github

  • 集群主机系统检测sql

  • 使用Ansible初始化集群主机docker

  • 使用Ansible安装、检测DCOS相关服务shell

1、使用的服务、组件简介

  • Ansible 批量管理配置服务数据库

  • 初始化主机、批量安装各服务使用后端

  • test yum repo 部署软件包源

  • 启动一个简单 http 服务,把安装使用的软件包全放到这个项目中

  • Docker 轻量级容器服务

  • Cadvisor 监控服务

  • test-registry 组件安装使用镜像仓库

  • Haproxy 负载均衡组件

  • Keepalived 高可用组件

部署在master1 和 master2 两台主机,经过检查这两台主机部署的haproxy进行VIP 漂移。

  • MySQL数据库

  • 自研组件

  • Consul 服务发现、健康检查、健值存储外访问的切换

  • Zookeeper Mesos Marathon

  • DCOS 核心组件,负责集群资源管理,应用调试

2、主要服务的功能说明及逻辑架构

上面简单介绍了安装整个 DCOS 服务的完整过程,在安装各组件前,咱们都会先检测是否已经安装了该服务,若是已经存在会停止安装,人工检查后,再进行后续操做。

一、test yum repo

test-yumrepo 是一个简单的 yum 源服务,里面放置了安装 DOCS 须要使用的全部 rpm 包,使用 createrepo 命令进行建立和更新yum 源。

二、test registry

在安装 DCOS 前会把组件镜像全 push 到 registry ,不设置认证用户,配置申请好的证书。

使用这个 registry 时,只须要添加域名解析就能够。

registry 的数据目录,直接复制目录到其它主机。

再启动 registry 服务容器就能够直接使用,而不须要导入导出浪费时间。

由于 docker 镜像是分层的,不一样的镜像,也会共用一些公共的镜像层。

使用这个原理,镜像大多数的服务都使用相同的 base 镜像,这样全部的镜像都放置到 registry 中,就能够减小占用磁盘的容量。

三、自研组件

DCOS 自研的控制界台

四、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 服务能够直接用)

五、Haproxy

haproxy作为平台服务的负载均衡服务,对外服务配置服务时,配置的是 consul 中的服务域名。

这里有个坑,原来使用 haproxy 1.5 版本, 后端服务使用域名时,启动后只解析一次(和nginx相似),这时若是解析到的服务挂掉,访问haproxy页面时会503.
查询官网得知 haproxy 1.6 支持了动态 dns 域名解析的配置,后升级为 haproxy 1.6。

下面是动态 dns 解析相关的配置内容:

图片描述

六、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从是只读的,至关于降级服务。

七、Zookeeper Mesos Marathon

参考之前写的文章:容器公司如何用容器进行产品迭代
http://blog.dataman-inc.com/s...

3、Docker化服务

一、dockerfile语法

dockerfile 的语法比较简单,相似shell, 经常使用的命令主要有:

  • FROM 依赖的基础镜像

  • RUN 执行的shell命令

  • ADD 添加本地文件目录或下载网络中的文件而且解压到镜像中

  • COPY 复制本地文件或目录到镜像中

  • ENTRYPOINT docker容器启动时的默认命令

  • CMD docker容器启动时的默认参数

参考:https://docs.docker.com/engin...

下面是dockerfile的示例

图片描述

二、dockerfile 的一些小技巧

docker 镜像的默认启动命令能够是一个自定义的 shell 脚本,例如咱们编写一个 entrypoint.sh 脚本,能够在启动脚本中作不少事情,好比初始化服务、拉取配置、替换变量等等。

三、Dockerfile示例:Zookeeper

Dockerfile
图片描述

Zookeeper启动脚本:
cat /data/run/dataman_zookeeper.sh

图片描述
图片描述

四、docker build

图片描述

五、docker run

参考 https://docs.docker.com/engin...
图片描述

六、数人云开放的一些服务的 Dockerfile

https://github.com/Dataman-Cl...

4、初始化安装控制主机

一、启动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 安装 的过程,减小出错。

二、安装须要使用的基础服务

安装须要部署DOCS须要使用的服务,和一些调试工具
yum --disablerepo=* --enablerepo=testrepo install -y net-tools iptables ansible 等。

修改 NTP server 的配置。

三、启动安装集群组件使用的镜像仓库test-registry服务

5、集群主机系统安装前配置及检测

安装机准备好 yum repo 和 test registry, 咱们就能够准备安装 DCOS集群了。

安装前咱们会先检测当前安装机的服务是不是咱们要求的主机状态,检查包括:

  • yum repo 状态正常

  • test registry 状态正常

  • NTP server 状态正常

而后修改ansible 配置ansible/inventory/hosts。

规划好主机列表及角色,内容示例以下:

图片描述

修改自定义的主配置文件config.cfg,这个配置中主要包含了,集群使用的 DCOS master 列表,mysql 主机、用户、初始密码,Keepalived 主机、VIP地址,之后面各服务就从这两个配置中读取内容生成最终配置,再进行安装。

在安装服务前会检测各主机:

  • 系统版本、内核版本检测

  • 文件系统检测

  • 磁盘容量检测

若是检测到的结果异常会跟停止安装。

6、初始化集群主机

前面的初步检测步骤经过后,咱们就会对集群主机进行初始化操做。

包含的内容有:

  • 基础操做
    防火墙、selinux 等

  • 主机名
    设置主机机名解析

  • NTP 客户端
    设置 ntp 服务

  • Docker
    安装配置等

  • 安装运维调试工具
    出问题检查的各类工具,好比 netstatdig等

  • 主机初始化后的环境检查
    以上初始化的检查

7、总结

最终咱们经过 Ansible 完成了将整套的分布式部署抽象成了两步完成:

  • 在一个配置文件中配置整套安装方案的服务;

  • 执行安装脚本。

这个服务并非完美的,还有不少能够优化的,好比大数量主机安装的效能问题等,咱们会持续对其进行改进。

欢迎你们一块儿交流、探讨经验。谢谢你们。

Q&A

Q1:如今Docker的版本更新也很快,那数人云是怎么来考虑这个版本的,每次跟着更新,仍是延后多少个小版本?
A1:每次Docker更新咱们都在在内部进行测试,通过一段时间的验证,没有什么大坑的时候,就更新。没有特定的,延后固定几个版本。

Q2:此前看到一篇文章说,Docker是没有后向兼容的,每次更新版本都会很是痛苦。大家是怎么处理这个问题?
A2:这个问题咱们也很烦恼,咱们是一台一台主机的升级,不会影响业务的正常使用。DCOS集群自己是高可用的,因此宕机一、2台也不会有问题。

(承接上一问)
Q3:通常来讲,DCOS集群咱们都建议上百台主机,那一个DCOS集群升级一次大概要耗时多久?
A3:升级的话,提早规划,按应用或集群的角色划分好批次 好比说 Master不能同时升级,两个MySQL主从不能同时升级,Elasticsearh 集群不能同时升级等 提早进行docker pull 预热 100台主机,完整升级一次预计要半小时左右。这个半小时不包含准备时间。

Q4:大家docker volume怎么解决的?
A4:例如MySQL这种须要持久化数据 的服务,咱们是发到固定主机。若是是Elasticsearch,这种自己已经有数据同步的服务,咱们是直接挂载出来,指定一个主机范围。

Q5:能分享下数人云在DCOS+DevOps方面的经验么?A5:此次分享的集群安装就是咱们DevOps的一部分,咱们的应用和组件都是Docker化的,使用ansible docker run或调用marathon api 进行、更新发布应用,平时的工做主机就是Docker化服务和把这些服务发到DCOS集群中。

相关文章
相关标签/搜索