DevOps意为“Development”和“Operations”,即为开发人员和运维人员之间沟通合作的开发模式,通过自动化“软件交付”和“架构更变”的流程,实现开发运维一体化,使得开发构建、测试、发布能够更加快捷、频繁和高效稳定。DevOps是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保证部门之间的沟通、协作与整合。它的出现时由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。其最大的特点就是极速的迭代和快速的用户反馈。
云效,云原生时代一站式BizDevOps平台,支持公共云、专有云和混合云多种部署形态,通过云原生新技术和研发新模式,助力创新创业和数字化转型企业快速实现研发敏捷和组织敏捷,打造“双敏”组织,实现 10 倍效能提升。
如今,业务追求上云,业务流程也可以上云。阿里的云效DevOps全家桶,真正的为人们带来便利,今天,我就以jenkins+gitlab基于k8s集群实现自建DevOps系统的方式部署开源微服务PiggyMetrics,与云效DevOps对比,告诉大家真正的免运维,实现高效的业务开发流程。
自建DevOps实现CI/CD-部署微服务PiggyMetrics
这里,我先从自建devops系统并部署微服务应用开始
测试的devops系统架构流程如下:
基于现有的kubernetes集群和harbor镜像仓库,搭建以docker运行的gitlab代码仓库和CI工具jenkins,并编写自动化流水线脚本。
1.部署jenkins
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。我们通过容器部署jenkins服务
容器名称:jenkins;端口映射:8080:8080;使用root身份生成容器;
[root@master opt]# docker run -itd --name jenkins -p 8881:8080 -u root -v /home/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /usr/bin/kubectl:/usr/local/bin/kubectl -v /root/.kube:/root/.kube jenkins/jenkins:2.262-centos
设置jenkins
在web端通过http://IP:8080访问Jenkins
查看默认密码:
[root@master ~]# docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword 54670064056e42a2a47485a5e3356e57
输入密码并点击“继续”
选择“安装推荐的插件”,如图所示:
插件安装完成后自动转入管理员用户创建界面
输入用户信息,点击“保存并完成”
配置完URL后使用新建的用户登录Jenkins,如图
2.部署Gitlab
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。
我们这里也是通过容器部署gitlab服务
容器名称:gitlab;端口映射:1022:22、81:80、443:443;容器重启策略:always;
[root@master opt]# docker run -itd --name gitlab -p 81:80 -p 443:443 -v /root/gitlab/config:/etc/gitlab -v /root/gitlab/logs:/var/log/gitlab -v /root/gitlab/data:/var/opt/gitlab --restart always gitlab/gitlab-ce:12.9.2-ce.0
设置root用户信息并使用root用户登录Gitlab,如图所示:
创建项目“Create a project”
我们就可以在本地通过git上传代码到仓库
git init git remote add origin http://ip/xxxx.git git add . git commit -m 'upload' git push -u origin master
3.配置Jenkins对接Gitlab
gitlab设置Outbound requests
生成“Access Tokens”并命名为jenkins
设置Jenkins取消对’/project’ end-point进行身份验证;
jenkins添加gitlab api token
4.配置Jenkins连接maven
采用docker in docker的方式在Jenkins内安装maven
[root@master ~]# cp apache-maven-3.6.3-bin.tar.gz /root/jenkins/ [root@master ~]# docker exec -it jenkins bash [root@b957b62337cc /]# cd /var/jenkins_home/ [root@b957b62337cc jenkins_home]# tar -zxvf apache-maven-3.6.3-bin.tar.gz -C . [root@2927036f2450 jenkins_home]# mv apache-maven-3.6.3 /usr/local/maven //配置maven环境变量 [root@b957b62337cc jenkins_home]# vi /etc/profile export M2_HOME=/usr/local/maven export PATH=$PATH:$M2_HOME/bin [root@2927036f2450 /]# vim /root/.bashrc if [ -f /etc/bashrc ]; then . /etc/bashrc source /etc/profile fi
在Jenkins中配置maven信息
Dashboard-全局工具配置
5.配置CI/CD
新建流水线任务
配置触发器
编写流水线脚本
构建微服务项目中的gateway和config服务,
将构建后的镜像自动上传到Harbor仓库,
并自动发布gateway和config服务到Kubernetes集群的springcloud命名空间下
node{ stage('git clone'){ //check CODE 从代码仓库克隆 git credentialsId: 'ad561b3b-5252-43d5-b9c4-ec9bece0134c', url: 'http://IP/xxx.git' } stage('maven build'){ //maven编译 sh '''/usr/local/maven/bin/mvn package -DskipTests -f /var/jenkins_home/workspace/xxx''' } stage('image build'){ //构建镜像,并将镜像ID变量作为tag sh ''' echo $BUILD_ID docker build -t 10.24.2.10/xxx/gateway:$BUILD_ID -f /var/jenkins_home/workspace/xxx/gateway/Dockerfile /var/jenkins_home/workspace/xxx/gateway docker build -t 10.24.2.10/xxx/config:$BUILD_ID -f /var/jenkins_home/workspace/xxx/config/Dockerfile /var/jenkins_home/workspace/xxx/config''' } stage('test'){ //测试镜像 sh '''docker run -itd --name gateway 10.24.2.10/xxx/gateway:$BUILD_ID docker ps -a|grep chinaskillproject|grep Up if [ $? -eq 0 ];then echo "Success!" docker rm -f gateway else docker rm -f gateway exit 1 fi ''' } stage('upload registry'){ //上传构建完成的镜像到harbor镜像仓库 sh '''docker login 10.24.2.10 -u=admin -p=xxxxxxxxxxxxxx docker push 10.24.2.10/chinaskillproject/gateway:$BUILD_ID docker push 10.24.2.10/chinaskillproject/config:$BUILD_ID''' } stage('deploy k8s'){ //创建命名空间,部署yaml脚本到k8s集群 sh 'kubectl create ns springcloud' sh 'kubectl apply -f /var/jenkins_home/workspace/xxx/yaml/deployment/gateway-deployment.yaml --kubeconfig=/root/.kube/config' sh 'kubectl apply -f /var/jenkins_home/workspace/xxx/yaml/deployment/config-deployment.yaml --kubeconfig=/root/.kube/config' sh 'kubectl apply -f /var/jenkins_home/workspace/xxx/yaml/svc/gateway-svc.yaml --kubeconfig=/root/.kube/config' sh 'kubectl apply -f /var/jenkins_home/workspace/xxx/yaml/svc/config-svc.yaml --kubeconfig=/root/.kube/config' } }
配置gitlab的webhook
Gitlab,进入项目,点击左侧导航栏“Settings”→“Webhooks”,
将GitLab webhook URL地址填入URL处,禁用SSL认证,如图所示。
点击“Add webhook”添加webhook
点击“Push events”进行测试
结果返回HTTP 200则表明Webhook配置成功。
6.触发流水线
git重新提交代码,触发流水线
[root@master ]# git commit -m "Initial commit" # On branch master nothing to commit, working directory clean [root@master ]# git push -u origin master
触发后开始运行
流水线一路绿灯,构建部署成功
微服务成功部署在k8s集群,CI/CD部署完成
接下来就是本次的正文了-云效
为什么要花这么多功夫写自建devops系统呢?
因为这些部署在云效之中,都!不!需!要!
当自建系统时,基础设施需要确保Kubernetes集群、部署镜像仓库、部署代码仓库、部署CI/CD工具,还需要针对业务编写设置不同的流水线,并考虑服务的高可用性
一切复杂冗余的部署运维,有了云效,都可以省去!
就好比官方文档中所述:
- 为什么选择云效公共云,而不是自建或开源?
- 免搭建、免维护,注册即用
- 一站式DevOps,账号、数据打通
- 钉钉集成,成员、消息及时同步
- 无缝对接阿里云ECS、ACK等
- 丰富的研发效能数据洞察
- 精细化企业级安全防控能力
云效DevOps-部署微服务PiggyMetrics
一、云效代码管理 Codeup
云效代码管理 Codeup 是阿里云出品的一款企业级代码管理平台,提供代码托管、代码评审、代码扫描、质量检测等功能,全方位保护企业代码资产,帮助企业实现安全、稳定、高效的研发管理。
代码仓库相信是个搞计算机的都不陌生,最热门的github/gitee等在线代码仓库,或gitlab等等。我们对代码仓库最基本的需求便是代码托管与版本管理。云效提供了代码托管,同时也可以连接其他git仓库。
这里,我们从代码管理开始
创建新代码库
通过git上传本地代码文件
Tips:git连接时的账号需要在个人设置里https密码中重新设置,与阿里的登录账号无关
上传我们的测试代码后,仓库显示
云效的代码管理功能类似与常见代码仓库,包括项目分支、请求提交记录、安全管理
在代码安全中,云效提供了依赖包漏洞检测与源码漏洞检测
二、云效流水线Flow
云效流水线完美的替代jenkins的CI功能,相比较自建的持续交付工具,使用 Flow 仅仅需要几步,就可以快速搭建 CICD 流程。Flow 提供了开箱即用的构建环境,提供了数十种通用的流水线模版帮助你快速创建流水线,可以根据开发业务选择不同的模板,这个对于自己编写pipeline脚本真的方便了很多,当我在自己编写流水线脚本时,需要进行大量的测试调试,还需要根据不同的业务需求而进行调整。Flow提供的不同功能的模板,大量减少了运维工作
在这里,我们新建流水线,选择
根据我们发布流程,我们分别需要设置四个流程
第一阶段。选择流水线来源,选择上面我们完成代码上传的云效codeup,选择好仓库和分支
第二阶段。我们需要对仓库内代码进行maven build,流水线运行时会将打包完的jar包暂存在工作空间中
第三阶段。我们配置镜像构建,这里需要构建微服务中的gateway和config镜像,选择镜像构建推送到阿里云
配置阿里镜像仓库,设置Dockerfile的文件路径,可以设置构建镜像的tag
第四阶段。我们将构建完成的镜像部署到k8s集群中,我们可以直接部署到阿里的ACK集群中
选择好kubectl的选项,以及yaml部署脚本文件
微服务PiggyMetrics的流水线Flow到这里就完成设置了,非常简单便捷的部署了四个流程
Tips:每个阶段还可以配置通知功能
完成配置后,点击运行配置
流水线运行成功,一路绿灯
PS:图中构建出现的告警是因为dockerfile中编写容器源镜像选择的是dockerhub官方的,阿里建议使用国内镜像站
此时我们进ACK集群,查看创建的deployment,如图config和gateway以及正常上线
通过ACK服务,使用负载均衡就可以暴露服务端口在公网上
PiggyMetrics微服务部署完成,公网访问成功
其他云效全家桶工具体验
云效知识库 Thoughts
文档管理是最为重要的功能,文档是最基础的技术载体,对新人进入时可以通过学习文档快速进入工作,也可以避免开发中解决重复性的问题解决。
多人协作的文档管理产品有很多,常见的以Wiki为主,企业常用的文档及项目管理为Confluence+jira,也有公有云SaaS产品语雀,这些产品我或多或少接触过。但是对于一些小型团队,这些产品偏重。
这是我个人在使用的wiki知识平台wiki.js,搭建较轻,但是还是有运维的要求(数据库、存储备份等)
云效中集成了知识库模块,我第一使用感受就是简约、轻
可以有几大经典的模板供创建,非常方便
我选择了创建IT运营模板,可以配置文档库公开性
模板库有大量现成文档模板,包含了标题,可以促进编写文档的标准化
文档编辑是markdown格式的,熟悉markdown的非常好上手
同时也可以导入现有的文档内容,包括了markdown\云效文档导出\Confluence\Word文件
测试了导入word文档文件,对word导入效果还不错
测试管理Testhub
云效提供了测试管理,针对研发中测试人员直接在云效中跟进项目测试与反馈
创建测试用例库,填写名称、设置安全性、填写编号
新建用例,填入标题、测试条件、测试过程和期望
新建测试计划,选择人员设置日期
当测试人员完成测试后,就可以将测试结果反馈到平台
应用交付
AppStack中最为核心的三概念为发布应用、部署环境、应用编排
1.发布
一个可独立交付的对外提供服务的单元,在研发态,通常对应一个到多个功能模块,关联一个或多个代码库;在运行态,通常对应一组Kubernetes资源。
2.环境
环境是应用运行态的载体,是应用维度做部署和运维的操作界面。在AppStack中,一个应用可以创建多套环境,用于开发、测试、生产等不同场景,用户可以分别对这些环境进行更新、管理和运行状态监控。
3.编排
是对应用部署架构的描述,通常包含工作负载、配置项、网络、存储声明等,是一组Kubernetes资源组合。
我们可以选择发布应用的流水线,如上文发布微服务PiggyMetrics时配置的流水线
部署环境,appstack提供了三大预设环境,如开发环境、测试环境、生产环境,贴合实际的开发环境
应用编排使用了原生 YAML 的形式来描述应用部署架构,将预设的YAML脚本设置完成后即可完成应用的编排
项目管理
云效Projex是新一代企业级研发协作平台,集成了敏捷研发项目管理的最佳实践,提供了针对项目、迭代、需求、缺陷等多个维度的协同管理以及相关的统计报告,让研发团队高效协作、践行敏捷并持续交付产品价值。
通过与云效「代码管理」和「流水线」的结合,可打造一站式、端到端、全栈敏捷的软件研发DevOps项目。
项目,是围绕某一特定目标(如产品交付或服务),组织相应人力、物力资源进行的临时性工作。项目具有非常强的计划性,有确定的开始日期和结束日期,项目的周期时长有短期或长期两种形态。在现代软件交付项目中,也有未设置项目结束日期,以迭代的方式来持续演进交付产品。
项目是Projex的核心对象,汇集了同类工作内容以及投入的资源。
选择项目模板,填写基本信息,即可开始项目管理
云端开发DevStudio
云效云端开发 DevStudio 是一款阿里云云效推出的面向云原生的 WebIDE 产品。只需一个浏览器即可获得与本地 IDE 一致的开发体验。通过预置开发环境,使用智能编码能力,即可快速地编辑、调试、运行、部署云端代码。
DevStudio 以 WebIDE 为基础,提供函数计算、IoT应用和小程序等应用的开发和调试,串联起整个 DevOps 流程,无需用户配置环境,更不受操作系统限制,通过浏览器,即可使用完整 IDE 功能。DevStudio 支持在线安装插件来拓展原有功能,兼容所有常用 VSCode 插件
企业管理
云效全家桶,提供了高效的企业管理,分为三大为:企业和组织、企业成员管理、企业角色与权限
云效和钉钉集成使能组织架构和成员同步;钉钉消息通知,沟通协作更便捷
同时精细化企业级安全防控能力,提供精细化企业权限管控,提供事前、事中、事后多种安全防控机制