从自建DevOps部署微服务再到云效

简介: 以Jenkins+Gitlab基于k8s集群实现自建DevOps系统的方式部署开源微服务PiggyMetrics,与云效DevOps对比,介绍真正的免运维,实现高效的业务开发流程。

1. 背景信息

DevOps意为“Development”和“Operations”,即为开发人员和运维人员之间沟通合作的开发模式,通过自动化“软件交付”和“架构更变”的流程,实现开发运维一体化,使得开发构建、测试、发布能够更加快捷、频繁和高效稳定。DevOps是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保证部门之间的沟通、协作与整合。它的出现时由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。其最大的特点就是极速的迭代和快速的用户反馈。

云效,云原生时代一站式BizDevOps平台,支持公共云、专有云和混合云多种部署形态,通过云原生新技术和研发新模式,助力创新创业和数字化转型企业快速实现研发敏捷和组织敏捷,打造“双敏”组织,实现10倍效能提升。

如今,业务追求上云,业务流程也可以上云。阿里的云效DevOps全家桶,真正的为人们带来便利,今天,我就以Jenkins+Gitlab基于k8s集群实现自建DevOps系统的方式部署开源微服务PiggyMetrics,与云效DevOps对比,告诉大家真正的免运维,实现高效的业务开发流程。

1

2. 自建DevOps实现CI/CD-部署微服务PiggyMetrics

这里,我先从自建devops系统并部署微服务应用开始。

测试的devops系统架构流程如下:

基于现有的kubernetes集群和harbor镜像仓库,搭建以docker运行的Gittlab代码仓库和CI工具jenkins,并编写自动化流水线脚本。

2

2.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:

  1. Web端通过http://IP:8080访问Jenkins。

    3
  2. 查看默认密码:

    [root@master ~]#  docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
    54670064056e42a2a47485a5e3356e57
  3. 输入密码并点击“继续”。

    4
  4. 选择“安装推荐的插件”,如图所示:

    5
  5. 插件安装完成后自动转入管理员用户创建界面。

    6
  6. 输入用户信息,点击“保存并完成”。

    7
  7. 配置完URL后使用新建的用户登录Jenkins,如图。

    8

2.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

9

设置root用户信息并使用root用户登录Gitlab,如图所示:

10

创建项目“Create a project”。

11

我们就可以在本地通过Git上传代码到仓库。

git init
git  remote add origin http://ip/xxxx.git
git add .
git commit -m  'upload'
git push -u origin  master

2.3 配置Jenkins对接Gitlab

  1. gitlab设置Outbound requests。

    12
  2. 生成“Access Tokens”并命名为jenkins。

    1313

  3. 设置Jenkins取消对’/project’end-point进行身份验证;

    1414

  4. jenkins添加Gitlab api token。

    15

2.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-全局工具配置。

16

2.5 配置CI/CD

  1. 新建流水线任务。

    17
  2. 配置触发器。

    1819

  3. 编写流水线脚本。

    构建微服务项目中的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'
        }
    }
    20
  4. 配置Gitab的Webhook。

    1. Gitlab,进入项目,点击左侧导航栏“Settings”→“Webhooks”,将GitLab Webhook URL地址填入URL处,禁用SSL认证,如图所示。

      21
    2. 点击“Add Webhook”添加Webhook。

      22
    3. 点击“Push events”进行测试。

      23

      结果返回HTTP 200则表明Webhook配置成功。

2.6 触发流水线

  1. Git重新提交代码,触发流水线。

    [root@master  ]# git commit -m "Initial commit"
    # On  branch master
    nothing  to commit, working directory clean
    [root@master  ]# git push -u origin master
  2. 触发后开始运行。

    24
  3. 流水线一路绿灯,构建部署成功。

    25
  4. 微服务成功部署在k8s集群,CI/CD部署完成。

    26

3. 接下来就是本次的正文了-云效

为什么要花这么多功夫写自建devops系统呢?

因为这些部署在云效之中,都!不!需!要!

当自建系统时,基础设施需要确保Kubernetes集群、部署镜像仓库、部署代码仓库、部署CI/CD工具,还需要针对业务编写设置不同的流水线,并考虑服务的高可用性

