乐趣区

关于腾讯云:云原生技术开放日PPT大放送-五星级的云原生开发体验

王炜 腾讯云 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 和容器化之后,最左边的所有服务都运行在云端,除了编码自测返回、循环反馈体验不好以外,其余这些给咱们带来的能力或者收益其实是十分棒的,特地是后面咱们提到的在运维层面的根本能够实现服务这种自愈以及主动扩缩容等等能力。

咱们讲到最左边的图,对 Nocalhost 我的项目来说,咱们心愿有没有可能找到一种办法能够在汇合对左边开发方式所有长处的同时,而后把最右边所有服务运行在本地的编码自测反馈循环体验的五颗星这个长处也放在为左边的模式下,这是心愿 Nocalhost 想解决或者心愿解决的问题。

Nocalhost 的愿景

Nocalhost 的愿景,咱们产品的愿景是让云原生的开发回归原始而简略。也就是说,跟你在本地开发一个单体利用一样这么简略,你不须要思考一些简单的背景常识以及利用方面的背景常识。

方才咱们所说,我在传统的云原生开发可能须要五分钟甚至十分钟的体验,那对 Nocalhost 来说,整个过程咱们是能够做到秒级。从原来这种开发环境凌乱的状态,到当初 Nocalhost 提供的一个有序的环境治理。Nocalhost 提供的开发环境,自身是不提供计算资源,也就是说 Nocalhost 自身不提供 K8s 集群,它是用现有的集群资源,通过 Namespace 的形式调配给每个开发者去做开发,如果联合一些云计算弹性方面的能力,甚至能够做到按需分配以及用完销毁的。

Nocalhost 让业务容器进入一个开发模式

第四个跟大家分享 Nocalhost 的原理,为什么它可能做到在容器化的开发场景能够做到这么高效的开发,它次要的外围点在于 Nocalhost 能够让业务容器进入一个开发模式。

Nocalhost 有几个外围的概念,第一个是利用,可能是由很多个微服务组成的,比方 Bookinfo 是一个 Kubernetes 利用。咱们公司的服务是由一百多个靠近两百多个微服务组成的,所以这也是一个 Kubernetes 利用。其实在 Kubernetes 体系下是没有利用这个概念的,所以当初应用领域,比方大家所熟知的 OAM 规范以及 Kubevela,它们是有从新封装一个利用的概念,这是对 K8s 能力的补充,因为咱们都晓得利用是几个工作负载组合成成的,其实这个只有咱们才晓得,K8s 集群是不晓得的,所以这是利用。当然,利用有很多种类型,能够用 Manifest 组成利用,能够 Helm 组成,也能够用 Kustomize 组成的利用,这在 Nocalhost 外面都反对的。

第二个就是集群,也就是计算资源须要用户来提供。其实这个提供能够说是只须要提供一个集群资源就好了。至于调配给每个开发者,它是基于 Namespace 隔离的,用于部署每个开发者的开发环境以及开发时候用的。

第三个是开发者,开发者在 Nocalhost 外面也是有一个概念的,我这个企业上面可能有很多开发者,我只需给你调配一个开发账号,你登录就能进行所有的开发工作了。

最初一个是开发空间,后面曾经讲过了。

在讲下一个的话题之前,咱们先把 Nocalhost 的环境一键初始化起来。Nocalhost 提供了一个 CLI 工具,用来疾速初始化整个开发环境,并且会内置一些利用,比方像 bookinfo 疾速体验。只有这一条命令就能够了。

通过插件端,开发者能够一键拉起本人的开发环境,就是点左边的小火箭就能够开发,就能够拉起残缺的一套开发环境了。

实现原理是,让某一个业务容器进入开发模式,甚至是不同的开发者之间在雷同一个开发环境里独特来合作开发,比方我开发的业务代码须要依赖于你的新接口,所以会有一个协同开发的过程。对于 Nocalhost 来说,在同一个 Namespace 可能会有两个开发者共享开发者,并且去做协同的开发工作。

