基于自动化发布流程多个可实现高效运维工具的实战应用分享.docx
前言曾几何时,生产部若是一件令运维头痛的事,充满着大量沟通和手动操作,可以说几乎占据着运维人员一半以上的工作时间.在部署前期,架构师要把部署的架构和运维人员交代清楚,然后写成部署文档,运维人员要把这个文档中需要开墙的部分写成开墙需求提交网络管理人员,同时和系统管理人员,交代云上部罟的虚拟机或云下部署的实体机,还需要申请上线的时间窗口。在部若期间,运维人员需要参照部署手册上的内容,一条条的实施部署,一个个的去启动应用,费时耗力,还很容易出错.一旦上线失败,就是责任事故,风睑颇大。由于测试环境和生产环境的相对独立,有时一个微小的环境上的差异,会导致整个发布卡死甚至失败.而现在,自动化发布完全取代了原先的发布,在发布前期,运维人员通过Terraform构建的完全一致的基础架构,用GitOps的流水线使得发布的代码库的唯一性,使用Jenkins使得持续集成持续发布CICD自动化,使用kubenetes使得测试环境和测试环境完全一致,而在CICD中还集成的单元测试、代码质量检测和代码安全检测等多种功能.可以说,现在的生产发布,几乎是一种水到渠成的工程.完全解决的过去发布的痛点.而在经济大环境的影响下,很多企业都需要降本增效,Serverless正在被越来越多的引入到生产环境上来,很多其他平时的任务和作业适合于这种应用,甚至AWS在Database和Redis上相继推出的Serverless版,打破了业界的认知.实际上已经是业界的一个标准,适用于各大公有云,适用性较广,可迁移性较强.在做适当修改后,在aws、tecent云也能部署.1.2.2 Jenkins不用我说几乎每个开发都知道这个工具,我用过其他的CICD工具比如ansible、tekton.argocd等,虽然其他工具也很灵活,但这同样也是缺点所在,太灵活导致配苣太多了,如果要增加功能很多都需要客户化开发.而jenkins有大H的插件可供我们选择,可以实现低代码化。1.2.3 1.ambda每一个公有云目前都有自己的功能函数,AWS中的1.ambda,aliyun中的FC1这些可以实现无服务化.下面,我将详述介绍这三个工具如何实现以及案例.2基础设施即代码2.1 什么是基础设施即代码基础设施即代码是脚本自动执行基础结构和配簿管理的一种方法。通过相应的工具集,您可以对物理环境的详细信息进行抽象,从而使您能够专注于重要的代码.基础设施即代码可以解决许多问题,例如,简化配置管理,确保您的基础设施的预配方式与预配方式相同.它不仅仅是文档,也是任何现代软件开发的版本控制的重要组成部分。2.2 解决的问题图二其次就是官方文档虽然比较完整,但是要花一些时间才能找到如何在代码中设置更好的设置.由于GUi设置的名称和代码中的设者并不总是匹配的,因此可能有必要在某种程度上猜测内容,比如上面GUI图对应的部分代码如图三,从中可以看到,对于图中S3对象存储GUl,并没有办法匹配代码中所有的配冒信息.也许是出于对以上缺点的考虑,出现了terraform这个工具,这个工具有如下特点:A.声明式配置:Terraform使用一种声明式的编程语言来描述和定义所需的基础设施资源,这种声明式配置方式使得用户可以清晰地定义所需的资源和其属性,而不耗要关心底层的具体实现细节.B.版本控制Jerraform支持将基拙设施配置代码存房在版本控制系统中,如Git,这使得用户可以轻松地跟踪和管理基础设施的配覆历史,以及回滚到之前的版本.C.多云和混合云支持Jerraform可以与多个云服务提供商集成,如AWS,Azure.GoogleCloud等,用户可以使用Terraform来管理踣多个云平台的基础设施,实现资源的跨云迁移和复制.D.自动化部署和更新:Terraform通过执行计划来自动化基础设施的部署和更新过程,用户只需要编写一次基础设施配三S代码,然后通过运行Terraform命令来创建、修改或删除资源.E高可用性和可伸缩性:Terraform提供了一些高级功能,如故獐恢复、负载均衡和自动扩展等,以确保基础设施的高可用性和可伸缩性.F.安全性和审计:Terraform支持对基础设施资源的访问控制和权限管理,以及对操作的审计日志记录,这有助于保护基础设施的安全性和合规性.2.4实际案例该案例要构建一个项目,在阿里云上构建三个VPC,分别为computerVPC1storageVPCJaCadeVPC,其中computerVPC中放2S一个ACK的容器集群,storageVPC中放者Rds、Redis、Kafka,faadeVPC中设置对外的A1.B、MSE.SNAT等.三个VPC间用企联网CEN打通.为了高可用,设占了三个可用区,三个可用区结合三个VPC共设置九个VSWitCh。总体架构,如图四图四Terraform要对这个较为复杂的项目进行编码时,我们要设计一个总的项目目录tf-project,其中包含environmenst和modules两个文件夹,在environment中包含dev、prod两个目录。这体现了我们希望设计的目标,那就是modules共用,但环境的terrafOrm代码和各自的目录下,如图五.图五在dev和prod的main.tf中,写出总体的设计代码,如下所示,其中locals并没有给出.module"vpc-computer"source-"./.modulesvpc"avaiIability-zone=local.availability-zonevpc_name=local.vpc_computer_namevpc_cidr_block=local.vpc_computer_cidr_blockvsw_computer_node_cidrs"local.vsw_computer_node_cidrsvsw_computer_terway_cidrs"local.vsw_computer_terway_cidrsmodule"vpc_storage"(source="././modules/vpc"availability-zone=local.availability-zonevpc-ame三local.vpc_storage_namevpc_cidr_block-local.vpc_storage_cidr_blockvsw-cidrs"local.vsw_storage_cidrs)i»odule"vpc_facade"(source=* *./.modulesvc-availability-zone»local.availability-zonevpc-ame-local.vpcfacade-namevpc_cidr_block-local.vpc_facade_cidr_blockvsw_cidrs=local.vsw-facade-cidrsmodule"secgroup*source=ZmodulesZsecgroup-vc-,id-module.vpc_facade.vpc-idmodule"secdbgroup'*(source-modulessecgroup,'vpc-id-module.vpc-storage.vpc-idJmodule-ecs*source=* ././modules/ecs"region=local.regioninstance-name=',bastion-l,vsw-id-module.vpc-facade.vsws-idsecgroup-idmodule.secgroup.secgroup-idJmodule"ack”source-modulesack,k8s-name-prefix=local.ack-nameavailability-zone=local.availability-zoneack_vswitch_id=module.vpc-comuter,vsws-coputer-idack-terway-vswitch-id-module.vpc-co<nputer.vsws-computer-terway-idack-service-cidr-local.service-cidrmodule"rds"source=m././modules/rdsHistace-name=local.rds-instance-nameinstance-type* local.rds-istace-tyeinstance-storage«local.rds-istance-storagesecurity-ipslocal.rds-security-ipsVPJid=module.vpc-storageVPjidvswitch-id=module.vpc-storage,vsws-idsecurity-group-ids-module.secgroup.secdbgroup-idavailability-zone-local.availabilityzonedb-name=local.rds-db-namedb-accout=local.rds-db-accountdb-passwd«local.rds-db-passwtd)module*'redis-source-"./.modulesredis*db-instance-name三local.redis-instance-nameinstance-class=local.redis_instance_classsecurity-ips=local.redis-security-isvswitch-id-module.vpc-storage.vsws-idavailability-zonelocal.availability_zoneaccount-name=local.redis_account_nameaccount-passwd=local.redis-accout-passtd)module,'kafka"(source./.moduleskafka,*name=local.kafkapartition-num=local.kafka-namepartition11umdisk-tye=local.kafka-disk-typedisk-sizelocal.kafkaiomax«local.kafkadisksizeiomaxSPeJtyPelocal.kafka-spec-typevswitch-id=module.vpc-storage.vsws-id1slb-speclocal.mse-slb-specgateway-name«local.mse-specVSWJdvpc-idsource=module"mse”source="./.modulesmse0local.mse_gateway_namemse-specmodule.vpc-computer.vsws_computer_terway_idmodule.vpc_co<nuter.vpc-idmodule"certs-"./.modulescertification-module"alb"source三',././modules/alb-alb-name-local.alb_gateway_nameload_balancer_edition=local.alb-editionaddress-type