基于Ansible+Docker快速实现DCOS云平台部署

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

本文根据DCOS联盟第一期线上分享整理而成

 

讲师介绍   20161124071103745.jpg

刘金烨

数人云运维工程师

 

  • 负责Mesos、Marathon、Docker环境维护,运维自动化建设。

  • 曾任职于金山西山居,拥有丰富的Java开发和运维开发经验。

 

大家好,今天给大家分享自动快速部署DCOS服务相关组件的一些实践。

 

本次分享将包括以下内容:

  1. 云平台部署使用的服务、组件

  2. Docker化服务组件

  3. 初始化安装控制主机

  4. 集群主机系统检测

  5. 使用Ansible初始化集群主机

  6. 使用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 解析相关的配置内容:

20161124071133152.jpg

 

6、MySQL 基于 Consul 的主从切换


最初的MySQL主从切换是基于 haproxy+keepalived 来做高可用的。


这种机制下,MySQL主从切换的简单需求需要引入2个开源组件,架构上也非常复杂。


为了减轻架构复杂度和可维护性,我们将主从切换改为了使用 Consul 进行主从切换。MySQL是安装了两台,一主一从,设置权限时,主是读写的,从是普通用户只读权限。


通过将服务注册到 consul 来做健康检查。


MySQL Master 和 Slave 注册到一共注册四个服务到Consul, 如下代码:

20161124071142928.jpg
正常情况 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的示例

20161124071155217.jpg

 

2、dockerfile 的一些小技巧


docker 镜像的默认启动命令可以是一个自定义的 shell 脚本,例如我们编写一个 entrypoint.sh 脚本,可以在启动脚本中做很多事情,比如初始化服务、拉取配置、替换变量等等。

 

3、Dockerfile示例:Zookeeper


Dockerfile

20161124071213166.jpg
 

Zookeeper启动脚本:

cat /data/run/dataman_zookeeper.sh

 

20161124071222675.jpg

20161124071234934.jpg

 

4、docker build
20161124071414852.jpg

 

5、docker run 


参考 https://docs.docker.com/engine/reference/commandline/run/


20161124071342888.jpg

 

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

https://github.com/Dataman-Cloud/OpenDockerFile
 

四、初始化安装控制主机

 

1、启动test yum repo


启动test yum repo,把 test yum repo 配置到当前主机的/etc/yum.repos.d/test.repo 

配置内容如下:

20161124071437173.jpg
然后就可以很方便的安装一些必要的工具服务。


test yum repo的使用方法

20161124071454343.jpg
 

其中 --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。


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

 

20161124071507632.jpg

20161124071529698.jpg

 

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


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

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

  • 文件系统检测

  • 磁盘容量检测

 

如果检测到的结果异常会跟中止安装。

 

六、初始化集群主机

 

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


包含的内容有:

  • 基础操作
    防火墙、selinux 等

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

  • NTP 客户端 
    设置 ntp 服务

  • Docker
    安装配置等

  • 安装运维调试工具
    出问题检查的各种工具,比如 netstat\dig等

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

 

七、总结

 

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

 

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

  2. 执行安装脚本。

 

这个服务并不是完美的,还有很多可以优化的,比如大数量主机安装的效能问题等,我们会持续对其进行改进。


欢迎大家一起交流、探讨经验。谢谢大家。

 

Q&A  

Q1:现在Docker的版本更新也很快,那数人云是怎么来考虑这个版本的,每次跟着更新,还是延后多少个小版本?

A1:每次Docker更新我们都在在内部进行测试,经过一段时间的验证,没有什么大坑的时候,就更新。没有特定的,延后固定几个版本。

 

Q2:此前看到一篇文章说,Docker是没有后向兼容的,每次更新版本都会非常痛苦。你们是怎么处理这个问题?

A2:这个问题我们也很烦恼,我们是一台一台主机的升级,不会影响业务的正常使用。DCOS集群本身是高可用的,所以宕机1、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集群中。

原文发布时间为:2016-11-24

本文来自云栖社区合作伙伴DBAplus

相关文章
|
23天前
|
存储 测试技术 Linux
【Docker项目实战】使用Docker部署bender个人仪表板
【4月更文挑战第2天】使用Docker部署bender个人仪表板
33 1
|
1月前
|
存储 机器学习/深度学习 中间件
快速上手 Elasticsearch:Docker Compose 部署详解
本文介绍了如何使用Docker Compose快速搭建Elasticsearch学习环境。Elasticsearch是一款用于实时搜索和分析的分布式中间件,适用于多种场景,如搜索、日志分析、机器学习等。首先,创建docker网络,拉取最新版8.12.2镜像。接着,编写docker-compose.yml文件,配置单节点集群,设置端口映射、内存限制及数据卷挂载。然后,创建并配置数据卷目录,允许远程访问和跨域。最后,启动服务并验证,通过浏览器访问确认服务运行正常。本文为初学者提供了一个简便的Elasticsearch部署方法。
171 4
快速上手 Elasticsearch:Docker Compose 部署详解
|
1月前
|
存储 运维 安全
构建高效自动化运维体系:Ansible与Docker的完美结合
【2月更文挑战第31天】 随着云计算和微服务架构的兴起,自动化运维成为保障系统稳定性和提升部署效率的关键手段。本文将详细探讨如何通过Ansible和Docker的结合来构建一个高效、可靠且易于管理的自动化运维体系。首先,介绍自动化运维的必要性及其在现代IT基础设施中的作用;然后,分别阐述Ansible和Docker的技术特点及优势;最后,提供一个基于Ansible和Docker结合使用的实践案例,以及实施过程中遇到的挑战和解决方案。
|
24天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
99 0
|
1天前
|
运维 Linux 虚拟化
Docker详解(三)——Docker安装与部署
Docker详解(三)——Docker安装与部署
29 4
|
2天前
|
测试技术 Linux Docker
【好玩的经典游戏】Docker部署FC-web游戏模拟器
【好玩的经典游戏】Docker部署FC-web游戏模拟器
26 1
|
3天前
|
Ubuntu Linux 测试技术
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试(下)
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试
35 1
|
6天前
|
存储 测试技术 文件存储
【Docker项目实战】使用Docker部署Sun-Panel导航面板
【4月更文挑战第19天】使用Docker部署Sun-Panel导航面板
57 7
|
9天前
|
测试技术 Linux 网络安全
【好玩的开源项目】使用Docker部署SyncTV视频同步和共享平台
【4月更文挑战第16天】使用Docker部署SyncTV视频同步和共享平台
49 1
|
13天前
|
测试技术 Linux 数据安全/隐私保护
【Docker项目实战】使用Docker部署Seatsurfing预订座位系统
【4月更文挑战第12天】使用Docker部署Seatsurfing预订座位系统
38 3