经过了十个城市的路演,华为HDG线下沙龙终于来到了首都。在北京,开发人员之多,关注的技术领域之广,讨论的话题之深入,堪称HDG历届参与讨论者之最。
马全一是华为DevOps***架构师,他告诉记者,在他《ContainerOps–DevOps编排系统》的演讲中,关于 ContainerOps 的架构细节和演示 Demo 是在之前没有公开过的,是北京站***次公开的内容。同时他还考虑到了很多开发者的诉求,例如在当前 DevOps 领域存在多种工具、服务,割裂的工具链造成用户完成 DevOps 流程需要使用多种工具;此外,开发者们往往都会遇到的在多种工具之间传递事件数据只能靠脚本这种情况,维护成本高,以及各种 plugin 学习困难,使用环境配置复杂。
以下是他的现场演讲实录:
我这个是延展型的ContainerOps的,这个项目我在担任华为之前就做的,因为我当时在做docker的社区,所以对docker比较熟。我自我介绍一下,我叫马全一,刚才李强也说了,我其实最早在国内做docker的社区,对这个技术早期的时候还是比较熟悉。
今年我跟华为的PaaS团队一起做,我主要是负责PaaS里面DevOps的一部分。我感觉在华为里面的架构师,其实身兼数职。华为的产品都是技术性的,所以华为的架构师相当于互联网公司的产品经理+架构师的特色。所以这个产品有什么特点,很多细节的地方都是架构师来决定,但是大方向还是由客户的需求,还有我们的判断来做的,但是很多细节的地方都是由架构师来定的。包括研发我们要做到***层,甚至参与开发,这是华为架构师所做的事情。现在我们在做的社区架构师,也要出来讲自己的产品,这是我觉得不太一样的地方。
主要的内容就是,我们讲一下我们对DevOps的理念是什么,讲一下我们产品的特点ContainerOps。我主要讲开源的一部分,这个跟我们上个产品最终的版本是一样的。上层的调度管理其实是一致的。在整个产品的设计里面我们讲一个Component的概念,就是DevOpsComponent,***我们会讲一下整个调度引擎,还有一个demo,有几个视频,我们demo的视频给大家放一下,让大家看一下具体的形态是什么。
我们先讲一下DevOps的由来,DevOps这个词最早其实没有这个不词,2007年的时候有一个工程师,他在欧洲是做商业的咨询项目,在欧洲的环境下有很多独立的顾问,比如说做一些安全的咨询,或者DevOps的咨询。这个人以前是做咨询的,他在咨询过程中发现研发团队和运维团队之间,当时也不叫运维团队,他叫系统管理员。发现团队之间的交流有很多障碍,有很多隔阂,所以他一直在思考这个问题。
这是对DevOps的解释,我看了这么多资料,觉得对我来说DevOps其实就是一个理念。它其实是一个方法论,这个方法论其实没有一个固定的形态,就像前面说微服务没有一个最终的答案,也没有一个最终的结果。我觉得DevOps同样是这样情况,它其实是解决你的,就是让开发人员最有效的,***发挥你生产力的一个方式,在我看来应该是这样。这张图很多人都在用,研发、测试、运维交织在一起,其实就是一个DevOps。我是2000年开始工作,那时候我工作的公司也不大,团队比较小,像我这样去了以后当时认为就是新手,从前干到后,装机啊,跟客户做服务啊,编内核啊,写程序啊,所有事情都要做。我感觉那时候我就处在这个位置上,所有的工作都是我自己的,或者一两个人来做。现在的情况,人力模型已经不一样了,现在团队都比较大,做前端的就是做前端,做后端的你说我做数据库的,做DBA的,其实都不管写代码。这种情况下相互之间有沟通的时候,就容易产生这些效率低下的问题。
怎么解决这个问题,我觉得DevOps整体的目标就是把这些沟通流程的问题打破,让你从前到后能够很顺畅的完成它。这三点是我自己总结的,***点你在研发的阶段一定要把你在生产阶段的这些事情定义好,你生产的环境,你部署的方案。这个事情我的感受是来自于我开始做容器,以前你做研发的时候肯定是运维会负责线上环境的一致性,你说研发根本碰不到,你也不可能拿到账号密码注册之类的。你做了容器之后,其实你已经把所有运行的环境封装在一起,这个时候其实很容易就达到了你在研发的阶段,就能够把你生产环境的定义做好。其次你要把这个流程定义清楚,这是我加入华为之后***的感受,就是华为里面有很多很多流程,其实你做每件事情里面都会有一个定好的,你要向谁申请,这个申请由谁来批注,然后怎么样。这个流程定义之后,像我们出差各种方面其实把这个工作流程填好就可以。如果研发里面一个项目的一个产品,它的运维,它的这些方案,比如它的回滚的机制,所有的你都能定义好,你整个相对就会比较流畅。现实中的很多问题,今天老板外面聊天很开心,回来跟你说你要做一个特性,明天要上线,没有时间定这些东西。所以你要把流程定义好,知道真个工作大概的时间。你希望速度加快,就是你把所有能自动化的,当然这是理想,能够自动化的全部自动化,尽量少的人工参与,才能够有这样的效果。所以基于这些特点,我们在设计PaaS产品,DevOps产品的时候,想的是应该以容器的方式做DevOps,这是我们产品最核心的目标。
这个没有太多想讲的,这是Cloud Native 。我们现在在做容器的DevOps,容器其实属于CNCF基金会的一个范畴。CNCF就是 Clound Native Computing Foundation。Cloud Native 是什么呢,这个JoeBade以前是Cloud Native 的一个产品经理,去年离开的开始创业,我记得后来做投资,后来投资不行开始创业了,现在跟Cloud Native 另一个沉淀,以前CNCF的一个国内的代表,他们出来创业。这是他对Cloud Native 的定义,我根据他的那些定义,因为这篇文章其实是没有公开的,是在Cloud Native 内部应用列表里面,加了这几点。他其实是定义了Cloud Native的范围,我看完之后其实还是不知所云他讲的是什么。我心里觉得Cloud Native 很简单,就是你的应用以容器的形式封装,可以在任意的服务器,任意的云的服务之间,可以流动,这时候你的应用就应该是Cloud Native 。我认为只要是容器化的,就应该符合Cloud Native 。他这里讲了很多,其实扩大了一些概念,这个我觉得可能是一个商业的目的,并不是一个技术的目的。
这是我们华为在做的ContainerOps。我们讲的概念是什么呢,我们讲DevOps的编排。是什么呢?我个人是这样觉得,应用前面讲DevOps是一个方法论,所以如果任何一个人,有一个公司,或者有一个产品项目推销,包括华为。如果他说他能够解决你DevOps的问题,我觉得他一定是忽悠你的,三个字叫大忽悠。没有一个工具,没有一个产品,能够完全解决你DevOps的问题,他只能涵盖你DevOps中的一部分。DevOps应该是从始至终,从你团队成员的教育开始,包括你流程的定制,包括你项目的特性,针对所有这些东西来去定制,形成整个一个DevOps的流程。所以我们做DevOps解决的一个问题就是,我们解决DevOps里面有很多很多工具,有很多插件,你还有很多自定义的事情。我们解决如何把这些自定义的事情编排在一起,形成一个有效的DevOps工作流,这是我们解决的问题。我们也不能完全解决你DevOps所有的事情。我觉得你如果要实施一个DevOps,在你公司的内部应该是你有很多工具,有选择好某一个适合某一件事情,然后把它串在一起,然后再有一个Consultant4来帮你咨询说你在某些地方是需要如何改进。然后反反复复这样不停的迭代,你才会形成一个好的团队,能够做DevOps。11这是我们对DevOps的认识。
我们讲Component。Component的概念是什么,在我们这里***个你原来所有自定义的工作,这个Component是由我们这个平台来帮你维护整个生命周期的。它是一个比较合适短时间的任务,比如我要扫一篇代码,检查一篇代码格式,有一个PR上来以后,你扫一个代码格式,说这个提交不行,或者它没有签名。这些短期的任务,是由Component来完成。这个Component从运行到它的结束,所有的这些工作是由我们这个ContainerOps平台来帮你来维护。我们会把它下放执行,这个我们管它叫做一个Component。其实很简单,它就是把DevOps的工作封装在一个容器里。我们觉得如果你做一个Component,或者你希望找到一个Component,没有这样的环境,这个生态并没有发挥出威力,包括我们的产品也没有。所以华为会在下个月有一个服务,sh的运营。这个opshub是我们专门用来存所有Component的,你可以把你做好的东西存上来。我们也会做一些,在我们给别人实施过程中遇到的问题,我们自己有做Component,也会存上来,我们也希望用户能存上来。你再做你自己DevOps工作的时候,可以先在上面找搜,找到你需要的东西,就不用再做了,你拉下来执行的时候也不用关心它到底是什么样,它只是完成你希望的工作。
为什么呢。这是我们对它的封装。这个(19:11)你可以认为就是一个docker的(19:13)。我们在未来会提供其他的,(19:15),因为这是现在业界标准的一些格式,我们会支持多种格式,我们会把它做一个转换。只要你用(19:25)先做好,我们会在上面讲的这个服务里面帮你做转换。在一个镜像启动以后,我们提供很多环境变量给你,这些环境变量代表不同的意义。这是我随便写的一个程序,你把环境变量拿去做事情,跟我们整个平台做交互。其实这些环境变量多数带来的是(19:54)的地址,安全我们的要求pose出来,我们就知道你在干什么。这是你在做一个Component的时候要设计一个环境变量,你在定义工作流的时候还可以设计很多其他的环境变量。你可以在***步工作的时候,把这个环境变量设置一个值,比如dete的值,另一个容器引擎,另一个容器的Component再去读这个值,这样你可以达到数据传递的效果。这个效果其实有些麻烦,我们还有其他的机制。比如说这里一个COdata,其实它是在容器启动的时候传入数据的环境变量,整个是一个JS的数据,所以你在这里可以拿到JS的数据,支撑你数据的运行。然后(20:53),你在所有结束之后,把你输出的定义定义一个JS进去,然后pose到这个地址,这个地址会传递到下一个。
整个流程是这样的,当你***步启动的时候,你可以从COdata拿到你需要的业务数据,这个Component变量会带来一些,比如你在哪个工作流里面跑,你的ID是什么,这些信息会用于你跟这边的交互。第二步就是你向Component(21:27),我们的平台就知道你的容器启动起来。但是我们可以调动(21:35),我们觉得在这个里面可以直接让你给我发一个消息来的更直接一点,这样减少跟(21:44)的交互。减少这样的交互,有利于将来我们整个这套东西移植到其他的平台,比如说(21:53),或者是其他的PaaS平台里。你告诉我们你的容器启动以后,你去拿一些环境变量,你可以开始执行你的任务。但是执行的时候,之前你给我一个消息,我知道你开始执行了,在你执行的过程中反复的向状态的地址pose数据,我们就可以拿到你的中间输出。在你***结束之后,你pose一个消息给我,说这个任务执行是成功还是失败,你把你需要传出的数据在这了,放到http的包里面发给我们。我们可以把这个数据传递到下一个执行的任务。***你发一个stop的消息,我们整个平台就会把这个容器干掉了。这边就是在执行过程中你可以读取你设置里面的环境变量,有可能是***次设的,也有可能你从其他容器里面得到的。
这里给大家放一个视频。这里就是说如果你做好一个容器的Component,你看到现在这个界面是我们开源的界面,你就把它注册在这个平台里面,这是你做的。你也可以给它指定一个版本。这里其实是一些特定设定的名字,你来设定。andpoes是指这个容器的地址,我们刚才会专门给开发者一个(23:57),你也可以用docker(23:59),或者用其他国内服务都可以。这个主要是分辨率的问题,因为我录的时候是1080P的,估计这个线的问题。下面会有一些设置,上面黑色的部分你的容器是跑在(23:32)的,将来我们会把(24:33)其他的都拽在这里。这里你可以分配一些资源,我这个任务跑的时候要用到CPU多少内存。这里是定义,我们前面讲(23:43),你会传入一些jason的数据,你可以把jason的数据直接写在这里,这是你输出的数据。你把它注册在这里的时候,所有人都知道怎么去用它,因为他知道传入数据和传出数据是什么。这个做好了一个容器镜像,就保存在这里了。这个后面还会再做一些其他的镜像。
这个就是我们怎么定义整个工作流的过程。在这个起点一般的指令是写一个仓库的地址,我们会告诉你一个UL,你放在(26:47),它会传递这个数据。比如你设置是PR的数据还是(25:51)的数据过来。这里面是定义step。现在很多公司都是用(26:03)做DevOps,有很多网上的资料或者很多假的说,有建几个step,比如说(26:15),有各种各样的step。我们这里推荐按照你自己的业务逻辑建step。
我们讲一个例子,最近我们这套东西跟(26:31)在合作,它是国内一家在做分布式数据库的公司。所以他们把他们整个的DevOps分成三个step。***step是什么,他们在他们的分布式数据库叫(26:46),其实是下面一个KV,上面一个SQL的解析层,它的整个这一套是兼容MYSQL协议的时候,所以它有2万5千个MYSQL的测试用地,要在它的程序上跑,它把这个定义为***个step。就是说我公共测试,你任何一个开源的PR过来,我都要跑2万5千个测试,保证你能够兼容MYSQL的测试,这是它的***个测试。然后他认为这个应该是一个step。我们跟他分析的时候,这2万5千个没有顺序跑肯定不行,我们根据测试的关联关系分成很多(27:21),每一个跑一些测试领域。在一个step统一时刻,就跑三个或多个,就把2万5千个执行。
第二个step是什么呢,就是它每天晚上都要做一遍测试,这个测试是什么,就是把当天所有合过的PR,比如当天合了6个PR,把这6个PR合在一起,生成一个要测试的版本。在当天晚上再去跑一个测试,这个测试关注的是性能。我今天合的6个PR跟昨天的版本,之间性能上有没有差距,这是它要关注的水平。所以在当天每天晚上去做这件事情,我们又给它发出一个step。
第三个阶段是说,***我要做成一个产品的时候,我要做一个7×24的测试,所以用了很多很多服务器的资源。比如说它要裸机,要有虚拟机,因为它是分布式的,要在可能不同的云服务厂商里面切很多机器来去测。不停的杀掉一个节点,看它的服务是不是完整,一致性是不是得到保证。所以这个时候我们认为这个测试不是一个每日的,而是要根据版本,对于我们来说就是打标签的时候要做。所以我们又划分一个step,所以在那个step里面执行。
我们目前这个开源版本里面,它对接的顶层,一个是(28:58),另外我们现在在做的就是能够对接各种云服务厂商,比如说AWS(29:02)这些云服务厂商。因为没有一个服务厂商能够开放所有的API,让我既能调动测试容器,又能调度测试逻辑,又能调度VM,没有。所以我们只能不同的环境,来实现(29:19)那个需求。但是在我们商业平台PaaS平台里面就不太一样。这个待会下一个讲师会讲,资源调度那一块,我们能够支撑不同的任意资源来管理。所以如果在这个测试领域里面,如果在商业版本里面,其实底层已经把虚机、裸机,还有容器所有这些环境都已经覆盖了,所以就不需要再去兼容这些了。
这个我们划分为三个step,其实你不需要按照网上很多,包括AW上面有各种Step的模板。而是要分析你自己实际业务的情况,然后去定义一个合理的step,来去做。所以我们认为这个step应该是你创建来做的。
这个调度完了整个的情况是什么,在我们平台的位置,后面可以调动其他云的服务。上面我们会有其他开源的产品。它其实是一个容器镜像的可以看到一个增强版的,支撑更多的格式。是专门做容器或者一些其他工具的构建。它最主要是把你任何一个工具,把你的构建任务变成一个docker,放在下面整个的平台执行。这是我们明年计划会做一个bet服务,我们会重新重写bet的后端存储。我们按照bet的存储格式,因为bet在服务器上是一个仓库,一个目录,所以一个仓库是不能横向,只能用多个拷贝的方式来应对多个并发。我们是把整个文件,因为上面其实是一个Kvalue的文件,我们把这个文件K和value安全按照bet协议解析,插到分布式的数据库里面。这是我们商业版本要做的,经过测算认为我们可以做一个15T到20T的bet的仓库,是一个高并发的访问。因为我们在华为内部也有很多代码,代码量也很大,也遇到这样的问题。
CI和CD明年都会有对应的开源的产品,这是整个的架构。通过这个引擎调动起来,流程就比较简单了。***就是你在WorkFlow里面会定义一个工作流WorkFlow,WorkFlow这个在你的版本提交里面会提醒WorkFlow引擎,会告诉你构建做一件事情。每一步构建完了之后,会把产品存在仓库里面,再把它拉出去做CI和CD。这个流程相对比较简单。
我们看整个构建的时候是怎么做的,这完全是一个拖拽的工作。刚才选的是用哪个compent,在每个里面都选一个自定义的工作来做。它画了一个这样的线,就是说在你传入的数据里面会发到这个(33:09)里面来。这边是对应传出来的数据,我们把它解成数据,这边是传出的数据,会按照同级来匹配。这个输出之后就直接传给它,这里演示的是一个传出的冲突,这样手工能把冲突解决掉,形成正确的数据流。
其实我们在整个项目里面最复杂开发的是这一块,我们是怎么做数据传入和传出,就是我们在compent已经定义了我传出的是什么,传入的是什么。我在不同的组建中间定义好,提供这样的工具。
我们刚才讲的是从这里到这里,是这样的一个传输的事件定义。在这里你可以把两个组件输出的事件传递到一个里面。这种情况下就会有冲突的可能,因为你同级下面两边传的是一样的,系统会自动的帮你把冲突的地方找出来,让你来选。红色都是冲突的,你选择一个以后,把不需要的点叉,都占掉。这个就是刚才那个demo,给大家演示的那个。
这是整个引擎,整个WorkFlow执行起来的情况。在这里先伪造一个post的消息,这是它post的工具,把这个地址URL换了,伪造一个post的工具,中间传入的是一个get someting的地址,中间应该有很长时间的等待。在这里我们默认在自定义的时候,你可以定义的地址,因为是响应最多的。比如你在某个流程里面需要手工去做,你可能要把它嵌入到整个工作流里面的时候,你再发一封邮件有一个地址,你post地址,整个WorkFlow就往下执行,这是它执行的结果,有的失败了,有的成功了。这是当时成功执行以后,都是绿色的,如果是失败的话,就是红色的。这个是一个执行成功的。这里会看到它输出的日志。
整个的UI就是这个样子,因为这个版本是我们在上个月CNCF基金会上的版本,跟现在这个版本有点出入,界面上做了新的调整,要比现在的更好一点。这里是我们讲的WorkFlow为什么要做这件事情,我们不希望用户把你所有的工作全部迁移到这个上面来,因为你研发的流程是一个持续的过程,不要中断它。但是你可以把我们WorkFlow的引擎做一个***层的编排调度,可以在构建的时候引入你自己的方案。
你再往前修改,再去演进的第二个。因为我们明年会有测试工具,你说现在没有,我自己有一些测试的方案,可以在这一步的时候把它再引进来带,形成一个新的测试。
这是我们整个ContainerOps的设计情况,这里其实没有更多的代码级别产品的实现,因为我们还会在http所有的活动里面进行讲,大家可以去关注,因为我们会直播。这里Orchestration,这是我刚才讲的,我们会把compent我们收集到的,我们跟社群里面合作的,都会在这里。下个月这个服务会发布。当然你可以认为它是一个dockerhap,但是我们不希望你把它当成一个dockerhap来用,你存个几十G的东西在我们这里,其实对我们压力也很大。因为这个所有的费用全是由华为来出的。因为华为所有的开源都是建制北美,所以我们所有的服务都是在北美做的,放在GCE上,所以所有的费用其实挺高的,包括整个拉下来。这个网站只是一些简单的介绍,我们会在明年Q1的时候,会把你刚才看到的界面重新整理成一个服务,你可以在上面调度你自己的产品,当做一个是开源的服务。如果你的项目是开源的,或者是比较小的项目,你可以在上面定义工作流。你可以用我们做的compent,也可以用业界已有的。
我们现在跟社区有一个合资的计划,我们会单独量身订做整个workflow,像我们都会直接跟所有人聊他们的研发流程是什么,我们帮他去划分这些(41:52),做这件事情。如果你是一个开源的项目,你的项目比较符合,比如说你是容器的,还是分布式的,还有微服务,如果你是这样的项目,如果你希望我们来帮你做的话,我们也是可以做的,但是这是需要双方来有一个合作的协议。这部分做的所有的CI的资源,所有你做构建的资源是由我们华为来做的。但是我们还是希望这个开源的项目符合我们对项目的定位。还是两部分,一部分如果你是商业想用企业版本就是联系我们的销售,如果你是开源项目,你可以跟我们联络,我们可以帮你来做,我们可以派一个工程师上门到你的办公室跟你去聊,怎么做DevOps,怎么用我们的工具把你DevOps流程做好。如果你说我只想试一试,你可以再一两个月,明年我们就会发布服务,你可以在网站上试。
这就是我们的口号,整个胶片我在北美讲的是英文版的,所以回来的时候没改,就是这样。
(结束)