閱讀969 返回首頁    go 技術社區[雲棲]


基於Ansible+Docker快速實現DCOS雲平台部署

本文根據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


參考以前寫的文章:容器公司如何用容器進行產品迭代
https://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

最後更新:2017-05-11 12:02:00

  上一篇:go  容器,你還隻用Docker嗎?(上)
  下一篇:go  負載均衡(SLB)使用最佳實踐.