进入开发模式会产生什么呢?首先咱们会替换整个业务容器的镜像,比方咱们会 disable 跟生产、运维无关的货色,HPA、Liveness&Readiness,以及让它的实例正本数到 1。最重要的一点,咱们在开发的时候也会给这个业务容器加一个 Sidecar。这样,整个 POD 会有两个容器,第一个是为业务代码提供 Runtime 能力反对的容器,第二个是文件同步的容器,它们两个会通过共享卷来共享存储。

实现了这一步之后,咱们本地的代码其实就是能够通过经由 Sidecar 的能力,同步到远端开发环境的 POD 外面。再联合 Nocalhost 提供很便捷的获取远端容器的 Terminal 的机制,就能够实现在容器外面间接运行业务代码。

为什么业务代码能在容器里运行?因为这个容器是真正的业务容器,保留了所有你之前给它设定的 ENV,不论你是通过 configMap 挂载,还是在 Deployment 里申明的 ENV,这些货色都是有保留的,可能有一些业务会在 InitContainer 里做一些魔法的操作,这些货色全会被保留。这就意味着在容器外面 RUN 业务代码是齐全 OK 的,并且是走整个集群的网络,在网络层面以及在流量层面也都是 OK 的。

Nocalhost 除了提供对业务容器间接进入开发以外,咱们还会做一个依赖解决的逻辑。打比方,在 Kubernetes 环境下,如果部署一个利用,这个利用可能是由两百个微服务组成的,你发现很多利用在业务逻辑是有依赖关系的,然而 K8s 并没有为咱们提供这种依赖关系解决,部署完之后很多 POD 会一直重启,因为可能有些业务是依赖于 DB、MQ、根底组件。如果它找不到这些服务,它本人会挂掉,意味着很宏大的微服务真正被拉起来的时候,POD 会被重启 N 次,因为 K8s 对这些 POD 重启的工夫频率,它是一个越来越慢的算法,所以这就导致了你拉起整个开发环境的工夫是十分久的,像咱们外部的零碎两百个微服务左右,如果仅仅用很粗犷的形式去部署大略三十分钟能力把整个业务全副 RUN 起来,会发现外面很多 POD 重启次数曾经达到几十次。

这是 Nocalhost 提供的另外一个能力,也就是业务方能够给 Nocalhost 提供一些依赖的申明式的配置,在部署的时候,Nocalhost 会有一个准入控制器。咱们会把进集群的所有工作负载拦挡,依据你申明的服务依赖信息给这些服务注入 InitContainer,InitContainer 就是等会期待被依赖的服务启动,而后我再启动本人,其实是一个期待的过程。这是由 Nocalhost Agent 拦挡,并且主动注入的,所以这是 Nocalhost 提供的第二方面大的能力。

Nocalhost 的组件,方才曾经大抵说到了,一个是 CLI 工具,这个工具是给开发者用的,也就是本地电脑装这个工具就好了。当然它的命令有很多,你齐全能够应用 CLI 工具对你的工作负载进行开发,然而命令非常复杂。

还有一个 Sever 端,它有几个大的性能,一个是我能够创立我的利用,以及开发者、用户,就是我所有开发人员。

方才所说到 CLI 工具用起来是比拟麻烦的,所以提供了一个 Plugin,也就是 IDE 的插件,当初都是能够间接用的,所以你只有装置,对开发者来说只须要装置 CLI 工具和 IDE 插件就能够实现非常简单的云原生的开发体验。插件的益处在于,因为 IDE 是对靠近开发人员的,在插件进行开发环境的操作是最简便的。

最初一个是 Agent,它也是以 Deployment 的模式布局在集群的,当然这些都是主动的。

后面的解说,咱们实现了像在本地开发单体利用一样,在 Nocalhost 下的开发体验汇合了所有的利用所有开发环境运行在远端,并且编码和自测反馈循环是一个十分好的体验。

