阿裡雲一鍵部署 Docker Datacenter

來源:互聯網
上載者:User

摘要: 使用ROS範本在阿裡雲上一鍵部署DockerDatacenter

DDC 關於

2016年2月下旬,Docker發佈了企業級容器管理和服務部署的整體解決方案平臺-Docker Datacenter,簡稱DDC。DDC 有三個元件構成:
1. Docker Universal Control Plane(Docker UCP),這是套圖形化管理介面;
2. Docker Trusted Registry(DTR),授信的Docker鏡像倉庫;
3. Docker Engine商業版,提供支援人員的Docker引擎。

DDC在Docker官網位址是:http://www.docker.com/products/docker-datacenter#

ddc_Enterprise_2_Arch_2_1

DDC 與Docker公司的另外一個線上產品Docker Cloud 對應。不過DDC主要針對企業使用者在內部部署。用戶註冊自己的Dokcer鏡像到DTR,UCP管理整個Docker集群。並且這兩個元件都提供了Web介面。

使用DDC需要購買Licence, 但是Docker公司提供了一個月的試用Licence,可以在Docker官網註冊後直接下載。

DDC 一鍵部署

說了這麼多,到底如何部署DDC的環境呢?有一個簡單的方式,就是使用阿裡雲的ROS。通過下面的連結一鍵部署,就可以做到分分鐘建立一套DDC。

ddc_input_params

點選一鍵部署後,預設會在華北2 region 部署DDC。如果你需要調整region,請點選網頁右下角的【上一步】,然後重新選擇region,接著點選【下一步】,你只需要填入如下圖中必填的資訊或者根據你的需求調整資訊後,點選【建立】按鈕就可以部署一套DDC。

DDC 存取

當ROS建立DDC成功後,怎麼登入UCP系統,可以進入ROS的棧管理網頁,查看剛才建立的棧的概要資訊,這裡面輸出了登入UCP和DTR的位址,如圖:

ddc_output

在瀏覽器中輸入紅框中的位址就會顯示UCP的存取網頁,這時輸入在安裝UCP時建立的管理帳號和密碼就可以登入進去,接著會通知輸入匯入Licence檔案,請把準備好的Licence匯入,就可以進入UCP的控制介面了:

upc_portal

DDC 部署細節

接下來將主要介紹如何通過阿裡雲的ROS一鍵部署DDC環境。

ROS部署的DDC架構圖

docker_ddc_arch

在上面的基礎架構圖裡面,Controller主要執行UCP元件,DTR啟動並執行就是DTR元件,Worker主要執行客戶自己的Docker服務。整個DDC環境都部署在VPC網路之下,所有的ECS上線同一個安全性群組。每個元件都提供了一個SLB,供外網存取。而運維動作則是通過跳板機實現。另一方面為了升階可用工時,整個DDC環境都是高可用部署,也就是說Controller至少有兩台,同理DTR也至少有兩台。

ROS部署細節介紹

下面詳細介紹如何通過ROS範本建立阿裡雲資源並通過ROS的UserData功能部署DDC環境。

1. 基礎資源和網路環境設定

按照上面的架構圖,所有節點都在VPC網路中,所以首先使用ROS的ALIYUN::ECS::Vpc,ALIYUN::ECS::VSwitch資源建立DDC的VPC網路。VPC網路和外網是相互隔離的,由於DDC環境的部署需要線上安裝DockerEngine,UCP,DTR,所以我們需要設定VPC網路環境使內部節點能夠存取外網,同時運維也能存取到VPC中節點。VPC網路的設定只需要用到ALIYUN::ECS::NatGateWay,ALIYUN::ECS::BandwidthPackage,ALIYUN::ECS::SNatEntryALIYUN::ECS::ForwardEntry這四個資源來搞定。並且在VPC網路中提供一台跳板機通過ALIYUN::ECS::ForwardEntry對外公開22埠。詳細的VPC網路設定大家可以參考這篇本文《新玩法,ROS幫你一鍵搭建NatGateway讓VPC與Internet的互訪》。

