如何让 Ansible 和 Docker 让你愉快的控制力地在一起

请登录查看
上章「」冻仁简化了建置 (build) image 的流程,虽可降低维护成本,但是当维护的 image 一多,就显得开发机不够力。一般企业内部会自行架设 Jenkins CI 或 GitLab CI 等服务,把建置 images 的工作移至 build server 上。以下冻仁将借由&chusiang/vim-and-vi-mode&image 讲解 Docker Hub 的 Auto-build 技巧。Docker Hub 是什么?&是官方维护的 image 市集 (marketplace)。我们可以在网站上取得 Ubuntu, Nginx, MySQL 等官方和社群成员所维护的 image。chusiang/vim-and-vi-mode 是什么?chusiang/vim-and-vi-mode&是借由 Dockerfile 和&chusiang.vim-and-vi-mode&role 建置的 Docker image,上章已提过该 Role,在此就不多加详述。Docker Hub:&Galaxy:&GitHub:&目前支持的 Linux发行版本有:ubuntu14.04, lastestubuntu16.04debian7debian8centos6centos7怎么在 Docker Hub 自动建置 Docker image?建立 Dockerfile&的前置作业冻仁已在上章介绍过,这里就不多提了。登入 Docker Hub。点击右上角的&Create (建立),并点击&Create Automated Build (自动建置)。&选择 GitHub。&找到要 Auto-build 的 GitHub repository。选择好 repository 后,可以在&Name&一栏设定名称。&注意!按下送出后就不能变更名称了!进入&Build Settings&页面设置 build image 相关设定。&Type:依 branch 或 tag 进行建置。Name:设置 branch 和 tag 的名称。Dockerfile Location:Dockerfile 的存放路径。Docker Tag Name:设置 Docker tag 名称。在还末推送提交 (push commit) 之前,可先藉由右方的 Trigger 进行手动 build image。在&Build Details&页面里可以观看建置状态。&在&Tags&页面可以看到这个 image 有哪些 tag 可以用。&在&Dockerfile&页面可以看到内容与上章介绍的雷同。&现在,我们可以从&Docker Pull Command&取得下载 image 的指令,并可从&Source Repository&取得原始码。&以上就是 Docker Hub 的 Auto-build 设置。现在我们除了可以用一份 Ansible Roles 进行组态设定,还可以从 Docker Hub 取得 build 好的 Docker image,真是一举两得啊!后话自从有了这些 Docker images,不管是自己要跨 Linux 平台测环境,还是帮&&社群成员的 vimrc 除错都有很大的帮助呢!相关连结
意见反馈:
联系方式:
广告等垃圾信息
不友善内容
违反法律法规的内容
不宜公开讨论的政治内容基于Ansible+Docker快速实现DCOS云平台部署
本文根据DCOS联盟第一期线上分享整理而成
数人云运维工程师
负责Mesos、Marathon、Docker环境维护,运维自动化建设。
曾任职于金山西山居,拥有丰富的Java开发和运维开发经验。
大家好,今天给大家分享自动快速部署DCOS服务相关组件的一些实践。
本次分享将包括以下内容:
云平台部署使用的服务、组件
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 自研的控制界台
用它来做各服务的健康检查、服务发现、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./shurenyun-docker-164/
三、Docker化服务
1、dockerfile语法
dockerfile 的语法比较简单,类似shell, 常用的命令主要有:
FROM 依赖的基础镜像
RUN 执行的shell命令
ADD 添加本地文件目录或下载网络中的文件并且解压到镜像中
COPY 复制本地文件或目录到镜像中
ENTRYPOINT docker容器启动时的默认命令
CMD docker容器启动时的默认参数
参考:/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&
参考 /engine/reference/commandline/run/
6、数人云开放的一些服务的 Dockerfile
/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 服务
安装配置等
安装运维调试工具
出问题检查的各种工具,比如 netstat\dig等
主机初始化后的环境检查
以上初始化的检查
最终我们通过 Ansible 完成了将整套的分布式部署抽象成了两步完成:
在一个配置文件中配置整套安装方案的服务;
执行安装脚本。
这个服务并不是完美的,还有很多可以优化的,比如大数量主机安装的效能问题等,我们会持续对其进行改进。
欢迎大家一起交流、探讨经验。谢谢大家。
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集群中。
数据连接未来
DBAplus社群:数据连接未来!围绕数据库、大数据、PaaS云,顶级大咖、技术干货,每天精品原创文章推送、每周线上技术分享、每月线下技术沙龙,场场爆满、受众过十万,成为运维圈最专注围绕“数据”的学习交流和专业社群!
原创投稿 | 推广合作 | 媒体合作 | 资源对接 联系人:林禹廷 电话: QQ:
扫码关注加入各城市微群无法docker化的企业福音:K8S+Ansible跑在Windows/Unix上
无法docker化的企业福音:K8S+Ansible跑在Windows/Unix上
空幻第一情
不要方!kansible来了!谁说Kubernetes一定需要Docker?无法docker化的企业的福音来了,用K8S和Ansible在Windows和Unix上编排操作系统。那么,什么是kansible呢?kansible是一个可以在任意版本的安装使用Ansible的Windows或者Unix上面运行本地操作系统的进程的简单工具,然后进程就可以通过Kubernetes编排,伸缩和负载平衡。它可以允许你使用Ansible所有的功能通过可重用剧本(比如,安装一个JVM,设置用户和文件权限,或者随便什么其它的)来安装和配置软件。 再加上你开始着手使用Kubernetes,来管理你所有的Docker容器和本地操作系统进程。这样,你也能通过Kubernetes享受到运行微服务的优点。服务发现和负载均衡手动和自动缩放的高可得性健康监测与自动重启,以及准备检查(为了保持负载均衡是正确的)集中日志,度量和警报一致的控制台,CLI和REST API通过Kansible和Docker容器跨进程运行。Demo视频/iframe/preview.html?vid=a0198jlfgum&width=500&height=375&auto=0展示在Kubernetes上使用fabric8开发者控制台,展示Kansible是如何起作用的~我们正在查看在JBoss Fuse7.X中使用Kansible,所以我们可以提供一个一致的微服务平台,基于fabric8,不管顾客用的是Windows还是任意Unix,也不管他们有没有使用Docker。当然我们希望有更多本地Kubernetes支持非Docker和其它平台。比如,现在有一个在Windows本地使用Kubernetes kubelet的demo,点击查看:/watch?v=f8irBJouoYs。如果有一天kubelet能够在Windows或者任意unix上创建本地操作系统,那就太棒了!关于Kansible的更多信息Kansible文档:/fabric8io/kansible/blob/master/README.mdDemo例子:/fabric8io/kansible#fabric8-ansible-hawtapp如何使用fabric8开发者控制台:http://fabric8.io/guide/console.html
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
空幻第一情
百家号 最近更新:
简介: 我欲乘风破浪,踏遍黄沙海洋
作者最新文章标签:至少1个,最多5个
最近,花了很大的兴趣在组合使用 Ansible 和 Docker上。所以我想这可以很好的描述一些技巧。
开始,安装 Docker。如果你已经安装了 Ansible 。
已经编写了一个在 Ubuntu 出色的安装 Docker 的工具,即使在内部实现,它也比官方安装指令容易。
如果我们在 Ubuntu 13.10 上启动,并且只从开发分支上运行 Ansible,而不安装它。步骤如下:
apt-get update
apt-get install git python-yaml python-jinja2 python-pycurl
git clone /ansible/ansible.git
cd ansible
source ./hacking/env-setup
从那里,我们可以使用 Paul 已经上传到 Galaxy 的
角色。因此我们可以使用一个简单的 CLI 调用下载它。
ansible-galaxy install angstwad.docker_ubuntu
并且通过在 /etc/ansible/hosts 创建一个 stub inventory 文件,写一个简单的 playbook 来使用它。
并且一个非常简单的 playbook 调用它,/tmp/docker.yml :
- hosts:local
connection: local
- angstwad.docker_ubuntu&/code&
现在我们将调用 Ansible 来启动 Docker:
ansible-playbook /tmp/docker.yml
docker pull ubuntu
现在,一切都变得非常简单。但是让我感兴趣的部分是如何使用 Ansible 用最简单的方式来构建 docker-files 。我们一直喜欢的一件事就是自动化的便携式描述。并且使得比开发 bash 更加有效率。
这里有一个在 Docker 文件中使用 Ansible 的简单例子,因此我们可以在 Ansible 中编写复杂的自动化。而不是编写一份 Docker 命令以及 shell 脚本的大杂烩。允许我们的应用部署就像把他们部署在经典的虚拟服务器上。
我们的 Dockerfile 像如下简单,在 /tmp/build/Dockerfile:
FROM ubuntu
MAINTAINER yourname
RUN apt-get -y update
RUN apt-get install -y python-yaml python-jinja2 git
RUN git clone /ansible/ansible.git /tmp/ansible
WORKDIR /tmp/ansible
ENV PATH /tmp/ansible/bin:/sbin:/usr/sbin:/usr/bin
ENV ANSIBLE_LIBRARY /tmp/ansible/library
ENV PYTHONPATH /tmp/ansible/lib:$PYTHON_PATH
RUN git clone /yourusername/yourrepo.git /tmp/example
ADD inventory /etc/ansible/hosts
WORKDIR /tmp/examples
RUN ansible-playbook site.yml -c local
EXPOSE 22 3000
ENTRYPOINT [“/usr/bin/foo”]
与你的 Dockerfile 一起的一个文件名字为 inventory:
因此,像这样构建:
docker build .
现在读者可以非常容易的适应各种方法。但是最明显的事情或许是打开不同的端口 或者是运行不同的 entry point 。git
检出文件可能被忽略,并且被替换成 "ADD" 命令获得更加大的效率。
这里最妙的是哪部分? 是你的 playbook 能干任何事情,并且做任何重的事情。
下一步要做的更加具有逻辑的事情是用 Docker 分发你的容器,这个可以通过在 Ansbible 核心的 Docker 模块来实现。最好的经验,我们建议使用开发分支的 Ansible 预览版本,它支持最新版本的 Docker。
在这里看 Docker 模块的文件以及能力
非常感谢 Cove Schneider 和 Pavel Antonov 开发的这个模块。
因此,结合 Ansbile 和 Docker ,只需要稍加挖掘,你能看到,你不仅能使用 Ansbile 管理你的容器构建进程,而且可以决定什么容器应该运行在哪里。
我希望这篇文章能帮助在探索文件的构建方面使事情更加简单。如果你想少一点手工组合,你也可以像这样组合
和 Docker。
注: Packer 是一个通过一个源文件跨平台构建同样镜像的工具
Related News
0 收藏&&|&&8
你可能感兴趣的文章
11 收藏,5.1k
22 收藏,3.5k
分享到微博?
技术专栏,帮你记录编程中的点滴,提升你对技术的理解收藏感兴趣的文章,丰富自己的知识库
明天提醒我
我要该,理由是:

我要回帖

更多关于 让你愉快的控制力 的文章

 

随机推荐