在咱们 CODING DevOps 外部目前曾经全副应用了,实现的成果是新员工入职当天,他就可能独立提交业务代码。这在以前可能是比拟难的,也就是说一个新员工入职可能须要一周左右的工夫理解开发环境是怎么样的、业务零碎大略是怎么样的、我要怎么搭这个开发环境。在真正搭的时候,可能从第二周真正开始,过程中会遇到各种各样的问题,可能会有本人的师兄或者本人的导师来帮助解决。在原来的业务开发模式下,从效率上来说是不高效的。在 CODING 外部,所有利用都是依照业务线分的,像 CI 运行本人最小化的 CI 利用、微服务这些整合起来的利用,最小化的利用。CD 也是运行本人最小化的微服务开发环境。

比方我当初接到一个需要,我须要去开发登录或者是整个音讯告诉的组件,对于新员工来说,他惟一须要晓得的是我须要开发哪个组件就好了。点了开发之后,它会主动帮你克隆代码,主动关上,甚至你这个利用是怎么运行的,在 Nocalhost 外面都是能够配置的。也就是说,它甚至不须要你这个利用的运行命令是什么样的。在咱们外部应用目前 Nocalhost 撑持了咱们近百名开发人员日常的开发工作,所以咱们采纳的是一个集中式的开发环境的治理。也就是说,一个运维团队管了所有这些开发资源,这个集群是一个微小的资源池。

目前 Nocalhost 是开源的,并且采纳 Apache 的开源协定,在 GitHub 上是能够找到咱们的我的项目。

整体的 RodaMap,目前 0.1.0 版本在 K8s 环境下十分好的开发体验。当然,也不排除当前会反对其余的环境。

依赖剖析、按需启动,目前对开发来说,其实也是一个十分大的痛点。Nocalhost 目前的毛病在于每个开发人员都要运行一套残缺的开发环境,也就是说它蕴含了所有的微服务组件,但实际上你如果要开发某一个微服务组件,它可能是不须要启动残缺开发环境的,所以咱们接下来会做依赖剖析以及按需去启动你要开发的微服务组件所依赖的组件。最初咱们会实现共享开发环境,这是什么意思呢?这个共享指的是我可能会共享一些根底组件,打比方,咱们当初每一个开发同学都全量拉起了所有的微服务组件,有一些根底组件平时是不怎么被更新的或者基本上是稳固的状态。Nocalhost 接下来想实现的指标是对于这些组件,大家一起去共用,联合 Service Mesh 的技术做一些流量转发甚至实现根底组件是共享的,能够大大减少整个开发环境所须要的一些资源。

QA 环节

发问:我想问一下,在一个上百人的研发团队里,因为有些人对 Docker、K8s 这些常识不相熟,如何从零开始推广这种开发模式?

王炜:Nocalhost 要解决的外围问题,其实这也算是一个。你会看到方才我在对 Bookinfo 微服务组件做开发的时候,我是没有运行任何的 kubectl 或者是 Docker 相干的命令的,意味着这些常识曾经对开发人员屏蔽了。比方你须要看一个工作负载具体的状况,你可能用 kubectl get deploment 的命令去查看,如果你是传统的开发方式,你可能须要用 kubectl edit 来批改你工作负载的镜像版本。如果是传统的开发方式,你须要具备十分多的至多是入门级的或者晓得怎么去应用 kubectl 以及 Docker 常见的这些命令。如果你用 Nocalhost 来开发,你会发现全程简直不波及到这些常识的,你所须要做的就是点一下那个锤子,而后去开发它就 OK 了。

发问:根底环境中,比方波及到 K8s 还有一些 Helm 的编写,这些是由运维团队来负责的吗?

