[关闭]
@gaoxiaoyunwei2017 2018-11-26T12:12:22.000000Z 字数 4506 阅读 550

多云 devops 实践

毕宏飞


image.png-79.2kB

作者简介

邱见
IBM,现任资深架构师

前言

我来自于IBM,我们的工作是在多云环境下做一些 Kubernetes ,然后在 Kubernetes 之上做 DevOps 一些的东西。今天我的分享主要有以下四个部分:

1、什么是多云?
2、多云环境下的IBM Cloud Private
3、我们遇到的挑战
4、ICP devops 实践

一、什么是多云?

首先是什么是多云,以前我们经常去谈混合云,混合云其实就是说你有自己的一个私有云,在公有云上有一些服务,在之间做一些DR切换,把一些服务托管到公有云上面。
image.png-365.5kB
从现在实际情况来看,越来越多的公司使用多个不同的公有云,他们也会有自己的私有云。IBM做过调查,我们的客户有80%的准备使用多个公有云,有70%实际上正在使用三个或者三个以上的公有云服务,他们可能来自于aws、阿里,腾讯各种各样的公有云服务。

为什么使用多云环境呢?有几个很重要的考虑因素,比如说:

image.png-592kB
IBM自己也使用,可以说是公有云的提供商也是多云的消费者。IBM有很多的服务也跑在aws或者跑在其他云平台上,IBM自己也在使用多云,也是为了使用更好的这种公有云上的服务。

二、多云环境下的IBM Cloud Private

在之前很长的时间,多云这件事情在 DevOps 上面很难做,对于公有云以前提供 IAAS 服务,他们的API不是统一的,用不同的公有云服务,你要使用不同的API。但是由于 Container 还有 Kubernetes 的出现,我能有一套统一的API去使用公有云。从 Kubernetes 或者从 docker 角度来讲,其实不太关心你后面的是什么,可以是任何的公有云服务,但是你可以从部署在 Kubernetes 的角度来做这个事情。对于我们团队来说我们是做多云上面的 Kubernetes 平台,这个平台上面会有一些运维服务,又有一些IBM自己的其他应用服务,这些服务包含数据分析、AI、还有一些其他的长期运行的服务。我们团队主要做运维服务和 Kubernetes 这两层的开发跟运维工作。这个平台会在IBM内部运行,也会在其他的公有云平台上运行,也会根据用户使用,决定运行在其他的公有云或者是用户自己的内部环境。
image.png-456.4kB
那么在这个平台的开发中,我们使用了挺多的 DevOps 工具,这些工具大多数都是 SAAS ,比如说 Github Enterprise 、 Artifactory 、Slack 这些东西。这些 SAAS 服务之间其实已经做了很多的整合,所以你可以很好地去做一个 CI/CD 的 Pipeline 把他们整合在一起。

三、我们遇到的挑战

我来说说在这个过程当中,遇到什么挑战?最开始开发这个平台,我们主要负责的是以 kubernetes 上面的一些运维服务为主的一些开发。
image.png-187kB
一开始的时候,我们想法非常简单,我提一个PR,这个PR去做 unittest ,完了以后提交到 master 上面,之后你就会有一个 latest image ,其他人就可以使用这个镜像去部署这个东西。

这里有三个问题:

组件众多,开发团队众多

多云环境下平台测试异常复杂耗时

对这个平台上来说,既是消费者,又是生产者。

四、ICP devops 实践

image.png-208.7kB
我们看一下我们后面的一个改进。我们后来发现,其实没有办法完全按照开源的方法去做,因为组件实在是太多了。最终的决定就是把整个 CI/CD Pipeline 拉长,于是我们就重新做了一个 DevOps 的架构,这个架构首先有 SAAS 的部分,比如说 Github Enterprise 、Slack ,还有我们使用了 Artifactory ,主要去做 images 的存储。
image.png-1006.9kB

对于 IAAS 层来讲,有不同的 IAAS 平台,有 CI/CD 去拆发一些专门的脚本,他们有自己 ICP system environment 的去做整个系统监控,报告安全的问题,因为我们每一个 docker 镜像构建出来,都要去扫描它的安全问题,他们也会构建一些 Terraform 、 ansible 的脚本去做这些部署。每一个自己的 Squad 也要负责一部分,负责自己 images 的构建还要负责自己的 helm chart,这样就把责任分得比较清楚,对于本身的 component 的部署和 images 是由某一个特定的 squad ,就是谁开发谁的负责这部分东西。对于 CI/CD 的 squad 主要做一些基础环境,比如使用 Terraform 调不同的公有云,把基础环境做起来。

