版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
前言在传统的业务环境中,我们的应用部署或者更新都是采用手工的方式,但是在企业内部,应用架构一般都采用微服务,大部分项目都会对应几十个、上百甚至上千个微服务,并且还不仅仅只有一个项目,所以采用收工方式上线是不太现实的事情,特别是随着应用的增多,对应的工作量也变得不可想象。由于上线的过程一般比较固定,大都是提前规定好、比较一致的流程,因此采用工具来完成这类“死板”的工作时比较推荐的方式,同时也能减少手工操作所带来的故障风险。本章主要介绍在生产环境中持续集成(ContinuousIntegration,CI)与持续部署(ContinuousDeployment,CD)的使用,实现Jenkins流水线脚本自动发布应用到Kubernetes集群中,当然CI/CD是DevOps中非常重要的一个环节。一:CI/CD介绍CI/CD是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD的核心概念是持续集成、持续交付(ContinuousDelivery,CD)和持续部署。作为一个面向开发和运营团队的解决方案,CI/CD主要针对在集成新代码时所引发的问题(也称“集成地狱”)。具体而言,CI/CD在整个应用生命周期内,(从集成和测试阶段到交付和部署)引入了持续自动化和持续监控,这些关联的事物通常被称为“CI/CD管道”,由开发和运维团队以敏捷方式协同支持。1:持续集成(CI)现代应用开发的目标是让多位开发人员同时开发同一个应用的不同功能。但是,如果企业安排在一天内将所有分支源代码合并在一起,最终可能导致工作烦琐、耗时,而且需要手动完成。这是因为当一位独立工作的开发人员对应用进行更改时,有可能会有其他开发人员同时进行更改,从而引发冲突。持续集成可以帮助开发人员更加频繁地将代码更改合并到共享分支或主干中。一旦开发人员对应用所做的更改被合并,系统就会通过自动构建应用并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保更改没有对应用造成破坏。这意味着测试内容涵盖了从类和函数到构成整个应用的不同模块,如果自动化测试发现新代码和现有代码之间有冲突,持续集成可以更加轻松快速地修复这些错误。2:持续交付(CD)完成持续集成中构建单元测试和集成测试的自动化流程后,通过持续交付可以自动将已验证的代码发布到存储库。为了实现高效的持续交付流程务必要确保持续交付已内置于开发管道。持续交付的目标是拥有一个可随时部署到生产环境的代码库。在持续交付中,每个阶段(从代码更改的合并到生产就绪型构建版本的交付)都涉及测试自动化和代码发布自动化。在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中。3:持续部署(CD)对于一个成熟的CI/CD管道来说,最后的阶段是持续部署。作为持续交付(自动将生产就绪型构建版本发布到代码存储库)的延伸,持续部署可以自动将应用发布到生产环境中。由于生产之前的管道阶段没有手动门控,因此持续部署在很大程度上都得依赖精心设计的测试自动化。实际上,持续部署意味着开发人员对应用的更改在编写后的几分钟内就能生效,这更加便于持续接收和整合用户反馈。总而言之,所有这些CI/CD的关联步骤都有助于降低应用的部署风险因此更便于以小件的方式(非一次性)发布对应用的更改。不过,由于还需要编写自动化测试以适应CI/CD管道中的各种测试和发布阶段,因此前期投资会很大。4:CI和CD的区别CI/CD中的CI即持续集成,它属于开发人员的自动化流程。成功的CI意味着应用代码的最新更改会定期构建、测试并合并到共享存储中。该解决方案可以解决在—次开发中有太多应用分支,从而导致相互冲突的问题。CI/CD中的CD诣的是持续交付或持续部署,这些相关概念有时会交叉使用。两者都事关管道后续阶段的自动化,但它们有时也会单独使用,用于说明自动化程度。持续交付通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如Gitlab或容器注册表),然后由运维团队将其部署到实时生产环境中,旨在解决开发和运维团队之间可见性及沟通较差的问题,因此持续交付的目的就是确保尽可能减少部署新代码时所需的工作量。持续部署指的是自动将开发人员的更改从代码库发布到生产环境中以供客户使用,它主要为解决因手动流程降低应用交付速度,从而使运维团队超负荷的问题。持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化。CI/CD既可能仅指持续集成和持续交付构成的关联环节,也可以指持续集成、持续交付和持续部署这3个方面构成的关联环节。更为复杂的是有时持续交付也包含持续部署流程。纠缠于这些语义其实没有必要,只需记得CI/CD实际上就是一个流程(通常表述为管道),用于在更大程度上实现应用开发的持续自动化和持续监控。二:Jenkins流水线介绍提到CI工具,首先想到的就是“CI界”的大佬——Jenkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的CI工具,但是都不足以撼动Jenkins的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的CI工具不足以支撑这些很复杂的需求。但是Jenkins丰富的插件基本上可以满足任何场景。1:什么是流水线Jenkins流水线是一套插件,它支持在Jenkins中实现和集成持续交付流水线(ContinuousDeliveryPipeline)。流水线提供了一组可扩展的工具,用于通过PipelineDSL将简单到复杂的交付流水线以代码的形势展现,类似于基础设施即代码。持续交付流水线会经历一个复杂的过程:从版本控制、向用户和客户提交软件、软件的每次变更(提交代码到仓库)到软件发布(Release)。这个过程包括以一种可靠并可重复的方式构建软件,以及通过多个测试和部署阶段来开发构建好的软件(称为Build)。Jenkins流水线的定义被写在一个文本文件中(一般为Jenkinshle),该文件“定制”了整个构建软件的过程.Jenkinsfile也可以被提交到项目的代码仓库中,在Jenkjns中可以直接引用。将持续交付流水线作为应用程序的一部分,像其他代码一样进行版本化和审查,这是流水线即代码的基础。创建Jenkinsfile并提交到代码仓库中的好处如下:自动为所有分支创建流水线构建过程。在流水线上进行代码复查/迭代。对流水线进行审计跟踪。流水线的代码可以被项目的多个成员查看和编辑。可以对Jenkinsfile进行版本控制。2:Jenkins流水线Jenkins流水线主要分为声明式分和脚本式两种,包含piplind(流水线)、node(节点)、stage(阶段)、step(步骤)等区块。(l)pipelinepipeline是用户定义的一个持续交付(CD)流水线模型。流水线的代码定义了整个构建过程,包括构建、测试和交付应用程序的阶段。另外,pipeline块是声明式流水线语法的关键部分。(2)nodenode是—个机器,它是Jenkins环境的-部分,另外,node块是脚本化流水线语法的关键部分。(3)stagestage块定义了在整个流水线的执行任务中概念不同的子集(比如Build、Test、Deploy阶段),它被许多插件用于可视化Jenkins流水线当前的状态/进展。(4)Step本质上是指通过一个单一的任务告诉Jenkins在特定的时间点需要做什么,比如要执行shell命令,可以使用shSHELL_COMMAND。从上文可以了解,Jenkins流水线分为脚本式和声明式,而声明式是“新一代”的流水线,比脚本式更加灵活,可读性更强,并且声明式流水线支持以图形化的方式进行编辑,所以声明式流水线是着重学习的对象。三:安装流水线工具1:安装jenkins略本案例账号密码adminadmin1232:安装Gitlab略本案例账号密码rootaptech1!3:安装Harbor略本案例账号密码adminXuaiwen330三:添加凭据在使用Jenkins、GitLab、Harbor、Kubemetes打造DcvOps平台实现CI/CD时,需要涉及很多证书、账号和密码、公钥和私钥的配置,这些凭证需要放在一个统一的地方管理,并且能在整个流水线中使用,而Jenkms提供的Credentials插件可以满足以上要求,并且在流水线中也不会泄露相关的加密信息。所以Harbor的账号和密码、GltLab的私钥、Kubernetes的证书均使用Jenkins的Credentials管理。1:添加Kubernetes证书在安装和维护Kubernetes集群时,都是使用kubectl操作集群,而kubectl操作集群需要-个KUBECONFIG文件,我们使用Jenkins控制Kubernetes时,也是使用该文件,所以该文件需要放置在Credentials中,之后可以被Jenkins的Kubernetes插件使用。首先需要找到集群中的KUBECONFIG,一般是kubectl节点的~/.kube/config文件,或者是KUBECONFIG环境变量所指向的文件。(1)准备config文件将kubernetes的master主机中config文件拷贝出来放到本地主机上。(2)上传config文件Dashboard-->ManageJenkins-->Credentials点击system的“全局”域,并添加凭据注意:ID:study-k8s-kubeconfig可以给每个凭据添加一个描述,便于在引用的时候区分不同的凭据(3)用上一步中生成的凭据创建kubernetes连接Dashboard-->ManageJenkins-->NodesandClouds-->Clouds名称为:kubernetes-study2:配置Harbor账号和密码(1)在jenkins中找到凭据项Dashboard-->ManageJenkins-->Credentials(2)添加Harbor凭据填写harbor用户的账号密码本案例的账号密码为admin和Xuaiwen3303:添加GitlabKEY在搭建GitLab时,将Jenkms服务器的公钥放在GitLab中,之后Jenkins就可以通过自己的私钥登录GitLab,然后下载和上传代码。在流水线的执行过程中,往往第—个过程就是下载代码,所以Jenkjns的流水线需要有下载代码的权限。此时可以将Jenkins的私钥保存至Jenkins凭证中,之后在流水线中引用即可。单击AddCredentials类型选择为SSHUsernamewithprivatekey,Userame:用户名,无强制性。PrivateKey:Jenkins服务器的私钥,一般位于jenkins主机的~/.ssh/id_rsa。4:最后的所有凭据5:配置AgentDashboard-->ManageJenkins-->Security找到代理项,设置端口为50000备注:有了这个代理,在kubernetes上为节点做个标签(本案例的标签为“build=true”),之后的jenkinsfile的agent就会根据这个标签创建Pod。在kubernetes中为node1做标签[root@k8s-master~]#kubectllabelnodek8s-node01build=true6:将jenkins的公钥添加给Gitlab(1)复制jenkins的公钥(2)粘贴给Gitlab注意:如果Gitlab上没有这个公钥,就不能用ssh的协议克隆备注:可以在这里做个快照,方便其他实验四:自动触发主机IP地址web服务器03jenkins04gitlab05之前的构建都是手动选择分支进行构建的,在实际使用时,项目可能有很多,如果都是手动触发,可能比较消耗人力,所以推荐按需配置自动触发,即提交代码后自动触发Jenkins构建任务。1:在jenkins主机上分发秘钥(2)推送公钥到web主机[root@jenkins~]#ssh-copy-id03[root@jenkins~]#ssh-copy-id052:在gitlab中创建一个空项目项目名称:mypro访问等级:public项目url:05/root/mypro.git注意:Gitlab中添加的项目,默认的分支为main分支,不是master分支3:在gitlab中添加代码文件4:在web服务器上安装httpd(1)关闭防火墙[root@web~]#systemctlstopfirewalld[root@web~]#setenforce0(2)安装httpd[root@web~]#yum-yinstallhttpdrsync注意:需要在web端安装rsync用于同步(3)启动服务[root@web~]#systemctlstarthttpd4:在jenkins主机上安装ansible(3)部署案例yum仓库[root@jenkins~]#curl-o/etc/yum.repos.d/CentOS-Base.repo/repo/Centos-7.repo[root@jenkins~]#curl-o/etc/yum.repos.d/epel.repo/repo/epel-7.repo[root@jenkins~]#yumcleanall(4)安装ansible[root@jenkins~]#yuminstallansible-y[root@jenkins~]#vim/etc/ansible/hosts[webservers]035:添加web服务器的凭据6:在jenkins中添加远程主机Dashboard-->ManageJenkins-->SSHremotehosts-->新增7:新建项目(1)在jenkins中新建一个Freestyleproject类型的项目,名称为mypro(3)指定项目Git仓库地址注意:指定分支要修改成*/main不要用master(4)指定ansible插件选择“BuildSteps”→“增加构建步骤”→“InvokeAnsibleAd-HocCommand”,Module设置为:synchronize:指定rsync同步Moduleargumentsorcommandtoexecute设置为:src=${WORKSPACE}dest=/var/www/htmlrsync_opts=--exclude=.git备注:${WORKSPACE}:该变量指向的路径是jenkis主机从git服务器获取到的项目:/root/.jenkins/workspacersync_opts=--exclude=.git:同步时将.git文件除外,该文件不同步(5)为web主机添加脚本BuildSteps-->增加构建步骤-->Executeshellscriptonremotehostusingssh添加要执行的脚本chmod-R755/var/www/html(5)开始构建(6)访问测试03/mypro/8:设置jenkins的自动触发(1)设置“构建触发器”项目-->配置-->构建触发器,勾选项目的webhook(2)设置“构建触发器”的高级选项(3)复制出响应的参数Token:8e87a846ca2d5747b04122d65054dd00webhookURL:04:8080/jenkins/project/mypro9:设置Gitlab的触发机制(1)找到Admin选项单击Menu-->Admin(2)设置网络允许外部访问Menu-->Admin-->Settings-->Network-->Outboundrequests(3)设置Outboundrequest(4)设置项目的webhook参数打开自己创建的项目,Settings-->Webhooks填写前面步骤中生成的webhook的URL和Token最后点击页面底部的AddWebhook按钮(5)点击测试按钮测试(6)在gitlab中向项目中添加文件或修改原有文件内容五:自动化构建java项目主机IPk8s-master01k8s-node0102k8s-node0203Jenkins04Gitlab05Harbor061:在Harbor中添加项目,名称为kubernetes2:所有的docker主机(包括kubernetes主机)设置harbor仓库(1)设置各个主机的私有仓库cat<<EOF>/etc/docker/daemon.json{"registry-mirrors":[""],"exec-opts":["native.cgroupdriver=systemd"],"insecure-registries":["06"]}EOF(2)重启docker进程systemctldaemon-reloadsystemctlrestartdocker(3)测试私有仓库dockertagcentos:706/kubernetes/centos:7dockerlogin-uadmin-pXuaiwen33006dockerpush06/kubernetes/centos:73:分发秘钥[root@Jenkins~]#ssh-copy-id05备注:如果向gitlab主机分发了公钥,可以使用http的协议拉取代码4:向gitlab添加jenkins公钥备注:如果在gitlab程序中设置了jenkins公钥,可以使用ssh的协议拉取代码4:创建java测试用例(1)在gitlab中创建组,组名为kubernetes (2)在gitlab的kubernetes组中添加项目,项目来自/dukuan/spring-boot-project.git注意:在创建导入项目时,路径要选root,不要选kubernetes5:定义jenkinsfilejenkinsfile定义流水线的步骤包括拉取代码、执行构建、生成镜像、更新Kubernetes资源等。本案例将jenkinsfile放置于项目源代码一并管理,也可以单独放置于一个Git仓库进行管理。接下来在GitLab的源代码中添加jenkinsfile。首先单击代码首页的“+’,然后单击Uploadfile上传编辑好的文件,文件名字为Jenkinsfile文件内容参考本文件附件Jenkins5:编写dockerfile接下来在GitLab的源代码中添加Dockerfile。首先单击代码首页的“+’,然后单击Uploadfile上传编辑好的文件,文件名字为Dockerfile,Dockerfile需要和Jenkinsfile在同一级目录下。#基础镜像可以按需修改,可以更改为公司自有镜像FROM/dotbalo/jre:8u211-data#jar包名称改成实际的名称,本示例为spring-cloud-eureka-0.0.1-SNAPSHOT.jarCOPYtarget/spring-cloud-eureka-0.0.1-SNAPSHOT.jar./#启动Jar包CMDjava-jarspring-cloud-eureka-0.0.1-SNAPSHOT.jar6:定义kubernetes资源(1)在kubernetes中为node1做标签[root@k8s-master~]#kubectllabelnodek8s-node01build=true备注:为agentPod调度到指定的节点(1)创建命名空间[root@k8s-master~]#kubectlcreatenamespacekubernetes(2)创建secret保存harbor的认证信息[root@k8s-master~]#kubectlcreatesecretdocker-registryharborkey--docker-server=06--docker-username=admin--docker-password=Xuaiwen330--docker-email=xaw330@-nkubernetes(3)编写应用的Deployment[root@k8s-master~]#vimspring-boot-project.yaml---apiVersion:v1kind:Servicemetadata:creationTimestamp:nulllabels:app:spring-boot-projectname:spring-boot-projectnamespace:kubernetesspec:ports:-name:webport:8761protocol:TCPtargetPort:8761selector:app:spring-boot-projectsessionAffinity:Nonetype:NodePortstatus:loadBalancer:{}---apiVersion:networking.k8s.io/v1kind:Ingressmetadata:creationTimestamp:nullname:spring-boot-projectnamespace:kubernetesspec:rules:-host:http:paths:-backend:service:name:spring-boot-projectport:number:8761path:/pathType:ImplementationSpecificstatus:loadBalancer:{}---apiVersion:apps/v1kind:Deploymentmetadata:creationTimestamp:nulllabels:app:spring-boot-projectname:spring-boot-projectnamespace:kubernetesspec:replicas:1selector:matchLabels:app:spring-boot-projectstrategy:rollingUpdate:maxSurge:1maxUnavailable:0type:RollingUpdatetemplate:metadata:creationTimestamp:nulllabels:app:spring-boot-projectspec:affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:-podAffinityTerm:labelSelector:matchExpressions:-key:appoperator:Invalues:-spring-boot-projecttopologyKey:kubernetes.io/hostnameweight:100containers:-env:-name:TZvalue:Asia/Shanghai-name:LANGvalue:C.UTF-8image:nginximagePullPolicy:IfNotPresentlifecycle:{}name:spring-boot-projectports:-containerPort:8761name:webprotocol:TCPresources:limits:cpu:994mmemory:1170Mirequests:cpu:10mmemory:55MidnsPolicy:ClusterFirstimagePullSecrets:-name:harborkeyrestartPolicy:AlwayssecurityContext:{}serviceAccountName:default(4)创建该资源(该资源会调度到node01或node02)[root@k8s-master~]#kubectlcreate-fspring-boot-project.yam
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2020-2021学年江苏省南京市江宁区小学三年级上册语文期末试题及答案
- 滚槽课程设计
- 2022-2023年广东省深圳市福田区六年级上册语文期末试卷及答案
- 2022-2023年广东深圳市龙岗区六年级上册期中数学试卷及答案(北师大版)
- 2020-2021学年重庆市永川区小学二年级下册数学期末试题及答案
- 三年级数学计算题专项练习汇编及答案
- 一年级数学计算题专项练习汇编
- 2024医疗设备智能化升级改造及保养服务合同范本3篇
- 第三单元教案15的认识和加减法
- Unit2MyschoolbagPartBReadandwriteLet'ssingPartCStorytime教案-2024-2025学年人教PEP版英语四年级上册
- 真空管太阳能热水工程解决方案
- 棋牌室合伙人协议
- 教师个人履职工作总结一级教师
- 国开电大本科《管理英语3》机考总题库
- 沥青路面结构监理细则
- YY/T 0506.7-2014病人、医护人员和器械用手术单、手术衣和洁净服第7部分:洁净度-微生物试验方法
- GB/T 5974.1-2006钢丝绳用普通套环
- GB/T 3955-2009电工圆铝线
- 药品专业知识培训答案
- 阿里JAVA编码规范手册
- PMC知识培训课件
评论
0/150
提交评论