一切复杂冗余的部署运维,有了云效,都可以省去!

就好比官方文档中所述:

  • 为什么选择云效公共云,而不是自建或开源?

    • 免搭建、免维护,注册即用

    • 一站式DevOps,账号、数据打通

    • 钉钉集成,成员、消息及时同步

    • 无缝对接阿里云ECS、ACK等

    • 丰富的研发效能数据洞察

    • 精细化企业级安全防控能力

4. 云效DevOps-部署微服务PiggyMetrics

4.1 云效代码管理 Codeup

云效代码管理Codeup是阿里云出品的一款企业级代码管理平台,提供代码托管、代码评审、代码扫描、质量检测等功能,全方位保护企业代码资产,帮助企业实现安全、稳定、高效的研发管理。

代码仓库相信是个搞计算机的都不陌生,最热门的Github/gitee等在线代码仓库,或Gittlab等等。我们对代码仓库最基本的需求便是代码托管与版本管理。云效提供了代码托管,同时也可以连接其他Git仓库。

这里,我们从代码管理开始:

27

  1. 创建新代码库。

    28
  2. 通过Git上传本地代码文件。

    29    

    说明

    Git连接时的账号需要在个人设置里HTTPS密码中重新设置,与阿里的登录账号无关。

    30

    上传我们的测试代码后,仓库显示。

    31

    云效的代码管理功能类似与常见代码仓库,包括项目分支、请求提交记录、安全管理。

    32

    在代码安全中,云效提供了依赖包漏洞检测与源码漏洞检测。

    3334

4.2 云效流水线Flow

云效流水线完美的替代jenkins的CI功能,相比较自建的持续交付工具,使用Flow仅仅需要几步,就可以快速搭建CICD流程。Flow提供了开箱即用的构建环境,提供了数十种通用的流水线模版帮助你快速创建流水线,可以根据开发业务选择不同的模板,这个对于自己编写pipeline脚本真的方便了很多,当我在自己编写流水线脚本时,需要进行大量的测试调试,还需要根据不同的业务需求而进行调整。Flow提供的不同功能的模板,大量减少了运维工作。

35

在这里,我们新建流水线,选择:36

37

根据我们发布流程,我们分别需要设置四个流程:

  1. 选择流水线来源,选择上面我们完成代码上传的云效codeup,选择好仓库和分支。

    38
  2. 我们需要对仓库内代码进行Maven build,流水线运行时会将打包完的jar包暂存在工作空间中。

    39
  3. 我们配置镜像构建,这里需要构建微服务中的gateway和config镜像,选择镜像构建推送到阿里云。

    40

    配置阿里镜像仓库,设置Dockerfile的文件路径,可以设置构建镜像的tag。

    41
  4. 我们将构建完成的镜像部署到k8s集群中,我们可以直接部署到阿里的ACK集群中。

    42

    选择好kubectl的选项,以及YAML部署脚本文件。

    43

    微服务PiggyMetrics的流水线Flow到这里就完成设置了,非常简单便捷的部署了四个流程。

    44

说明

每个阶段还可以配置通知功能。

45

完成配置后,点击运行配置。

46

流水线运行成功,一路绿灯。

说明

图中构建出现的告警是因为dockerfile中编写容器源镜像选择的是dockerhub官方的,阿里建议使用国内镜像站。

47

此时我们进ACK集群,查看创建的deployment,如图config和gateway以及正常上线。

48

通过ACK服务,使用负载均衡就可以暴露服务端口在公网上。

49

PiggyMetrics微服务部署完成,公网访问成功。

50

5. 其他云效全家桶工具体验

5.1 云效知识库 Thoughts

文档管理是最为重要的功能,文档是最基础的技术载体,对新人进入时可以通过学习文档快速进入工作,也可以避免开发中解决重复性的问题解决。

多人协作的文档管理产品有很多,常见的以Wiki为主,企业常用的文档及项目管理为Confluence+jira,也有公有云SaaS产品语雀,这些产品我或多或少接触过。但是对于一些小型团队,这些产品偏重。