在这之后我们有了一个延长以后的 Pipeline ,这个 Pipeline 分了左右两部分,左边是持续的部分,右边是 scheduled 好的。
image.png-261.2kB
左边的部分只需要开发者去关心的,像以前我们有一个 scratch 、 integration 这两个不同images 的 repository,一个PR被 build 以后,它首先去做一些 unittest ,然后会进到 scratch bulid 里,这个其实可以去定制,别人就可以把 scratch 里的东西拿出来测试。接下来如果被提交到 master 以后,它会进入到 master build,在这之后就是 CI/CD 团队去做,会产生不同版本的 build 为不同的目的服务。

image.png-261.5kB
首先看到是的 scratch build,那么scratch build 就是说我PR提交了以后我就有一个scratch build,这些可以用来做一些 unittest。之后如果这个PR提交到 master以后,会产生 integration 的 build,其实它就是一个不同的 image 。对于开发者来说,他只对这两个 build 有权限。

在这之后就成了 CI/CD 团队做的事情,他们需要做 daily build ,daily build 是说每日从 integration 拿一个 daily 的 image 出来。
image.png-579.1kB
我们预期他们是会失败的,当然这里头有很多的原因,比如集成的问题,比如说API兼容性的问题。这个 daily build 会要执行跨平台,跨云,跨操作系统的测试,以前对跨云、跨操作系统的测试,不再放在一个开发者的 PR build 里,而是放在 daily build 里 ,这个时候把这些事情跟开发者分开来了,相对来说可以更快速的开发,把这些事交给 CI/CD 团队去做,他们会发现其中的一些的BUG并且反馈回来,然后再反馈到开发团队。

Development stage 、Stable stage 、Release stage 这几个是对于外部来说是比较稳定的一些 build ,这些可以被其他人使用。他们也有不同的状态,比如说 Development build 可能它的api变化还是相对会大一些,Stable 会保证api相互的兼容性,他们 build 的周期也不太一样。从 Development build 开始可以提供给其他的一些服务去使用,到 Stable build 以后会部署到多云的预生产的环境里面,在这之上让其他的应用去使用。

另外一些问题,生产者和消费者怎么解决?实际我们是很多开源软件的消费者,包括 Kubernetes 、 docker ,还有很多其他的一些开源的组件。另一方面,我们又需要去修改它的一些东西,来保证它可以满足我们的要求。
image.png-81kB
比如 Kubernetes 这种 build 我们也会跟随一样的流程,也会到 scratch 、 integration 再通过做一系列的测试变成一个 stable ,也是通过 Pipeline 这种方式去 build 其他的开源组件。

image.png-571.2kB
其次是生产者的做法。像我刚才讲的,我们会有三个不同的 build ,根据 build 稳定性分成不同的阶段,从 development 到 release 。 Content Team 这里指的就是使用它,他们有一些服务要跑在这个平台上面,他们就可以从 Development build 试用它,如果觉得可以就把服务迁移到 Stable build里。

接下来,一个问题是多云。实际上刚才讲的是 DevOps Pipeline,走到 Stable 的时候,实际上就是多云环境,在这种情况下,我们怎么样去管理多云,如何做一些不同云环境下的应用配置。比如说我有一个运维服务,它实际上由 helm chart 和 docker images 组成的。你需要部署到多个云环境中,虽然说 Kubernetes 可以很大程度上保证你的东西不管放在哪里都可以部署,但是有一定的区别,需要有一些区别的配置,那么就需要在多云环境的配置管理,需要做一些多云环境上系统的监控、合规等等这些东西。
image.png-834.2kB
这个时候我们就开发了一个系统叫 Multi-cloud Manager ,它管理多个不同的云环境 Kubernetes 集群,可以通过它做更好的监控、应用的迁移、不同应用配置下的部署。

在做多云 DevOps 的是怎么做的。我们会有多个不同的 Kubernetes Cluster ,包括 Integration cluster 、 Daily cluster 、 Stable cluster 。
image.png-596.6kB
Stable cluster 可能会部署在多个不同公有云或者私有云环境中,这些东西都被 MCM 去管理起来,比如说我去测试某一个应用的时候,可以通过 MCM 把这个应用发布到某一个集群里面,通过 MCM 把这个应用从一个集群发布到另外一个集群。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注