DDC简介
2016年2月下旬,Docker发布了企业级容器管理和服务部署的整体解决方案平台-DockerDataCenter,简称DDC。DDC有三个组件构成:
1.DockerUniversalControlPlane(DockerUCP),这是套图形化管理界面;
2.DockerTrustedRegistry(DTR),授信的Docker镜像仓库;
3.收费版的DockerEngine,提供技术支持的Docker引擎。
DDC在Docker官网地址是:
DDC与docker公司的另外一个在线产品DockerCloud对应。不过DDC主要针对企业用户在内部部署。用户注册自己的Dokcer镜像到DTR,UCP管理整个Docker集群。并且这两个组件都提供了Web界面。
使用DDC需要购买Licence,但是Docker公司提供了一个月的试用Licence,可以在Docker官网注册后直接下载。
说了这么多,到底如何部署DDC的环境呢?有一个简单的方式,就是使用阿里云的ROS。通过编写一份ROS的模板,可以做到分分钟部署一套DDC。
ROS部署DDC
接下来将主要介绍如何通过阿里云的ROS一键部署DDC环境。
ROS部署的DDC架构图
在上面的基础架构图里面,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::SNatEntry和ALIYUN::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监听80,443和2377端口。由于Master节点需要生成其他节点加入DDC时的token,所以ROS会首先创建一个MasterECS并且使用UserData在MasterECS启动的时候部署安装UCP组件,生成所需Token并记录Token信息。接着再创建多个Slave节点,同时使用UserData部署UCP组件,并加入DDC环境,和Master组成高可用UCP应用。ROS使用了ALIYUN::ECS::Instance创建master节点;使用ALIYUN::ECS::InstanceGroup创建多个slave节点;并通过这两个ALIYUN::ROS::WaitCondition和ALIYUN::ROS::WaitConditionHandle来监控UserData的执行情况和获取执行结果
当UCP节点创建完成后,都会挂载到SLB,创建,配置SLB以及挂载所有的UCP节点使用了这三个资源:
ALIYUN::SLB::LoadBalancer,ALIYUN::SLB::Listener,ALIYUN::SLB::BackServerAttachment。
部署安装UCP的UserData脚本主要命令
首先设置Docker软件包秘钥
curl-s';search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e'|apt-keyadd--import
添加阿里云的docker源能够确保成功拉取DockerEngine安装包
echo'deb'|tee/etc/apt//
安装docker
curl-sSL|sh
配置拉取UCP镜像的Mirror
echoDOCKER_OPTS='--registry-mirror'/etc/default/docker
安装UCP,这个命令只需在Master节点会执行
dockerrun--rm-v/var/run/:/var/run//ucpinstall--debug--host-address$ip_addr--admin-username$ucp_admin_username--admin-password$ucp_admin_password--san$ip_addr--san$controller_slb_ip
ucpinstall的参数解释:
--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
dockerswarmjoin-token-qmanager
如果是Slave节点,则安装UCP的命令只需替换成下面的命令即可
dockerswarmjoin--token=$token${ucp_controller_ip}:2377token就是Master节点生成的tokenucp_controller_ip是安装master节点是指定的--host-address详细ROS模板的UCP节点资源定义
"Controller":{"DepsOn":"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":["",["Acquire::http::Proxy/'/etc/apt/\n","apt-getupdate\n","apt-getinstall-yapt-transport-https\n","apt-getinstall-ylinux-image-extra-virtual\n","apt-getinstall-ycurl\n","apt-getinstall-yunzip\n","apt-getinstall-yjq\n","curl-s';search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e'|apt-keyadd--import\n","echo'deb'|tee/etc/apt//\n","!/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=`ifconfigeth0|awk'/inetaddr:/{print$2}'|tr-d'addr:'`\n","host_name=`hostname`\n","sed-i's/Acquire::http::Proxy/InstallingDocker\n","curl-sSL|sh\n","echoDOCKER_OPTS=\"'--registry-mirror'\"/etc/default/docker\n","servicedockerrestart\n","usermod-aGdocker$USER\n","echo$tokens/tmp/tokens\n","token=`echo\"$tokens\"|jq'.tokens'[0]|xargsecho`\n","echo$token/tmp/worker_token\n","dockerswarmjoin--token=$token${ucp_controller_ip}:2377\n","sleep300\n","dockerrun--rm-idocker/dtrinstall--debug--ucp-urlhttps://$controller_slb_ip:443--ucp-node$host_name--dtr-external-urlhttps://$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":{"DepsOn":"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":["",["Acquire::http::Proxy/'/etc/apt/\n","apt-getupdate\n","apt-getinstall-yapt-transport-https\n","apt-getinstall-ylinux-image-extra-virtual\n","apt-getinstall-ycurl\n","apt-getinstall-yunzip\n","apt-getinstall-yjq\n","curl-s';search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e'|apt-keyadd--import\n","echo'deb'|tee/etc/apt//\n","#InstallingDocker\n","curl-sSL|sh\n","echoDOCKER_OPTS=\"'--registry-mirror'\"/etc/default/docker\n","servicedockerrestart\n","usermod-aGdocker$USER\n","echo$tokens/tmp/tokens\n","token=`echo\"$tokens\"|jq'.tokens'[0]|xargsecho`\n","echo$token/tmp/worker_token\n","cmd=\"ros-notify-d'{\\\"data\\\":\\\"$token\\\"}'\"\n","eval$cmd\n","dockerswarmjoin--token=$token${ucp_controller_ip}:2377\n","echo$token/tmp/fin_worker_token\n"]]}]},"VSwitchId":{"Ref":"PubSubnet"},"VpcId":{"Ref":"Vpc"}},"Type":"ALIYUN::ECS::InstanceGroup"}访问UCP
在浏览器中输入https://{ucp_slb_ip}:443,就会显示UCP的访问页面,这时输入在安装UCP时创建的管理账号和密码就可以登录进去,接着会提示输入导入Licence文件,请把准备好的Licence导入,就可以进入UCP的控制界面了:
总结
大规模手工部署一个高可用的DDC环境还是有一定的复杂度,利用本文中提供的ROS模板,可以非常方便的帮你一键部署DDC环境,让你把更多的精力放在自己的业务上。