由於所有的節點都在一個VPC網路中,所以只需要建立一個安全性群組,把所有的機器上線,開放所需埠,在這裡如規則開放了22,80,443,2377埠,出規則全部開放。安全性群組的建立以及所有的設定只需使用ALIYUN::ECS::SecurityGroup資源即可。

2. 部署UCP

部署需要的資源

UCP元件會在至少兩台機器上執行,以便提供高可用,一台是master節點,一台是slave。同時它們掛載到一個SLB,用戶通過SLB的公網IP存取UCP Web。SLB監聽80,443和2377埠。由於master節點需要生成其他節點上線DDC時的token,所以ROS會首先建立一個masterECS並且使用UserData在master ECS啟動的時候部署安裝UCP元件,然後生成所需token並記錄token資訊。接著再建立多個slave節點,使用UserData給slave節點部署UCP元件,並上線DDC環境,和master組成高可用UCP套用。ROS使用了ALIYUN::ECS::Instance建立master節點;使用ALIYUN::ECS::InstanceGroup建立多個slave節點;並通過這兩個ALIYUN::ROS::WaitConditionALIYUN::ROS::WaitConditionHandle來監控UserData的執行情況和追蹤執行結果

當UCP節點建立完成後,都會掛載到SLB,建立,設定SLB以及掛載所有的UCP節點使用了這三個資源:
ALIYUN::SLB::LoadBalancer 建立SLB實例,ALIYUN::SLB::Listener 設定SLB監聽那些埠,
ALIYUN::SLB::BackendServerAttachment 把UCP節點上線到SLB監聽清單中。

部署安裝UCPUserData腳本主要指令

首先設定Docker套裝軟體秘鑰

curl -s 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | apt-key add --import

新增阿裡雲的Docker源能夠確保成功提取DockerEngine安裝包

echo 'deb https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/apt/repo ubuntu-trusty main' | tee /etc/apt/sources.list.d/docker.list

安裝Docker

curl -sSL https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/install.sh | sh

設定提取UCP鏡像的Mirror

echo DOCKER_OPTS='--registry-mirror https://6udu7vtl.mirror.aliyuncs.com' > /etc/default/docker

安裝UCP,這個指令只需在master節點執行

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock--name ucp docker/ucp install --debug --host-address$ip_addr --admin-username $ucp_admin_username --admin-password $ucp_admin_password --san $ip_addr --san $controller_slb_ip

UCP install的參數解釋:

  • --debug 打開debug查看詳細的安裝資訊
  • --host-address 其他節點通過哪個IP存取UCP
  • --admin-username 設定UCP的管理帳號
  • --admin-password 設定管理帳號的密碼
  • --san 指定那些IP或網域名稱能夠通過UCP的認證,這裡新增了兩個,一個是本機IP,一個是SLB的公網IP。這裡必須寫上SLB的IP位址,因為存取DTR的時候,會redirect到UCP做認證。如果不指定的話,就會直接使用私網IP,這時候必定存取失敗。

根據生成token,-q參數控制生成manager或worker類型的token

docker swarm join-token -q manager

如果是slave節點,則安裝UCP的指令只需取代成下麵的指令即可

docker swarm join --token=$token ${ucp_controller_ip}:2377
token就是Master節點生成的token
ucp_controller_ip是安裝master節點是指定的 --host-address

詳細ROS範本的UCP節點資源定義

