王炜 腾讯云 CODING DevOps 高级架构师,Nocalhost 开源项目负责人,CNCF 大使。
本文根据 2021 年 4 月 10 日深圳站举办的【腾讯云原生技术开放日】 线下活动中,腾讯云CODING DevOps 高级架构师 王炜 关于“Nocalhost - 五星级的云原生开发体验”的演讲整理而成。
关注【腾讯云原生】公众号,后台回复【云原生技术】,即可获得4月10日云原生开放日所有讲师的演讲PPT。
大家好,今天跟大家分享的话题是云原生开发环境 Nocalhost。之前已经分享过了在应用上的 K8s 或者容器化之后给我们带来了一些在运维层面或者发布层面的收益,比如像滚动、灰度、A/B Test 之类的,一些运维方面的能力。其实我们会发现在我们业务应用上了 K8s 容器化、拥抱了微服务之后,我们会遇到一个非常棘手的问题,就是我们在本地怎么去开发它?
相信大部分一线开发同学应该是比较深有体会的,所以今天我们分享的话题就是跟云原生开发息息相关的。
这次分享主要会以这几个模块跟大家做主要的介绍:第一个是 Nocalhost 因何而生,我们为什么要做这个项目?第二个是目前主流的云原生背景下开发方式。第三个是我们做开源产品当然要知道我们最终想把它做成什么样的效果,比如像 K8s 目前是云原生的一个标准。第四个是 Nocalhost 的实现原理。第五个是组件构成,Nocalhost 由哪些组件构成。第六个是我们现场会演示用 Nocalhost 怎么来开发 Istio 官方的demo Bookinfo。
Nocalhost 因何而生
第一个是 Nocalhost 因何而生,为什么云原生、微服务、分布式的应用开发很难? 首先看左边的图,左边的图从基础的单体架构上来说,本地的开发体验是非常好的,比如像以前流行的 PHP,我们在开发 PHP 的时候要在本地修改完代码、刷新页面就能立即看到效果了,这是以前传统的开发方式或者单体开发方式。它是组件少,人员或者规模也比较小,环境搭建或者运维相对来说多比较简单。
随着规模或者应用场景越来越复杂,我们拥抱了微服务以及 K8s 容器化,所以这个时候我们把我们的单体应用拆成了巨大的微服务应用,它的微服务组件可能是由几十个、数百个组成的。 从右边这张图,我们就会发现微服务和微服务之间的调用是非常复杂,意味着本地怎么开发某一个微服务组件呢?常见的痛点是我需要在本地把我所有的微服务给run起来,如果微服务特别巨大,可能需要准备一台非常强的本地开发机,可能是64G内存,I7或者I9之类的,才能搞定业务系统开发。
拥抱微服务最大的问题可能还是处于开发环境的搭建以及整个开发和调试是比较困难的。
从单体架构的开发自测来说,我们每写一行代码或者几行代码、十几行代码,我们想看一下效果,在单体的架构下是很简单、快速的,但是在容器化、K8s 这种环境下,其实整个开发自测循环是很慢的,我们常见的一些开发方式可能是我写一行代码之后,然后我来运行 docker build,重新构建一个镜像,可能还要 docker push 把镜像推到我的仓库里,再修改集群工作的负载版本,再等 pod 重启,才能看到最新的效果。整个开发自测循环是非常慢,可能是五分钟、十分钟甚至更久的时间。
在开发环境上的管理,同时也会有遇到一些问题,就是在单体架构这种开发环境下是很简单的,准备一个配置不需要那么高的开发机,我就能搞定业务开发。但是在微服务这种背景下,可能有些团队会采用本地和远端组合的形式,可能会遇到不同版本的环境管理混乱的问题,甚至是需要等其他开发用完之前的环境,然后我下一个才能去用,出现这种排队的情况。
刚才提到了我们目前主流的开发方式,我们基于目前主流的开发方式整理了一张简易的图,重点关注最左边的开发方式,所有服务运行在本地的情况。可以发现,它的编码和自测反馈循环体验是最好的。开发测试环境、维护成本、横向扩容能力,这些其实都是非常弱的。当然,我们使用 K8s 和容器化之后,最右边的所有服务都运行在云端,除了编码自测返回、循环反馈体验不好以外,其他这些给我们带来的能力或