这是我个人在使用的wiki知识平台wiki.js,搭建较轻,但是还是有运维的要求(数据库、存储备份等)。

51

云效中集成了知识库模块,我第一使用感受就是简约、轻。

52

可以有几大经典的模板供创建,非常方便。

53

我选择了创建IT运营模板,可以配置文档库公开性。

5455

模板库有大量现成文档模板,包含了标题,可以促进编写文档的标准化。

56

文档编辑是markdown格式的,熟悉markdown的非常好上手。

57

同时也可以导入现有的文档内容,包括了markdown\云效文档导出\Confluence\Word文件。

58

测试了导入word文档文件,对word导入效果还不错。

59

5.2 测试管理Testhub

云效提供了测试管理,针对研发中测试人员直接在云效中跟进项目测试与反馈。

创建测试用例库,填写名称、设置安全性、填写编号。

60

新建用例,填入标题、测试条件、测试过程和期望。

61

新建测试计划,选择人员设置日期。

62

当测试人员完成测试后,就可以将测试结果反馈到平台。

6363

5.3 应用交付

AppStack中最为核心的三概念为发布应用、部署环境、应用编排。

  1. 发布。

    一个可独立交付的对外提供服务的单元,在研发态,通常对应一个到多个功能模块,关联一个或多个代码库;在运行态,通常对应一组Kubernetes资源。

  2. 环境。

    环境是应用运行态的载体,是应用维度做部署和运维的操作界面。在AppStack中,一个应用可以创建多套环境,用于开发、测试、生产等不同场景,用户可以分别对这些环境进行更新、管理和运行状态监控。

  3. 编排。

    是对应用部署架构的描述,通常包含工作负载、配置项、网络、存储声明等,是一组Kubernetes资源组合。

64

我们可以选择发布应用的流水线,如上文发布微服务PiggyMetrics时配置的流水线。

65

部署环境,appstack提供了三大预设环境,如开发环境、测试环境、生产环境,贴合实际的开发环境。

66

应用编排使用了原生 YAML 的形式来描述应用部署架构,将预设的YAML脚本设置完成后即可完成应用的编排。

6768

5.4 项目管理

云效Projex是新一代企业级研发协作平台,集成了敏捷研发项目管理的最佳实践,提供了针对项目、迭代、需求、缺陷等多个维度的协同管理以及相关的统计报告,让研发团队高效协作、践行敏捷并持续交付产品价值。

通过与云效「代码管理」和「流水线」的结合,可打造一站式、端到端、全栈敏捷的软件研发DevOps项目。

69

项目,是围绕某一特定目标(如产品交付或服务),组织相应人力、物力资源进行的临时性工作。项目具有非常强的计划性,有确定的开始日期和结束日期,项目的周期时长有短期或长期两种形态。在现代软件交付项目中,也有未设置项目结束日期,以迭代的方式来持续演进交付产品。

项目是Projex的核心对象,汇集了同类工作内容以及投入的资源。

70

选择项目模板,填写基本信息,即可开始项目管理。

71

5.5 云端开发DevStudio

云效云端开发 DevStudio 是一款阿里云云效推出的面向云原生的 WebIDE 产品。只需一个浏览器即可获得与本地 IDE 一致的开发体验。通过预置开发环境,使用智能编码能力,即可快速地编辑、调试、运行、部署云端代码。

DevStudio 以 WebIDE 为基础,提供函数计算、IoT应用和小程序等应用的开发和调试,串联起整个 DevOps 流程,无需用户配置环境,更不受操作系统限制,通过浏览器,即可使用完整 IDE 功能。DevStudio 支持在线安装插件来拓展原有功能,兼容所有常用 VSCode 插件。

7273

5.6 企业管理

云效全家桶,提供了高效的企业管理,分为三大为:企业和组织、企业成员管理、企业角色与权限。

云效和钉钉集成使能组织架构和成员同步;钉钉消息通知,沟通协作更便捷。

同时精细化企业级安全防控能力,提供精细化企业权限管控,提供事前、事中、事后多种安全防控机制。

7475

本文转载自:链接,作者为:嚯嚯嚯www

作者介绍
目录