"Controller": {
"DependsOn": "SNatEntry",
"Properties": {
"AllocatePublicIP": "false",
"ImageId": {
"Ref": "ControllerImageId"
},
"InstanceType": {
"Ref": "ControllerInstanceType"
},
"IoOptimized": {
"Ref": "ControllerIoOptimized"
},
"Password": {
"Ref": "InstancePassword"
},
"SecurityGroupId": {
"Fn::GetAtt": [
"DefaultSecurityGroup",
"SecurityGroupId"
]
},
"SystemDiskCategory": {
"Ref": "ControllerSystemDiskCategory"
},
"UserData": {
"Fn::Replace": [
{
"ros-notify": {
"Fn::GetAtt": [
"ControllerConditionHandle",
"CurlCli"
]
}
},
{
"Fn::Join": [
"",
[
"#!/bin/sh\n",
"ucp_admin_username='",
{
"Ref": "UCPAdminUserName"
},
"'\n",
"ucp_admin_password='",
{
"Ref": "UCPAdminPassword"
},
"'\n",
"controller_slb_ip='",
{
"Fn::GetAtt": ["ControllerLoadBalancer", "IpAddress"]
},
"'\n",
"ip_addr=`ifconfig eth0 | awk '/inet addr:/{print $2}' | tr -d 'addr:'`\n",
"host_name=`hostname`\n",
"sed -i 's/Acquire::http::Proxy/#Acquire::http::Proxy/' /etc/apt/apt.conf\n",
"apt-get update\n",
"apt-get install -y apt-transport-https\n",
"apt-get install -y linux-image-extra-virtual\n",
"apt-get install -y curl\n",
"apt-get install -y unzip\n",
"apt-get install -y jq\n",
"curl -s 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | apt-key add --import\n",
"echo 'deb https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/apt/repo ubuntu-trusty main' | tee /etc/apt/sources.list.d/docker.list\n",
"# Installing Docker\n",
"curl -sSL https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/install.sh | sh\n",
"echo DOCKER_OPTS=\"'--registry-mirror https://6udu7vtl.mirror.aliyuncs.com'\" > /etc/default/docker\n",
"sudo service docker restart\n",
"usermod -aG docker $USER\n",
"docker run --rm -v /var/run/docker.sock:/var/run/docker.sock--name ucp docker/ucp install --debug --host-address$ip_addr --admin-username $ucp_admin_username --admin-password $ucp_admin_password --san $ip_addr --san $controller_slb_ip\n",
"worker_token=`docker swarm join-token -q worker`\n",
"manager_token=`docker swarm join-token -q manager`\n",
"echo $worker_token, $manager_token > /tmp/tokens\n",
"cmd=\"ros-notify -d '{\\\"id\\\" : \\\"tokens\\\", \\\"data\\\" : [\\\"$worker_token\\\", \\\"$manager_token\\\"]}'\"\n",
"eval $cmd\n"
]
]
}
]
},
"VSwitchId": {
"Ref": "PubSubnet"
},
"VpcId": {
"Ref": "Vpc"
}
},
"Type": "ALIYUN::ECS::Instance"
}

3. 部署DTR

DTR和UCP元件一樣也是高可用部署,但是DTR沒有master和slave節點之分,ROS可以直接使用ALIYUN::ECS::InstanceGroup一次建立多台DTR節點,當DTR節點啟動時,執行UserData腳本部署DTR套用。同時所有的DTR節點掛載自己硬地的SLB,SLB監聽443,用戶通過使用SLB的公網IP直接存取DTRWeb網頁。

DTR的安裝和UCP的類似,只需要把安裝UCP的指令換成下麵這兩個指令即可:

首先要上線DDC和UCP slave節點的指令一樣

docker swarm join --token=$token ${ucp_controller_ip}:2377

安裝DTR

docker run --rm -i docker/dtr install --debug --ucp-url https://$controller_slb_ip:443 --ucp-node $host_name --dtr-external-url https://$dtr_slb_ip:443 --ucp-username $ucp_admin_username --ucp-password $ucp_admin_password --ucp-insecure-tls| tee -a /tmp/dtr_install_log,

DTR install的參數:

  • --debug 打開debug切換,查看安裝的詳細資料
  • --ucp-url 指定UCP的存取位址,這裡使用UCP SLB的公網IP
  • --ucp-node 指定安裝DTR的機器名
  • --dtr-external-url 供外部存取DTR的URL,指定DTR SLB的公網IP
  • --ucp-username UCP的管理員帳號
  • --ucp-password UCP的管理員帳號的密碼
  • --ucp-insecure-tls 給UCP關閉TLS驗證