王炜:实际上不是运维团队,在咱们外部会有一个基础架构的业务团队来保护根底这些环境。当然,波及到每一个微服务你要去更新,就是更新基准环境的时候,这是由每一个业务团队负责的。其实这个问题痛点咱们公司之前也遇到过,你想要保护一套对立的 Helm 或者 Manifest 是十分难的。比方我的微服务,它有可能被任何一个部门更新了,导致我要把它拉起来的时候,我发现各种报错,齐全拉不起来,或者它是旧的版本。这里的外围问题,你们保护的那套货色不是被高频应用的,所以它即使是呈现问题了,它也很难被人发现或者很久才被人发现,缓缓这套货色就不被保护。如果采纳 Nocalhost 集中式利用治理,这个问题就会被解决掉。因为拉起部署环境以及进入开发这些动作都是十分高频的。在一个团队来说,咱们发现只有有了工具化的帮忙,你会发现团队内会造成良性的循环。也就是说,我在用 Nocalhost 开发的时候,我会发现我有一个组件 RUN 不起来,这个组件可能是我负责的或者我保护的,我就会把它更新掉,或者有一些新的 feature,我会把它更新下来,因为我也要依赖于这套货色开发。

发问:假如咱们当初搭建这么一套环境,新人进来了,Nocalhost 服务挂了,会不会导致公司整套用不了?容错计划有没有?

王炜:没错。首先这个答案是必定的,就像公司采纳了 K8s,这个集群挂了,它会导致你的业务没方法 RUN,会进行的状态。理论来说,整个 Nocalhost 是部署在 K8s 环境下的,所以你能够为 Nocalhost 配置一些 HPA 之类的。当然,从 Nocalhost 自身来讲是高可用的,然而依赖于你提供的 K8s 集群稳定性。你如果是自建集群,那稳定性可能从概率上来讲应该没有 TKE 高。

2 发问:如果我有 ABC 服务,要开发两个服务,AB 两个服务依赖 C 服务,我在线上会不会导致有这些问题?

王炜:你方才提到的有这些问题,开发模式是局部运行在本地,局部运行在远端的开发模式。然而 Nocalhost 的开发模式是在你本人开发空间里部署残缺一套你所有的业务利用以及微服务组件,所以这是不会的,因为你集体用的就是一套独立的开发环境或者是跟他人齐全不抵触的。

发问:你好,我次要是问一个具体的问题,假如一个 AB 服务,A 服务在迭代,B 服务迭代,可不可以做到跨 Namespace 互相联调的性能?如果能达到将来所说的,一个是共享资源可能不要呈现复制多份的问题,你们那边 Namespace 会不会呈现收缩的状况?大略一百多或者两百多员工,集群十分大,如果是繁多的集群可能会存在收缩的问题。

王炜:第一个问题又分两个问题,一是你刚刚问到能不能跨 Namespace,这个目前曾经在施行了,曾经在做了,马上会反对这种集群级的开发。不论几个 Namespace,在 Nocalhost 下都能够开发。这位同学十分敏锐发现了 Nocalhost 当初比拟不好的一个点,比方我要开发 Prometheus 组件,它是在固定的 Namespace 上面这种组件,用 Nocalhost 开发也是能够的,你须要用 Nocalhost 的 CLI 工具,但它的应用门槛太高了,所以咱们接下来会在插件层面反对这种集群级的。不论你提供的是什么样的权限,可能是管理员或者是具备多个 Namespace 的权限,你能够在不同的 Namespace 上面开发。这是第一个问题。

发问:能不能通过将来服务网格的问题彻底解决第一个问题,达到像你说的每个人到时候就是一个 K8s 集群,并行迭代开发也能互相联调的问题失去解决。

王炜:是的,用服务网格的计划是能够实现的,是齐全能够解决的,但从目前实现方面的技术难度来说,可能 Nocalhost 须要本人做一个独立的管制面,所以它的实现难度十分大,基本上可能要基于 Istio 做二次开发。这方面咱们有长期的布局,然而从目前来讲可能咱们团队认为云资源将来会越来越便宜。在环境资源上看,现有能提供这种计划或者是现有这些资源能满足开发条件其实临时还没有必要在节俭资源方面投入太多的精力。

容器服务(Tencent Kubernetes Engine,TKE)是腾讯云提供的基于 Kubernetes,一站式云原生 PaaS 服务平台。为用户提供集成了容器集群调度、Helm 利用编排、Docker 镜像治理、Istio 服务治理、自动化 DevOps 以及全套监控运维体系的企业级服务。

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!

退出移动版