在vSphere和Photon上进行Docker Java应用程序的部署自动化
背景
Java开发人员和DevOps专业人员长期以来一直在努力实现企业Java应用程序的自动化部署。 这些应用程序的复杂性通常意味着,每次在DEV / TEST环境中部署应用程序时,都必须重新配置应用程序依赖性和外部集成。
许多解决方案宣传“一次建模,随处部署”消息,以进行应用程序部署。 但是,实际上,总会有一些复杂性,例如,很难在本地vSphere虚拟环境和AWS环境中重用应用程序模板。
但是,最近,Docker容器普及了将应用程序组件打包到Linux容器中的想法,只要安装了Docker Engine,它们就可以在所有Linux主机上完全相同地部署。
不幸的是,对企业Java应用程序进行容器化仍然是一个挑战,主要是因为现有的应用程序组合框架无法解决复杂的依赖关系,外部集成或置备后的自动扩展工作流。 此外,容器的短暂设计意味着开发人员必须启动新的容器并在每次版本更新时重新创建复杂的依赖关系和外部集成。
DCHQ具有托管和内部部署版本,可解决所有这些挑战,并通过高级应用程序组合框架简化了企业Java应用程序的容器化,该框架通过跨映像环境变量绑定,可扩展的BASH脚本插件扩展了Docker Compose。可以在请求时间或后置资源时调用,并通过应用程序群集在多个主机或区域上实现高可用性,并支持自动扩展。
设置应用程序后,用户可以监视正在运行的容器的CPU,内存和I / O,获取通知和警报,并执行第二天的操作,例如预定备份,使用BASH脚本插件和Scale的容器更新。进出。 此外,借助Jenkins促进连续交付的即用型工作流使开发人员可以刷新正在运行的应用程序的Java WAR文件,而不会破坏现有的依赖关系和集成。
在此博客中,我们将介绍在vSphere上运行的Photon上基于Docker的3层Java应用程序的端到端部署自动化。 DCHQ不仅可以自动执行基于Docker的应用程序的部署,还可以自动执行vSphere上虚拟机(包括Photon)的配置。 我们将介绍:
- 注册适用于vSphere的Cloud Provider
- 为vSphere创建群集
- 构建光子的机器组成模板
- 在vSphere上运行的Photon上部署3层Java应用程序
- 访问浏览器内置终端以运行容器
- 监视正在运行的容器的CPU,内存和I / O
- 向外扩展Tomcat应用服务器集群
- 触发构建后,使用Jenkins启用持续交付工作流来更新正在运行的应用程序的WAR文件
为vSphere注册云提供商
用户可以注册一个云提供商,以在13个不同的云端点上自动配置和自动扩展群集,这些端点包括vSphere,OpenStack,CloudStack,Amazon Web Services,Rackspace,Microsoft Azure,DigitalOcean,HP Public Cloud,IBM SoftLayer,Google Compute Engine等。
首先,用户可以通过导航至“ 管理” >“ 回购和云提供商” ,然后单击“ +”按钮选择“ vSphere”,从而为vSphere注册Cloud Provider。 需要提供vCenter的IP以及用户名和密码。
为vSphere创建群集
然后,用户可以创建可以跨越混合云的Linux主机集群。 可以通过导航到“ 管理” >“ 集群”页面,然后单击+按钮来完成。 您可以选择基于容量的放置策略,此群集所需的租约,然后选择所需的网络层。
构建光子的机器组成模板
用户现在可以在新创建的群集上置备许多Cloud Server。 这可以通过两种方式完成。 用户可以导航到“ 管理” >“ 主机” ,然后单击+按钮以选择vSphere,以遵循基于UI的工作流程。
另一个选择是创建计算机组成模板-使用简单的基于YAML的语法来标准化任何云上的部署。 用户可以导航到“ 管理” >“ 模板” ,然后选择“ 计算机组成” 。 为Photon创建的模板包括以下参数:
- image :引用实际的虚拟机模板名称
- 描述 –模板的一般描述
- 用户名 –为此虚拟机配置的用户名
- 密码 –为此虚拟机配置的密码。 “ {{解密| <encrypted_password>}}可用于确保密码安全。
然后,用户可以从自助服务库中请求此模板。
设置虚拟机后,用户可以导航至“ 管理” >“ 主机” ,然后单击所配置的VM旁边的“ 监视”图标以跟踪该VM的历史性能。 收集的指标包括CPU,内存和磁盘使用率,以及提取的图像和正在运行的容器。
登录到vSphere Web Client后,用户可以在vCenter中看到预配置的Photon VM。
在vSphere上运行的Photon上部署3层Java应用程序
登录到DCHQ(托管的DCHQ.io或本地版本)后,用户可以导航到“ 库” ,然后单击“ 自定义”按钮以请求“ 3-Tier Pizzashop(Nginx-Tomcat-MySQL) ”应用程序。
在此示例中,我们有一个多层应用程序,由Nginx(用于负载平衡),Tomcat(集群应用程序服务器)和MySQL(作为数据库)组成。
您会注意到Nginx正在调用BASH脚本插件来动态(或在请求时)在default.conf文件中添加应用程序服务器的容器IP。 Tomcat也正在调用BASH脚本插件,以从指定的URL部署Java WAR文件。
您会注意到, cluster_size参数使您可以指定要启动的容器数(具有相同的应用程序依赖性)。
host参数允许您指定要用于容器部署的主机。 以下是host参数支持的值:
- host1,host2,host3等–在数据中心(或集群)中随机选择一个主机进行容器部署
- <IP地址1,IP地址2等> -允许用户指定用于容器部署的实际IP地址
- <主机名1,主机名2等> -允许用户指定用于容器部署的实际主机名
- 通配符 (例如“ db- *”或“ app-srv- *”)–指定要在主机名中使用的通配符
此外,用户可以通过引用另一个图像的环境变量来创建跨图像环境变量绑定。 在这种情况下,我们进行了几个绑定-包括database.url = jdbc:mysql:// {{MySQL | container_ip}}:3306 / {{MySQL | MYSQL_DATABASE}} –动态解析数据库容器的IP和名称在请求时使用,并用于在应用程序服务器中配置数据库URL。
以下是受支持的环境变量的列表:
- {{字母数字| 8}} –创建一个随机的8个字符的字母数字字符串。 这对于创建随机密码最有用。
- {{<图像名称> | ip}} –允许您输入容器的主机IP地址作为环境变量的值。 这对于允许中间件层与数据库建立连接最有用。
- {{<图像名称> | container_ip}} –允许您输入容器的名称作为环境变量的值。 这对于允许中间件层与数据库建立安全连接(不暴露数据库端口)最有用。
- {{<图像名称> | container_private_ip}} –允许您输入容器的内部IP作为环境变量的值。 这对于允许中间件层与数据库建立安全连接(不暴露数据库端口)最有用。
- {{<图像名称> | port _ <端口号>}} –允许您输入容器的端口号作为环境变量的值。 这对于允许中间件层与数据库建立连接最有用。 在这种情况下,指定的端口号必须是内部端口号,即不是分配给容器的外部端口。 例如,{{PostgreSQL | port_5432}}将转换为实际的外部端口,该端口将允许中间件层与数据库建立连接。
- {{<图像名称> | <环境变量名称>}} –允许您将一个图像的环境变量的值输入到另一个图像的环境变量中。 这里的用例是无止境的-因为大多数多层应用程序将具有跨映像依赖关系。
用户可以在单击“ 运行”之前选择为vSphere创建的群集。
访问正在运行的容器的浏览器内终端
在Live Apps页面上,容器名称旁边应有一个命令提示符图标。 这允许用户通过代理消息队列使用安全的通信协议进入容器。 租户管理员可以定义命令白名单,以确保用户不会对正在运行的容器进行任何有害更改。
在这种情况下,我们使用命令提示符来确保Java WAR文件已部署在/ usr / local / tomcat / webapps /目录下。
监视正在运行的容器的CPU,内存和I / O利用率
一旦应用程序启动并运行,我们的开发人员将监视正在运行的容器的CPU,内存和I / O,以在这些指标超过预定义的阈值时获得警报。 这在我们的开发人员执行功能和负载测试时特别有用。
用户可以执行历史监视分析,并将问题与容器更新或构建部署相关联。 这可以通过单击正在运行的应用程序的“ 动作”菜单,然后单击“ 监视”来完成 。 可以选择一个自定义日期范围以历史查看CPU,内存和I / O。
向外扩展Tomcat应用服务器集群
如果正在运行的应用程序受到资源限制,则用户可以扩展应用程序以满足不断增加的负载。 此外,例如,用户可以在工作时间安排向外扩展,在周末安排向外扩展。
要将Tomcat服务器群集从3扩展到4,用户可以单击正在运行的应用程序的“ 操作”菜单,然后选择“ 扩展” 。 然后,用户可以为群集指定新的大小,然后单击“立即运行” 。
向外扩展完成后,用户可以执行BASH插件来更新Nginx的default.conf文件,以便它知道所添加的新应用程序服务器。 还可以安排BASH脚本插件来适应用例,例如清理日志或以定义的频率更新配置。
要在正在运行的容器上执行插件,用户可以单击正在运行的应用程序的“ 操作”菜单,然后选择“ 插件” 。 然后,用户可以选择负载平衡器(Nginx)容器,搜索需要执行的插件,并使用切换按钮启用容器重新启动。 该插件的默认参数将动态解析正在运行的Tomcat服务器的所有容器IP,并将它们添加为default.conf文件的一部分。
应用程序时间线跟踪对应用程序所做的所有更改。
触发构建时,使用Jenkins启用持续交付工作流以更新正在运行的应用程序的WAR文件
对于希望遵循“不可变”容器模型的开发人员,通过重建包含应用程序代码的Docker映像并在每次应用程序更新时旋转新容器,DCHQ提供了自动构建功能,该功能允许开发人员从Dockerfiles或包含以下内容的私有GitHub项目中自动创建Docker映像: Dockerfiles。
但是,许多开发人员可能希望使用最新的Java WAR文件来更新正在运行的应用程序服务器容器 。 为此,DCHQ允许开发人员使用Jenkins启用连续交付工作流程。 这可以通过单击正在运行的应用程序的“ 操作”菜单上,然后选择“ 连续交付”来完成 。 用户可以选择已经向DCHQ注册的Jenkins实例,将在Jenkins上生成最新WAR文件的实际Job,然后选择BASH脚本插件来获取此构建并将其部署在运行的应用程序服务器上。 保存此策略后,只要触发构建,DCHQ就会从Jenkins获取最新的WAR文件,并将其部署在运行的应用程序服务器上。
因此,开发人员将始终将最新的Java WAR文件部署在DEV / TEST环境中的运行容器上。
结论
容器化企业Java应用程序仍然是一个挑战,主要是因为现有的应用程序组合框架无法解决复杂的依赖关系,外部集成或置备后的自动扩展工作流。 此外,容器的短暂设计意味着开发人员必须启动新的容器并在每次版本更新时重新创建复杂的依赖关系和外部集成。
DCHQ具有托管和内部部署版本,可解决所有这些挑战,并通过高级应用程序组合框架简化企业Java应用程序的容器化,该框架可促进跨映像环境变量绑定,可在以下位置调用的可扩展BASH脚本插件。请求时间或事后置备,以及应用程序群集以在多个主机或区域上实现高可用性,并支持自动扩展。
免费注册在http://DCHQ.io或下载DCHQ内部部署
可以访问现成的多层Java应用程序模板以及应用程序生命周期管理功能,例如监视,容器更新,扩展/扩展和连续交付。