- 容器即服务:从零构建企业级容器集群
- 林帆
- 1847字
- 2020-08-28 01:21:19
2.4 Swarm Mode的图形界面
2.4.1 Swarm Mode UI现状
到目前为止,本书介绍的操作都是在命令行中实现的。而在实际管理集群时,特别是在需要持续观察集群状态和快速获取集群全貌时,总是通过输入这么多命令来刷屏查看信息就显得比较笨拙。
在Docker的企业版本中包含了一款管理Swarm集群的图形界面工具,被称为Universal Control Plane(简称UCP),它提供了对集群、节点、网络、存储、服务、应用组等全方位的可视化管理能力,如图2-5所示。
图2-5 Universal Control Plane的仪表盘页面
开源社区里也曾一度出现过许多Docker容器管理界面,但随着Docker增加了Swarm的组件,随后又从经典Swarm集群转移到Swarm Mode集群,许多相关的项目已不再继续更新了。在许多国内开发者参与贡献的项目中,相对知名的有数人云公司设计的Crane界面和个人开发者Helyho设计的DockerFly界面,这两个项目都对最新的Swarm Mode提供了支持,虽然代码活跃度都已不高,有兴趣的读者不妨保持关注。
在社区项目中,最值得一提的是Portainer,这个项目从Docker诞生后不久(2013年6月)开始启动,一路跟随着Docker踏过单机时代的容器和经典Swarm时代的容器集群,现在完美支持了新的Swarm Mode集群,并保持着良好的活跃度和发布频率,是Swarm Mode集群可视化产品中值得一试的开源方案。
2.4.2 Portainer
Portainer的前端界面采用Angular框架,代码结构和用户体验都十分优雅。由于Portainer采用本地文件(而不是数据库)的方式存储服务状态,它在部署的时候没有什么额外的依赖,在集群的Manager节点启动Portainer容器时即可使用,如下所示。
$ docker run -d \ --name portainer \ --restart always \ -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /opt/portainer:/data \ portainer/portainer
容器中的“/data”目录被用来保存Portainer的状态数据,建议将它挂载到主机上。这种简便和灵活设计的代价使它无法简单地进行水平扩展,但考虑到集群管理系统通常只有管理员使用,并不会有高并发访问,所以算不上是严重的设计问题。Portainer的数据目录存储的主要是用户组和集群连接信息等少量数据,界面上展示的数据都是实时从集群里获得的,所有在界面上与集群相关的操作也都会透明地传递给集群执行。
也可以使用Service的方式部署,如下所示,注意加上部署节点的选择条件,确保它只会被部署在Manager节点上,否则将无法获得集群信息。当然,除非使用网络存储来挂载Portainer的数据目录,否则使用这种方式部署的服务同样是不能水平扩容的。
$ docker service create \ --detach \ --name portainer \ --publish 9000:9000 \ --constraint 'node.role == manager' \ --mount type=bind, src=/var/run/docker.sock, dst=/var/run/docker.sock \ --mount type=bind, src=/opt/portainer, dst=/data \ portainer/portainer
部署完成后,通过浏览器访问运行节点的9000端口(如果采用Service方式部署则可以是集群任意节点的9000端口)。首次进入时会提示设置一个8位数以上的管理员密码,设置完成后,使用admin用户和刚刚重置过的密码登录。
此时Portainer会问用户要操作哪个容器集群,如果刚才创建容器时就是在Manager节点创建的(或通过Service方式创建的),则可以直接选择“Manage the Docker instance where Portainer is running”,表示通过当前服务所在的节点接入集群。然后就进入了Portainer的主仪表盘页面,如图2-6所示。
图2-6 Portainer的主仪表盘页面
注意图2-6左侧的导航栏菜单,它将Portainer的主要功能至上而下地划分为三部分。
最上面的部分是“Active Endpoint”,这里可以用于切换管理的集群。Portainer将每个被管理的集群称为一个“接入点(Endpoint)”,用户可以使用同一个Portainer界面管理多个集群,稍后会介绍接入点的添加和管理。
中间部分的“Enpoint Actions”是Portainer的主体功能,包含Swarm集群中的各种资源菜单。可以在不同的资源管理页面之间切换,所有的集群信息在这里都一目了然。此外,通过Portainer也能可视化地创建网络、存储、容器、服务等各种资源对象。
最底部的“Portainer Settings”部分只有管理员账号能看到,包含了用户管理(User management)、集群接入点管理(Enpoints)、仓库管理(Registies)和系统设置(Settings)这几个模块。在用户管理模块中,具有管理员权限的用户可以创建更多的普通用户账号并将这些账号划分成团队。接入点管理的模块用于添加更多Portainer可管理的集群,并将用户账号和可以访问的集群关联起来,当普通用户登录到Portainer时,只能看到和切换自己有权限的集群。仓库管理模块用于当用户使用Docker Hub的私有镜像组或是自建的私有仓库下载镜像时能够自动使用相应账号登录,解决通过Portainer部署容器时需要使用私有镜像的问题。
下面的例子展示了Portainer的多集群管理能力。首先进入左侧菜单的“Portainer Settings→User Management”页面,创建名为“demo”的用户,任意设置一个登录密码。然后进入“Portainer Settings→User Management→Team”页面,创建名为“demo-group”的团队,将demo用户设置为团队管理员(Team Leader)。此时用户页面的状态信息如图2-7所示,团队页面的状态信息如图2-8所示。
图2-7 Portainer的用户列表
图2-8 Portainer的团队列表
接着进入“Portainer Settings→Endpoints”页面,添加要管理的其他集群地址,保存后单击各个接入点的“Manage access”按钮,赋予demo-group团队部分集群的管理权限,如图2-9所示。
图2-9 Portainer的接入点列表
然后重新使用demo用户登录,会发现点开左上角的接入点下拉菜单后,只能在有权限的集群之间切换,如图2-10所示。
图2-10 Portainer导航栏的切换接入点菜单