詳細ROS範本的DTR資源定義

"DTRNode": {
"DependsOn": "Controller",
"Properties": {
"AllocatePublicIP": "false",
"ImageId": {
"Ref": "DTRImageId"
},
"InstanceType": {
"Ref": "DTRInstanceType"
},
"IoOptimized": {
"Ref": "DTRIoOptimized"
},
"MaxAmount": {
"Ref" : "DTRMaxAmount"
},
"MinAmount": {
"Ref" : "DTRMaxAmount"
},
"Password": {
"Ref": "InstancePassword"
},
"SecurityGroupId": {
"Fn::GetAtt": [
"DefaultSecurityGroup",
"SecurityGroupId"
]
},
"SystemDiskCategory": {
"Ref": "DTRSystemDiskCategory"
},
"VSwitchId": {
"Ref": "PubSubnet"
},
"VpcId": {
"Ref": "Vpc"
},
"UserData": {
"Fn::Replace": [
{
"ros-notify": {
"Fn::GetAtt": [
"DTRConditionHandle",
"CurlCli"
]
}
},
{
"Fn::Join": [
"",
[
"#!/bin/sh\n",
"ucp_admin_username='",
{
"Ref": "UCPAdminUserName"
},
"'\n",
"ucp_admin_password='",
{
"Ref": "UCPAdminPassword"
},
"'\n",
"tokens='",
{
"Fn::GetAtt": [
"ControllerWaitCondition",
"Data"
]
},
"'\n",
"ucp_controller_ip='",
{
"Fn::GetAtt": [
"Controller",
"PrivateIp"
]
},
"'\n",
"controller_slb_ip='",
{
"Fn::GetAtt": ["ControllerLoadBalancer", "IpAddress"]
},
"'\n",
"dtr_slb_ip='",
{
"Fn::GetAtt": ["DTRLoadBalancer", "IpAddress"]
},
"'\n",
"ip_addr=`ifconfig eth0 | awk '/inet addr:/{print $2}' | tr -d 'addr:'`\n",
"host_name=`hostname`\n",
"sed -i 's/Acquire::http::Proxy/#Acquire::http::Proxy/' /etc/apt/apt.conf\n",
"apt-get update\n",
"apt-get install -y apt-transport-https\n",
"apt-get install -y linux-image-extra-virtual\n",
"apt-get install -y curl\n",
"apt-get install -y unzip\n",
"apt-get install -y jq\n",
"curl -s 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | apt-key add --import\n",
"echo 'deb https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/apt/repo ubuntu-trusty main' | tee /etc/apt/sources.list.d/docker.list\n",
"# Installing Docker\n",
"curl -sSL https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/install.sh | sh\n",
"echo DOCKER_OPTS=\"'--registry-mirror https://6udu7vtl.mirror.aliyuncs.com'\" > /etc/default/docker\n",
"service docker restart\n",
"usermod -aG docker $USER\n",
"echo $tokens > /tmp/tokens\n",
"token=`echo \"$tokens\" | jq '.tokens'[0] | xargs echo `\n",
"echo $token > /tmp/worker_token \n",
"docker swarm join --token=$token ${ucp_controller_ip}:2377\n",
"sleep 300\n",
"docker run --rm -i docker/dtr install --debug --ucp-url https://$controller_slb_ip:443 --ucp-node $host_name --dtr-external-url https://$dtr_slb_ip:443 --ucp-username $ucp_admin_username --ucp-password $ucp_admin_password --ucp-insecure-tls| tee -a /tmp/dtr_install_log\n",
"echo $token > /tmp/fin_worker_token\n",
"cmd=\"ros-notify -d '{\\\"data\\\" : \\\"$token\\\"}'\"\n",
"eval $cmd\n"
]
]
}
]
}
},
"Type": "ALIYUN::ECS::InstanceGroup"
}

4. 部署Worker節點

