如何使用Azure Container Service Engine在Azure中國區部署容器服務(一):DC/OS篇
前言
什麼是Azure Container Service(簡稱ACS)
目前越來越多的企業正在嘗試使用容器來構建他們的服務,他們或者在自己的本地資料中心搭建基於容器的叢集,或者利用公有云來承載基於容器和微服務的叢集架構,然而很多企業發現搭建一套能夠適用於生產環境的容器叢集並不是一件容易的事情。容器服務叢集所帶來的高密度和高複雜性的分散式運算使得傳統的IT管理和運維手段變得非常的低效。
ACS是微軟在2015年12月推出的一項基於容器的雲端PaaS服務。ACS的誕生就是為了給企業提供一套經過優化的,可適用於生產環境的,配置簡單的基於開源編排框架來簡化企業部署容器叢集的複雜程度。ACS engine是微軟提供的一個 “轉換器” ,使用者只需要配置幾個簡單的引數來描述容器叢集的規格,然後ACS engine就可以將這個 “叢集規格說明” 文件轉化成ARM模板來自動化地在Azure公有云上生成容器叢集。
ACS完全基於開源元件,目前ACS支援主流的編排框架有:DC/OS,Swarm,Kubernetes。ACS engine也已經在GitHub上開源(
DC/OS介紹
DC/OS是一套企業級的容器編排框架,它不僅支援Docker映象,同時也支援其他的映象格式。DC/OS已經被很多著名的公司使用,包括Twitter,Apple,Yelp等等。Azure DC/OS是微軟和Mesosphere公司聯合開發的分散式容器解決方案。基於這套方案可以為企業帶來很多的便利:
* 高可用性 – 基於Marathon編排演算法,保證服務的高可用性
* 定製化部署方案 – 方便使用者將容器部署到指定的環境中
* 服務發現/負載均衡 – 靈活的服務發現和負載均衡機制,滿足業務的彈性擴充套件
* 服務狀態監測 – 實時服務健康狀態監測,保證服務隨時可用
* 灰度釋出 – 實現新舊版本服務的平滑升級和回滾
* 豐富的UI和API介面 – 支援CLI和REST API
ACS Engine架構解讀
首先我們可以看一下acs engine的架構圖(以DCOS為例):
ACS engine是一個ARM模板生成器,通過acs engine我們可以將預先配置好的叢集描述檔案轉化成一組ARM模板,然後通過azure提供的CLI命令,可以將這組模板部署到Azure上面。下面是一個DC/OS叢集描述檔案的例子:
{ "apiVersion": "vlabs", "properties": { "orchestratorProfile": { "orchestratorType": "DCOS" }, "masterProfile": { "count": 1, "dnsPrefix": "", "vmSize": "Standard_D2_v2" }, "agentPoolProfiles": [ { "name": "agentprivate", "count": 3, "vmSize": "Standard_D2_v2" }, { "name": "agentpublic", "count": 3, "vmSize": "Standard_D2_v2", "dnsPrefix": "", "ports": [ 80, 443, 8080 ] } ], "linuxProfile": { "adminUsername": "azureuser", "ssh": { "publicKeys": [ { "keyData": "" } ] } } } }
其中幾個比較關鍵的引數:
- orchestratorType:用來指定編排器的型別,可選DCOS,Swarm和Kubernetes。這個例子中我們使用DCOS。
- masterProfile:指定DCOS叢集中master節點的數量和配置
- dnsPrefix用來指定master節點的名稱,這個名稱加上azure的固有後綴就組成了訪問這臺master節點的名稱。比如我們指定dnsPrefix為“master-01”,叢集部署成功後我們就可以使用“master-01..cloudapp.chinacloudapi.cn”這個域名來訪問master節點了。
- count: master節點的數量,一般選擇奇數個,這裡我們指定1個master
- vmSize:指定虛機的規格
- agentPoolProfiles:指定DCOS叢集中agent節點的數量和硬體配置
- ssh/publicKeys/keyData:這個欄位用來指定ssh的證書,叢集建立好以後可以通過這個證書訪問叢集節點。
配置好以上幾個引數後就可以使用acsengine來生成我們需要的ARM模板了,在生成模板之前,讓我們看一下acs原始碼的大致目錄結構,加深一下對acs engine的印象:
- docs目錄存放了如何使用acs engine的介紹,包括如何使用acsengine生成ARM模板,如何使用客戶端工具去連線部署好的容器叢集等等。
- examples目錄包含了很多的叢集描述檔案,使用者可以根據需要來選擇不同規格的叢集,比如小到1個master和3個agent的小規模叢集和大到1000個以上節點的大規模叢集。
- parts目錄包含了很多用來生成ARM模板的 “片段” ,這些 “片段” 主要分為幾類:
- 用來初始化基礎計算資源的指令碼 - 這類指令碼主要的作用是根據叢集描述檔案中定義的叢集拓撲結構來生成各種虛機,儲存,虛擬網路,公共IP和安全組策略等。
- 用來初始化計算節點服務的指令碼 - 這類指令碼會在基礎計算資源建立好以後在每個計算節點執行。比較典型的指令碼就是下載DCOS相關的依賴元件,然後在系統初始化的時候進行安裝和配置。
- pkg目錄包含了acsengine的核心邏輯,其中最主要的是engine.go模組,它通過使用者指定的叢集描述檔案來在“parts”目錄中選擇相應的ARM模板片段,然後將這些片段“組裝”起來生成一個完整的ARM模板並輸出到_output目錄中。
- script目錄包含了一些如何利用docker來執行acsengine的指令碼,讓使用者更加方便地使用。
- test目錄存放了測試相關的一些資料。
部署準備
由於DCOS在部署的過程中需要從Azure CDN上下載安裝依賴,而由於國內防火牆的問題,Azure CDN目前在國內無法訪問,所以我們需要手動修改一下dcosprovison.sh這個指令碼,將安裝依賴的選項修改到國內,這樣安裝過程才能順利執行。具體的修改流程如下:
開啟parts/dcosprovision.sh指令碼:
#!/bin/bash
MESOSDIR=/var/lib/mesos/dl
mkdir $MESOSDIR
# load the env vars
. /etc/mesosphere/setup-flags/bootstrap-id
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/bootstrap.tar.xz https://dcosio.azureedge.net/dcos/testing/bootstrap/${BOOTSTRAP_ID}.bootstrap.tar.xz &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/bootstrap.tar.xz https://az837203.vo.msecnd.net/dcos/testing/bootstrap/${BOOTSTRAP_ID}.bootstrap.tar.xz &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/d.deb https://az837203.vo.msecnd.net/dcos-deps/docker-engine_1.11.2-0~xenial_amd64.deb &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/1.deb https://az837203.vo.msecnd.net/dcos-deps/libipset3_6.29-1_amd64.deb &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/2.deb https://az837203.vo.msecnd.net/dcos-deps/ipset_6.29-1_amd64.deb &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/3.deb https://az837203.vo.msecnd.net/dcos-deps/unzip_6.0-20ubuntu1_amd64.deb &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/4.deb https://az837203.vo.msecnd.net/dcos-deps/libltdl7_2.4.6-0.1_amd64.deb &
wait
for i in {1..300}; do
dpkg -i $MESOSDIR/{1,2,3,4}.deb
if [ "$?" = "0" ]
then
echo "succeeded"
break
fi
sleep 1
done
ROLESFILECONTENTS
修改紅色的部分為:
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/bootstrap.tar.xz http://acsengine.blob.core.chinacloudapi.cn/dcos/${BOOTSTRAP_ID}.bootstrap.tar.xz &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/d.deb http://acsengine.blob.core.chinacloudapi.cn/dcos/docker-engine_1.11.2-0~xenial_amd64.deb &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/1.deb http://acsengine.blob.core.chinacloudapi.cn/dcos/libipset3_6.29-1_amd64.deb &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/2.deb http://acsengine.blob.core.chinacloudapi.cn/dcos/ipset_6.29-1_amd64.deb &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/3.deb http://acsengine.blob.core.chinacloudapi.cn/dcos/unzip_6.0-20ubuntu1_amd64.deb &
curl -fLsSv --retry 20 -Y 100000 -y 60 -o $MESOSDIR/4.deb http://acsengine.blob.core.chinacloudapi.cn/dcos/libltdl7_2.4.6-0.1_amd64.deb &
修改過後我們就可以開始編譯部署了。
部署流程
編譯生成acsengine
Windows環境
- 安裝軟體
- Git for Windows.
- Go for Windows.
- Powershell
- 編譯步驟
- 新建GO工作目錄,比如c:\gopath
- 執行Win+R,開啟命令視窗,執行“rundll32 sysdm.cpl,EditEnvironmentVariables”命令開啟系統環境變數設定視窗
- 將c:\go\bin加入到PATH環境變數中
- 新建GOPATH環境變數,並將路徑指向剛剛新建的c:\gopath目錄
- 開啟命令列視窗,將工作目錄定位到c:\gopath
- 執行go get github.com/Azure/acs-engine命令將acsengine程式碼下載到本地目錄中
- 執行go get all命令獲取依賴項
- 參考上個章節中的介紹,修改dcosprovision.sh指令碼,將AzureCDN的依賴選項改到國內可以訪問的地址。
- 執行go build命令編譯生成acsengine
- 安裝軟體
OS X/linux
- 安裝軟體
- Go for OS X/Linux.
- 編譯步驟:
- 新建gopath目錄: mkdir $HOME/gopath
- 設定path環境變數
- 新建$HOME/.sh_profile檔案,新增下面的內容
- export PATH=$PATH:/usr/local/go/bin
- export GOPATH=$HOME/gopath
- 啟用配置 source $HOME/.sh_profile
- 執行go get github.com/Azure/acs-engine命令獲取acsengine程式碼到本地目錄
- 執行go get all命令獲取依賴項
- 參考上個章節中的介紹,修改dcosprovision.sh指令碼,將AzureCDN的依賴選項改到國內可以訪問的地址。
- 執行go build命令編譯生成acsengine
- 安裝軟體
編譯成功後,acs-engine就會生成了,如下圖:
編輯examples/dcos.json叢集描述檔案
開啟examples/dcos.json,將空白處的masterProfile/dnsPrefix, agentPoolProfiles/dnsPrefix,ssh/publickeys/keydata分別填入相應的引數,例如:
開啟examples/dcos.json,將空白處的masterProfile/dnsPrefix, agentPoolProfiles/dnsPrefix,ssh/publickeys/keydata分別填入相應的引數,例如:
{
"apiVersion": "vlabs",
"properties": {
"orchestratorProfile": {
"orchestratorType": "DCOS"
},
"masterProfile": {
"count": 1,
"dnsPrefix": "test-master1",
"vmSize": "Standard_D2_v2"
},
"agentPoolProfiles": [
{
"name": "agentprivate",
"count": 3,
"vmSize": "Standard_D2_v2"
},
{
"name": "agentpublic",
"count": 3,
"vmSize": "Standard_D2_v2",
"dnsPrefix": "test-agent1",
"ports": [
80,
443,
8080
]
}
],
"linuxProfile": {
"adminUsername": "azureuser",
"ssh": {
"publicKeys": [
{
"keyData": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx(SSH公鑰)"
}
]
}
}
}
}
標紅的地方就是需要修改的地方。
執行acsengine生成ARM模板
執行acs-engine examples/dcos.json,相應的ARM模板就會在_output目錄中生成,如下圖:
azuredeploy.json是核心的ARM模板,azuredeploy.parameters.json是對應的配置引數。
至此為止,ace engine的任務就圓滿結束了,接下來就需要將生成好的ARM模板部署到Azure上面了。
利用Azure CLI命令部署DCOS叢集
- 登入Azure中國區
azure login –e AzureChinaCloud
- 設定azure cli的模式為arm
azure config mode arm
- 建立資源組(叢集中的所有資源都會在這個資源組中建立)
azure group create --name="<resource_group_name>" --location="<location>", 這裡的location可選china north或者china east.
- 部署DCOS叢集
azure group deployment create --name="<deployment_name>" --resource-group="<resource_group_name>" --template-file="./azuredeploy.json" --parameters-file="./azuredeploy.parameters.json"
部署成功以後,訪問azure.cn的門戶預覽介面,可以看到DCOS已經啟動,這個叢集具有一個master節點和兩個vmss(虛擬機器規模集)
通過ssh tunnel訪問DCOS叢集master節點
在azure門戶預覽中,點選下圖中紅色框中的內容,在彈出的介面中拷貝masterFQDN,這個地址就是我們稍等要訪問的地址。
開啟terminal,執行以下命令建立一個ssh tunnel
sudo ssh -L 80:localhost:80 -f -N @ -p 2200
username就是我們在叢集描述檔案中的adminUsername
masterFQDN就是剛才我們在門戶預覽中複製的地址開啟本地瀏覽器訪問http://localhost,如果能顯示下面的介面就表示已經建立成功了
如果我們想部署一個簡單的hello-world容器服務的話,可以點選“Services”,然後點選“Deploy Service”
設定需要部署的服務的id為“helloworld”,然後點選“Container Settings”,在彈出的介面中設定需要部署的docker映象的名稱
點選“Deploy”後並部署成功後,點選“helloworld”服務,就可以檢視部署的服務的詳細資訊了
具體的DCOS的使用細節可以參考其官方文件,這裡就不多贅述了。
通過ssh tunnel訪問DCOS叢集master節點
- 在azure門戶預覽中,點選下圖中紅色框中的內容,在彈出的介面中拷貝masterFQDN,這個地址就是我們稍等要訪問的地址。
開啟terminal,執行以下命令建立一個ssh tunnel
sudo ssh -L 80:localhost:80 -f -N @ -p 2200
username就是我們在叢集描述檔案中的adminUsername
masterFQDN就是剛才我們在門戶預覽中複製的地址開啟本地瀏覽器訪問http://localhost,如果能顯示下面的介面就表示已經建立成功了
- 如果我們想部署一個簡單的hello-world容器服務的話,可以點選“Services”,然後點選“Deploy Service”
- 設定需要部署的服務的id為“helloworld”,然後點選“Container Settings”,在彈出的介面中設定需要部署的docker映象的名稱
- 點選“Deploy”後並部署成功後,點選“helloworld”服務,就可以檢視部署的服務的詳細資訊了
結論
通過上面的操作我們發現ACS確實是一大利器,能夠最大限度地簡化容器叢集的部署和配置,使用者只需要配置幾個簡單的叢集描述引數就能迅速享受到容器化叢集給生產環境帶來的各種便利。同時因為本身架構是基於開源解決方案,使用者可以很方便地將已經執行在本地資料中心的容器叢集遷移到Azure上,也可以將Azure上的ACS服務遷移到別的資料中心,減少了服務和平臺的耦合性,讓使用者享受便利的同時,免除了對平臺耦合的顧慮,唯一美中不足的地方就是國內防火牆的存在對安裝過程有些阻礙,目前筆者暫時先把這些依賴的元件放到了Azure的儲存裡面,筆者相信Azure在將來一定會有更加完善的CDN的解決方案來更加快速地幫著使用者完成部署。