rancher是一个docker集群化管理平台,相对于mesos和k8s架构,rancher的部署管理非常简单方便。并且功能丰富。如下为本人绘制的逻辑架构图。
1:部署Rancher管理平台
规划:
server:10.64.5.184
agent1:10.64.5.185
agent2:10.64.5.186
agent3:10.64.5.187
agent4:10.64.5.188
部署方式:
docker容器启动
server端部署
依赖镜像:rancher/server:latest
# docker run -d --restart=always -v /home/heqinqin/data:/var/lib/mysql -p 8080:8080 rancher/server
agent部署
依赖镜像:rancher/agent:v0.8.2
浏览器访问server_ip:8080,点击Add host.执行下图中sever管理端生成的Add host命令,即可将host添加到server端管理。
添加两个host之后
2:部署stack和service
rancher管理容器是以stack为一个任务组,在stack下可以有多个service共同提供业务,而每个service可以包含多个容器。
下面来创建一个web集群,来提供网站服务
1:创建一个Stack,命名为WEB-Server
2:创建一个Service,命名为Nginx-cluster,运行十个nginx容器。
3:点击start启动service,开始部署container。
4:创建一个Load Balance负载均衡器
5:创建一个Load Balance负载均衡器,设置端口映射,选择负载均衡的服务。
6:WEB-server的服务创建成功。一个stack包含了两个service。
7:点击显示架构图,可清楚看到逻辑关系.
8:同理创建一个WordPress服务,如下。
3:Rancher的相关特性,功能
网络+负载均衡
依赖镜像:rancher/agent-instance:v0.5.0
采用SDN技术所建容器为虚拟ip地址10段(常规为docker内部地址172段),各host之间容器采用ipsec隧道实现跨主机通信,使用的是udp的500和4500端口。
启动任务时,在各个host部署容器之前会起一个Network Agent容器,负责组建网络环境。
监控管理
包括:主机监控+和容器监控
监控内容:CPU+Memory+Network+storge
用户管理和访问控制
支持多种访问控制权限管理。保证平台安全。
支持用户组及权限设置(如下图设置了运维OPS环境和开发DEV环境,实现管理隔离)。
集成第三方软件镜像(官方会持续更新)
4:破坏性测试
server是以胖容器方式运行,其中包含了mysql数据库,经测试,数据库保存了任务数据以及任务逻辑关系。
破坏server端
1.
操作:在server端和agent端正常运行状态下,stop掉server容器,
结果:业务不受影响。start重启容器后恢复管理功能。
2.
操作:将server端容器rm删除掉(未将mysql数据映射至宿主机),重新再起一个server容器。
结果:1.当前业务不受影响
2.新server仍然能够识别和管理各个agent,因为agent端是连server的ip端口,ip不变就能连上
3.agent端原有的任务容器的命名和逻辑关系没有了。
3.
操作:将server端容器rm删除掉(将mysql数据/var/lib/mysql 映射至宿主机),重新再起一个server容器。
结果:新起的容器能够识别任务状态,命名,逻辑关系。恢复到之前的状态。
破坏agent端
4.
操作:host命令行下删除掉agent容器
结果:不影响当前业务状态,server端显示host失联,无法对该agent下发任务进行扩容和缩容。
重新启动agent后恢复正常。
5.
操作:server控制端删除agent端的业务容器(例如删除nginx容器)
结果:删除后数秒内,在另一个host上重新启动一个新的业务容器。
6.
操作:host命令行下删除agent端的业务容器(例如删除nginx容器)
结果:删除后数秒内,在当前host上重新启动一个新的业务容器。
7.
操作:host命令行下删除掉agent容器后,再删除一个业务容器
结果:server端因为与agent失联,导致无法更新该host上的容器变化,没有新启动任何容器。
测试未完。。。
---当前结论
1:server节点需要单独部署,并相对给予较高性能。
2:server节点宕机不会对现有业务造成影响,但是可能会对后期管理造成影响。
3:需要将server端数据保存至宿主机,并定期备份数据库数据。
4:server端对host的管理完全是依赖agent容器,当无法联系agent容器时,无法得知当前host上容器的变化,在终端显示的是最后一次agent通知的内容状态。