一鍵部署 Docker Datacenter ---簡化docker數據中心安裝步驟


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。

一鍵部署>>>

點擊一鍵部署后,默認會在華北2 region 部署 DDC。 如果你需要調整region,請點擊頁面右下角的【上一步】,然后重新選擇region,接着點擊【下一步】,你只需要填入如下圖中必填的信息或者根據你的需求調整信息后,點擊【創建】按鈕就可以部署一套 DDC。

ddc_ros_input_info

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::VpcALIYUN::ECS::VSwitch資源創建DDC的VPC網絡。VPC網絡和外網是相互隔離的,由於DDC環境的部署需要在線安裝Docker Engine,UCP,DTR,所以我們需要配置VPC網絡環境使內部節點能夠訪問外網,同時運維也能訪問到VPC中節點。VPC網絡的配置只需要用到ALIYUN::ECS::NatGateWayALIYUN::ECS::BandwidthPackageALIYUN::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會首先創建一個master ECS並且使用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監聽列表中。

部署安裝UCP的UserData腳本主要命令

首先設置Docker軟件包秘鑰

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

添加阿里雲的Docker源能夠確保成功拉取Docker Engine安裝包

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直接訪問DTR Web頁面。

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節點是正真部署用戶自己應用的節點,這些節點只需要安裝Docker Engine然后加入DDC即可。Worker節點也都是部署在VPC網絡,外部訪問同樣也需要使用SLB,在這里SLB之監聽了80端口,大家后續部署的時候可以通過修改ROS模板自己添加需要監聽的端口。同DTR一樣,ROS使用ALIYUN::ECS::InstanceGroup一次創建多個節點,並用UserData安裝Docker engine和加入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環境,讓你把更多的精力放在自己的業務上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM