当前位置: 首页 > 科技观察

离线网络环境下一键部署

时间:2023-03-22 17:22:28 科技观察

关键词封闭网络:相对封闭的网络环境,只有有限的资源如:maven镜像仓库,Centos/Ubuntu源等,无法连接到互联网的网络环境.一键部署:这里所说的“一键部署”不仅仅指这样一种场景:“编码-->测试-->提交-->CI/CD-->部署完成”。这里再多描述一下:“在离线网络环境下,运行一个deploy.sh文件,可以看到所有的基础设施服务如:Nexus、Gitlab、Mongodb等都已经部署好了,然后你在编辑业务代码的时候提交到远程仓库,会触发CI、编译、测试、打包、部署,至此,所有业务模块部署成功,实现基础设施即代码。背景在这个互联网无处不在的时代,网络安全是尤为重要,尤其是在金融、电信等领域,网络安全问题将带来不可估量的损失。基于数据安全、保密和独立性的考虑,为了提供更好的服务,有效保护内部网络的安全,我们需要将这些对外开放的主机与很多内部网络设备隔离开来,安全策略限制了互联网的连接。在这种情况下y,在对外提供友好服务的同时,内部网络可以得到最大程度的保护,这也导致了“封闭网络”的形成,因为内部网络无法连接到互联网。痛点我们通常有以下需求:在无法联网的环境中,搭建一套dev、qa、staging包括搭建CI等环境供不同角色使用,但由于安全策略或其他安全限制,部分基础服务无法使用。从互联网获取,如Kubenetes、Mongodb、Kafka等基础组件服务,这给自动化部署和持续交付带来了不便,尤其是在系统严重依赖第三方服务的情况下。本文以复杂系统的部署为例,介绍如何在封闭的网络环境下实现一键式部署。解决方案基于主要原因:“更容易迁移和扩展”,我们使用Docker来部署基础组件服务。对于一个封闭的网络环境,是不可能获取到上面提到的Mongodb镜像等基础服务镜像的。当然,我们可以使用dockersave将构建好的镜像保存为tar包,使用U盘等介质将tar包拷贝到内网,然后使用dockerload命令恢复镜像。对于一个比较复杂的系统(依赖比较多的基础组件),如果每个组件都这样操作,会带来很大的工作量,也比较容易出错,对后期的维护也是一个很大的挑战。.所以使用Nexus是一个不错的选择,使用Nexus作为Docker仓库来存储所有的基础组件镜像。这样既解决了离线网络无法下载安装包的问题,??又简化了配置,保持了内网环境和开发环境的一致性,为一键部署提供了前提条件。网络问题解决了,接下来就是部署和配置管理了。同样的道理,如果每个基础服务都需要手动部署,往往费时费力,难以实现故障排除,并可能产生潜在的错误。所以我们需要一个自动化的部署工具来提高工作效率,降低维护成本。经过对主流自动化工具的横向比较,最终选择Ansible作为配置管理和自动化部署工具。那么什么是Ansible?下面将给出详细描述。解决了以上问题后,就可以实现自动离线网络部署了。整个过程分为3个阶段,分别是:BaseDeploy。主要部署了Docker、Nexus和Gitlab这些所有服务所依赖的基础组件。Docker是基础平台。Nexus和Gitlab也部署在Docker平台上。Nexus作为私有Maven仓库和私有Docker仓库,Gitlab作为私有远程代码仓库。基础设施部署。现阶段主要使用Ansible部署集群依赖的基础服务,如Kubernetes(通证平台)、Kafka、Mongodb等。业务部署。最后一个阶段是测试持续集成和持续部署阶段,使用GoCD作为CI工具,实现业务服务模块在CI上的自动化部署。做法如下图所示:1.BaseDeploy上面提到了Nexus作为私有的DockerRegistry和MavenRepository。Nexus是一个仓库管理器,大大简化了自己内部仓库的维护和外部仓库的访问。使用Nexus,您可以从一个地方完全控制您维护的存储库中每个工件的访问和部署。Nexus存储了所有基础设施的镜像文件,如Kubernetes、Mongodb、Zookeeper、Kafka镜像等,部署Nexus需要一个Nexus镜像文件。为InfrastructureDeploy提供基础环境和部署中的所有依赖组件。同时,为了方便Nexus的迁移和维护,我们还将Nexus部署在了Docker平台上。使用简单的shell脚本完成BaseDeploy,一次性部署Docker、Nexus和Gitlab(Gitlab作为私有git仓库)。deploy.sh代码如下:#!/bin/bashfunctioninit_docker{...}#installdockerfunctionload_images{...}#loaddockercontainerfunctionrun_service{...}#startnexus,gitlab等服务functionupload_nexus_data{...}#uploadnexusdatafunctionupload_gitlab_data{...}#Uploadgitlabdataforiin${HOST_LIST[@]};doinit_docker$iupload_data$2run_service$1donePS:在运行deploy.sh之前,所有主机需要配置ssh公钥登录,避免提示自动化期间的密码。运行deploy.sh以部署Nexus和Gitlab。如下图,Nexus可以运行dockerpull获取所有组件的镜像,包括kubernetes、ansible等。GitLab如下图所示,也可以运行gitclone获取包括InfrastructureDeploy在内的所有代码仓库部署脚本。如果条件允许,可以为Nexus和Gitlab创建DNS记录,也可以修改本地的/etc/hosts文件,使用特定的域名访问Nexus和Gitlab,比如下面使用的nexus-server访问Nexus和gitlab-server访问Gitlab。2.InfrastructureDeploy如前所述,我们使用Ansible来实现基础设施的自动化部署。我们知道目前主流的自动化部署工具有Puppet、Chef、Ansible。相比之下,Chef对开发者更“友好”,而Puppet更适合运维和系统管理任务,但我们选择Ansible,主要原因是:Ansible通过ssh进行所有操作,不需要安装在一个remoteserver在使用Chef引擎和Puppet时,需要在它管理的服务器上安装客户端(虽然Chef声称不能安装,但是它的agent-less版本支持的功能非常有限),Ansible会充分利用现有的东西,没有其他要求[注]。通俗地说,Ansible的部署过程就是在一台或几台服务器上执行一系列的命令。Ansibleplaybook是Ansible一个比较强大的配置管理组件,实现了基于文本文件编排执行的多个任务,并重复执行。所以我们选择了Ansible作为配置管理和自动化部署工具。Ansible的工作原理如下:(图片来自:Ansible官网)Ansible用于让整个流程透明化,将每一个部署作业作为一个独立的ansibleplaybook角色来实现,从而可以在不同的环境中部署指定的服务,提高了部署代码Reusability的效率。同时与Nexus配合,形成自动化部署的闭环。它可以在不依赖网络的情况下提供所有依赖部署的组件,所有的应用都会以Docker镜像的形式提供。离线环境下使用Ansible是完全可行的,但是离线环境下不能直接安装Ansible。为了统一管理,我们也使用Docker镜像来提供Ansible。在内网成功部署Nexus后,使用dockerpullnexus-server:5000/:获取Ansible镜像。同时将Ansible所需的playbook角色文件保存在Gitlab中,执行gitclonegitlab-server:2289/.git下载deploy代码库。部署代码库结构如下:├──environments│└──uat│└──inventory│└──dev│└──inventory├──roles│├──docker│├──kubernetes│├──mongodb-cluster├──docker.yml#在PaaS集群所有VM节点上安装docker├──kubernetes.yml#部署PaaS平台├──mongodb-cluster.yml#部署mongodbsharding集群└──all.yml#all.yml一键部署所有基础设施----include:mongodb-cluster.yml-include:kubernetes.yml-include:docker.yml运行如下命令实现基础设施一键自动部署:dockerrun--rm-vWORKDIR:$(pwd)ansible:2.2.1ansible-playbook-iuat/inventoryall.yml3。BusinessDeploy***BusinessDeploy是一个标准的持续集成/交付流程,使用GoCD作为CI/CD工具,完成业务模块的持续集成和部署。持续集成和持续交付可以参考https://en.wikipedia.org/wiki/Continuous_delivery/总结玩过红色警戒的朋友应该知道,一开始你只有一个基地,需要收集资源,升级建筑,组建军队进攻,直到所有的国家都被消灭,一切都自给自足。当然,红色警戒可以离线玩。上述过程与红色警报非常相似。你只有一个base,它是一个zip包,里面有部署需要的所有文件,比如Nexus数据,Gitlabrepo等,按照特定的目录结构,使用U盘或其他存储介质复制到离线网络环境,就像双击红警基地一样,运行deploy.sh一键部署所有基础设施服务。升级所有组件也相对容易。我们只需要将升级后的Docker镜像复制到内网,重新执行Ansible脚本即可更新基础服务。