DevOps助力云原生应用开发实战分享

Stella981
• 阅读 585

背景

DevOps助力云原生应用开发实战分享

Cloud Foundry 是业界比较“资深”的PAAS云平台,它不仅支持多种框架、运行时环境,还支持在多种云环境进行部署,包括:AWS, Azure, GCP, OpenStack等。本文分享,基于阿里云进行开发、运维的实战经验。

部署Cloud Foundry首先要用到的工具是BOSH。BOSH是用来部署和管理Cloud Foundry集群的工具。 它定义了一系列管理和操作云资源的接口Cloud Provider Interface,各个云厂商需要适配自己的Provider,这就是本文的开发背景。为了让大家对BOSH和CPI有一个感性的认识,下面简要的介绍几个相关概念。

DevOps助力云原生应用开发实战分享

BOSH的组件结构如上图所示, 这里简单说明一下,详细说明见官方文档

  1. Director会解析部署命令和模板,然后调用CPI模块去创建VM(ECS)实例,实例信息会写到Registry上。

  2. 每个VM上装有Agent负责与Bosh交互,包括:处理Director下发的任务、上报VM的健康状态等。

  3. Agent从Registry拿到当前VM的信息,包括:ID, IP等。

  4. Director/HM和VM之间的通信是通过NATS发布和订阅消息。

重点: 这里的开发任务就是实现阿里云CPI Provider。

开发

Bosh Alicloud CPI是阿里云对CPI GO版本的实现,目前已开源,欢迎试用。

Alicloud CPI实现了对云资源以及Cloud Foundry生命周期的管理,组件结构如下图:

DevOps助力云原生应用开发实战分享

CPI这一层的职责比较规整,包括:模板解析、参数校验、API调用、容错与重试、返回值加工。不过,完美集成到Bosh中并高成功率的部署集群是一件很复杂的事儿,需要大量的验证和测试。

CPI Provider开发流程分为: 代码实现、Code review, 单元测试,集成测试,部署Bosh验证CPI,部署Cloud Foundry集群,在集群上部署应用。

Why DevOps

项目特点如下:

  1. 从事开源项目开发的小团队,没有专门的运维同学,天然的开发即运维。

  2. 立项之初组内没有Cloud Foundry的专家,需要快速的交付到社区去验证,得到反馈之后快速的进行迭代。

  3. Cloud Foundry的部署极其复杂,走一次部署流程消耗大量的人力和时间成本。需要用工具来加快开发和迭代部署的速度,减少重复的手工成本。

为了保证代码质量的前提下快速的进行迭代开发、构建、测试、部署,那么就需要一套实践方法来支撑整个流程。

How to DevOps

工具介绍

Cloud Foundry社区提供了ConcourseCI Pipeline支持各个模块的CI/CD流程, 当然这里也可以选择其他方案,比如:阿里云的CodePipeline。

所谓Pipeline就是一系列手工工作的集合,这里包括:单元测试、构建Release包、集成测试、验收测试、端到端测试、发布正式Release包。简单示意图如下:

DevOps助力云原生应用开发实战分享

每一项任务就是一个Job, 每个Job由输入、输出和若干Task组成。Task在运行时会拉取镜像、启动容器、拿到输入、执行Task、输出结果。

拿一次CI举例,开发人员提交代码到Git仓库,Git会触发Webhook通知CI Server;CI Server会检查Pipelie配置,根据trigger规则触发对应的Job,并下发给CI Worker;Work解析Tasks,拉取Docker镜像启动容器,执行Task;最后Work收集每个Task的结果返回给CI Server。流程入下图所示:

DevOps助力云原生应用开发实战分享

接下来介绍一下在CPI Pipeline中每个Job所负责的内容,对于类似的项目有一定借鉴意义。 CPI Pipeline包括5个主要流程,分别是Unit Test, Build Candidate, Integration Test, Acceptance Test, E2E Test。下图是这5个流程示意图:

DevOps助力云原生应用开发实战分享

Unit Test

DevOps助力云原生应用开发实战分享

  • Source Code

  • Inputs:

    • bosh-cpi-src: 项目源代码
  • Task:

    • go get -v github.com/onsi/ginkgo/ginkgo 安装依赖

    • ginkgo -r -skipPackage integration src/bosh-alicloud-cpi 运行unit-test

Build Candidate

DevOps助力云原生应用开发实战分享

  • Source Code

  • Inputs:

    • bosh-cpi-src: 项目源代码

    • go-cpi-blobs: golang linux安装包,是运行CPI的基础依赖

    • version-semver: 用来做版本控制

  • Task:

    • bosh2 add-blob ../go-cpi-blobs/go1.8.1.linux-amd64.tar.gz go1.8.1.linux-amd64.tar.gz 加载blob依赖

    • bosh2 create-release --name cpireleasename−−versioncpireleasename−−versionsemver --tarball cpireleasename−cpireleasename−semver.tgz 打release包,根据版本号生成release包名称

    • mv cpireleasename−cpireleasename−semver.tgz ${DESC}/: 把构建物上传到远程地址

  • Outputs:

    • bosh-cpi-dev-artifacts: 用来存储构建物

Integration Test

DevOps助力云原生应用开发实战分享

  • Source Code

  • Inputs:

    • bosh-cpi-src: 项目源代码

    • stemcell: bosh light stemcell, 配置Region和ImageId的对应关系。 同一个镜像在各个Region的分发。

    • terraform-metadata: 用于测试的IaaS层基础环境,包括网络、安全组、负载均衡等。

  • Task:

    • 初始化测试数据

    • ginkgo src/bosh-alicloud-cpi/integration $(GINKGO_ARGS) -v 执行测试脚本

Bosh Acceptance Test

DevOps助力云原生应用开发实战分享

  • Source Code

  • Inputs:

    • pipelines: 准备进行BATs的配置文件仓库

    • bats: BATs测试框架的源码仓库

    • light stemcell: 维护各个region下镜像ID的配置文件

  • Task:

    • 动态生成manifest

    • 部署一个batlight Job节点

    • 执行bat测试

    • 部署Bosh Source Code

    • 获取director信息,写入环境变量,供后面登陆Bosh使用 [Source Code]()

    • 从meta-data获取,部署Bosh所需要的IaaS资源信息

    • 动态生成用于部署Bosh的manifest文件 Source Code

    • prepare-director

    • deploy-director

    • run-bats

End-to-End Test

DevOps助力云原生应用开发实战分享

  • Source Code

  • Inputs:

    • bosh-cpi-src: 项目源代码

    • blobs: 编译Job所依赖的二进制包

  • Task:

    • 登陆Bosh

    • 把依赖包打入Blob

    • 打release包, 然后上传到Bosh

    • 上传light-stemcell, cloud-config

    • 部署Job

    • 执行run-errand任务

Build And Destroy Director

DevOps助力云原生应用开发实战分享

  • Source Code

  • Inputs:

    • terraform-statement: terraform共享状态文件, 用来远程存储terraform执行结果

    • main-tf: terraform编排模板

  • Task:

    • terraform根据编排模板创建IaaS资源

    • 对创建结果进行处理,生成JSON文件

    • 把terraform状态文件同步到远程

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这