Worker節點是正真部署用戶自己套用的節點,這些節點只需要安裝DockerEngine然後上線DDC即可。Worker節點也都是部署在VPC網路,外部存取同樣也需要使用SLB,在這裡SLB之監聽了80埠,大家後續部署的時候可以通過修改ROS範本自己新增需要監聽的埠。同DTR一樣,ROS使用ALIYUN::ECS::InstanceGroup一次建立多個節點,並用UserData安裝Dockerengine和上線DDC。

部署Worker節點使用的指令和部署UCP的slave節點一樣,只不過使用的Token不同,Worker節點使用的是worker類型的token。

詳細ROS範本的Worker資源定義

"UCPNode": {
"DependsOn": "Controller",
"Properties": {
"AllocatePublicIP": "false",
"ImageId": {
"Ref": "UCPImageId"
},
"InstanceType": {
"Ref": "UCPInstanceType"
},
"IoOptimized": {
"Ref": "UCPIoOptimized"
},
"MaxAmount": {
"Ref": "UCPMaxAmount"
},
"MinAmount": {
"Ref": "UCPMaxAmount"
},
"Password": {
"Ref": "InstancePassword"
},
"SecurityGroupId": {
"Fn::GetAtt": [
"DefaultSecurityGroup",
"SecurityGroupId"
]
},
"SystemDiskCategory": {
"Ref": "UCPSystemDiskCategory"
},
"UserData": {
"Fn::Replace": [
{
"ros-notify": {
"Fn::GetAtt": [
"UCPConditionHandle",
"CurlCli"
]
}
},
{
"Fn::Join": [
"",
[
"#!/bin/sh\n",
"tokens='",
{
"Fn::GetAtt": [
"ControllerWaitCondition",
"Data"
]
},
"'\n",
"ucp_controller_ip='",
{
"Fn::GetAtt": [
"Controller",
"PrivateIp"
]
},
"'\n",
"ip_addr=`ifconfig eth0 | awk '/inet addr:/{print $2}' | tr -d 'addr:'`\n",
"host_name=`hostname`\n",
"sed -i 's/Acquire::http::Proxy/#Acquire::http::Proxy/' /etc/apt/apt.conf\n",
"apt-get update\n",
"apt-get install -y apt-transport-https\n",
"apt-get install -y linux-image-extra-virtual\n",
"apt-get install -y curl\n",
"apt-get install -y unzip\n",
"apt-get install -y jq\n",
"curl -s 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | apt-key add --import\n",
"echo 'deb https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/apt/repo ubuntu-trusty main' | tee /etc/apt/sources.list.d/docker.list\n",
"# Installing Docker\n",
"curl -sSL https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/install.sh | sh\n",
"echo DOCKER_OPTS=\"'--registry-mirror https://6udu7vtl.mirror.aliyuncs.com'\" > /etc/default/docker\n",
"service docker restart\n",
"usermod -aG docker $USER\n",
"echo $tokens > /tmp/tokens\n",
"token=`echo \"$tokens\" | jq '.tokens'[0] | xargs echo `\n",
"echo $token > /tmp/worker_token \n",
"cmd=\"ros-notify -d '{\\\"data\\\" : \\\"$token\\\"}'\"\n",
"eval $cmd\n",
"docker swarm join --token=$token ${ucp_controller_ip}:2377\n",
"echo $token > /tmp/fin_worker_token\n"
]
]
}
]
},
"VSwitchId": {
"Ref": "PubSubnet"
},
"VpcId": {
"Ref": "Vpc"
}
},
"Type": "ALIYUN::ECS::InstanceGroup"
}

總結

大規模手工部署一個高可用DDC環境還是有一定的複雜度,利用本文中提供的ROS範本,可以非常方便的幫你一鍵部署DDC環境,讓你把其他的精力放在自己的商務上。

相關產品:

  1. 資源編排ROS
  2. 資源編排ROS
  3. 資源編排ROS
  4. 容器服務(Docker)
相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.