当前位置: 首页 > Web前端 > HTML

使用 Nocalhost 与 KubeVela 端云联调,一键完成多集群混合云环境部署

时间:2023-03-28 19:06:02 HTML

使用Nocalhost和KubeVela端云联调,一键业务开发完成多集群混合云环境部署?在启动应用程序时,云开发者如何在现代多集群和混合云环境中轻松开发和调试应用程序?在部署过程中,如何让应用部署充分验证和可靠?这些关键问题亟待解决。在本文中,我们将结合KubeVela和Nocalhost开源项目,给出基于Kubernetes和容器生态的端云联调和一键部署多集群混合环境的解决方案来回答上述问题。当一个新的应用需要开发上线时,我们希望在本地IDE中调试的结果与最终在云端的部署状态是一致的。这样一贯的态度可以让我们对部署有最大的信心,也可以让我们像GitOps一样以更高效、更敏捷的方式迭代应用更新。即:当有新代码推送到代码仓库时,环境中的应用会自动实时更新。同时,端云联调模式可以让整个流程不仅敏捷高效,而且更加稳定可靠。基于KubeVela和Nocalhost,我们可以完成这样一个部署过程:如图:通过KubeVela创建应用,将应用部署到测试环境,挂起部署。使用Nocalhost在测试环境中对应用进行云端联调。调试完成后将调试好的代码推送到代码仓库,通过KubeVela部署GitOps。在测试环境验证通过后,同步更新到生产环境。在本文中,我们将介绍如何使用KubeVela和Nocalhost来完成上面云应用开发和上线的全过程。什么是KubeVelaKubeVela是一个基于Kubernetes和OAM技术构建的易于使用且高度可扩展的应用程序交付和管理平台。其核心功能是让开发者无需了解任何与Kubernetes本身相关的细节,就可以在Kubernetes上轻松快速地定义和交付现代微服务应用。KubeVela提供了VelaUX功能,可以将整个应用分发流程可视化,让应用的组装、分发、交付过程变得更加简单。在UX上,不仅可以通过页面随时了解整个交付环节的状态,还可以配置触发器,让应用随着产品仓库的更新而更新。在本文的场景中,KubeVela提供了以下能力:完整的GitOps发布:?KubeVela支持Pull模式和Push模式的GitOps发布:我们只需要将更新的代码推送到代码仓库,KubeVela可以自动根据部署了最新的代码。在本文中,我们将在Push模式下使用GitOps。Pull模式下的GitOps支持,可以查看文末[1]。强大的工作流能力,实现跨环境(集群)的部署、审批、通知:?KubeVela的工作流能力,可以轻松实现应用程序的跨环境部署,支持用户在编排工作流的过程中,例如增加人工审批、消息通知等功能,让整个部署流程生产级可用。应用抽象能力让开发者理解、使用和定制基础设施能力?KubeVela遵循OAM开放应用模型,提供一套简单易用的应用抽象能力,让开发者更清晰地理解应用功能,并可定制基础设施能力。例如,对于一个简单的应用,我们可以将其分为组件、运维特性和工作流。在本文的示例中,我们的组件是一个简单的业务应用程序;在运维特性部分,我们为该组件绑定一个Nocalhost运维特性,使该组件可以使用Nocalhost端云联调能力;对于工作流部分,通过多环境管理,我们可以先在测试环境部署这个组件,部署完成后自动暂停发布工作流,然后再部署生产环境,直到人工审核通过.什么是NocalhostNocalhost是一个允许开发者直接在Kubernetes集群内开发应用程序的工具。Nocalhost的核心功能是提供NocalhostIDE插件(包括VSCode和Jetbrains插件),将远程工作负载转换为开发模式。在开发模式下,容器的镜像将替换为包含开发工具(如JDK、Go、Python环境等)的开发镜像。当开发者在本地编写代码时,任何修改都会实时同步到远程开发容器,应用会立即更新(取决于应用的热加载机制或重新运行应用),开发容器会继承所有原始工作负载的声明式配置(ConfigMap、Secret、Volume、Env等)。Nocalhost还提供:VSCode和JetbrainsIDE一键Debug和HotReload;直接在IDE中提供开发容器的终端,获得与本地开发相同的体验;提供基于命名空间的隔离开发空间和Mesh开发空间。此外,Nocalhost还提供了服务器端帮助企业管理Kubernetes应用、开发者和开发空间,方便企业统一管理各种开发测试环境。在使用Nocalhost开发Kubernetes应用的过程中,省去了构建镜像、更新镜像版本、等待集群调度Pod的过程,减少了代码/测试/调试周期(code/test/debugcycle)从分钟到秒,大大提高开发效率。调试云应用我们以一个简单的前端应用为例。首先,我们使用VelaUX进行多环境部署。关于如何开启KubeVela的VelaUX插件,请参考文末官方文档[2]。使用VelaUX部署云应用在VelaUX中创建一个环境,每个环境可以有多个部署目标。我们以包含测试部署目标和生产部署目标的环境为例。首先,创建两个部署目标,一个用于测试部署,一个用于生产部署。这里的部署目标会分别下发资源到本地集群的test和prod命名空间。您也可以通过VelaUX的集群管理功能添加新的集群进行部署。创建部署目标后,创建一个包含两个部署目标的新环境。创建环境后,创建一个新的云调试应用。这个前端应用会暴露80端口的服务,所以我们开放这个应用的80端口。应用创建后,应用默认会有一个工作流自动将应用部署到两个部署目标。但是我们不希望应用程序不经过调试就直接部署到生产目标。因此,让我们稍微编辑一下默认工作流程:在部署中向测试目标和生产目标添加一个暂停步骤。这样,部署到测试环境后,我们可以暂停部署,等待用户调试验证,再继续部署到生产环境。完成这些配置后,让我们为这个应用程序添加一个NocalhostTrait,用于云调试。这里详细介绍一下NocalhostTrait中的几个参数:Command分为两种类型,Debug和Run。开发时在插件上右键RemoteDebug和RemoteRun,即可在远程Pod中运行相应的命令,从而达到云端调试的效果。在这里,我们使用的是前端应用程序,因此将命令设置为yarnserve。这里的Image指的是调试镜像。Nocalhost默认提供五种语言的镜像(go/java/python/ruby/node)。您可以通过填写语言名称来使用内置图像。当然你也可以填写完整的镜像名称来使用自定义镜像。开启HotReload就是开启热重载功能,修改代码后可以直接看到效果。PortForward会将云应用的80端口转发到本地的8080端口。在Sync部分,将Type设置为sendReceive(双向同步),或者设置为send(单向发送)。配置完成后,部署应用程序。如您所见,应用程序在部署到测试目标后会自动暂停。此时,在VSCode或JetbrainsIDE中打开Nocalhost插件页面,可以在test命名空间下看到我们部署的应用,点击应用旁边的锤子按钮进入调试模式:进入Nocalhost调试模式后,你可以看到终端中的IDE已经换成容器的终端了。通过ls命令可以看到容器中的所有文件。此时在Nocalhost中右击应用程序,可以选择进入RemoteDebug或RemoteRun模式。这两个键会自动执行我们之前配置的Debug和Run命令。进入Debug模式后,可以看到我们的云应用被转发到本地8080端口:打开本地浏览器,可以看到我们当前部署的前端应用版本是v1.0.0:此时,我们可以打开本地IDE修改代码,将版本改为v2.0.0:在前面的Nocalhost配置中,我们开启了hotreload功能。因此,我们再次刷新本地8080端口页面,可以看到应用版本已经变为v2.0.0:此时,我们可以终止Nocalhost的调试模式。将调试后的代码推送到代码仓库。使用GitOps进行多环境发布我们调试完后,环境上的应用还是之前的v1.0.0版本。那么,应该使用什么方法来更新环境中的应用程序呢?在整个云调试过程中,我们修改的是源代码。因此,我们可以使用GitOps模型,以代码为更新源,完成应用在环境中的更新。查看VelaUX中部署的应用,可以看到每个应用都会有一个默认的Trigger:点击ManualTrigger查看详情,可以看到VelaUX为每个应用提供了一个WebhookURL,请求地址,并带上更新所需的字段(如:镜像等),可以方便快捷的完成应用的更新。(注:由于需要对外暴露地址,部署VelaUX时需要使用LoadBalancer或其他方式暴露VelaUX服务)。CurlCommand中也提供了手动curl触发请求的例子。下面详细分析一下请求体:{//必填,本次触发的更新信息"upgrade":{//Key为应用名称"":{//要更新的值,这里的内容会通过Patch更新到应用中"image":""}},//可选,本次触发器携带的代码信息"codeInfo":{"commit":"","branch":"","user":"",}}upgrade是本次触发器要携带的更新信息。应用名称下,是需要通过Patch更新的值。默认建议是更新镜像,您也可以在这里展开字段来更新应用程序的其他属性。codeInfo是代码信息,可以选择性的携带,比如提交ID,分支,提交者等,一般在CI系统中可以使用变量替换来指定这些值。当我们更新后的代码合并到代码仓库后,我们就可以通过代码仓库中的CI配置完成与VelaUXTrigger的对接。以GitLabCI为例,可以添加如下步骤:webhook-request:stage:requestbefore_script:-apkadd--updatecurl&&rm-rf/var/cache/apk/*script:-|curl-XPOST-H"Content-Type:application/json"-d'{"upgrade":{"'"$APP_NAME"'":{"image":"'"$BUILD_IMAGE"'"}},"codeInfo":{"user":"'"$CI_COMMIT_AUTHOR"'","commit":"'"$CI_COMMIT_SHA"'","branch":"'"$CI_COMMIT_BRANCH"'"}}'$WEBHOOK_URL配置后,当代码更新时,会自动触发CI,更新VelaUX中对应的应用。镜像更新后,再次查看应用页面,可以看到测试环境中的应用已经变为v2.0.0版本。在测试部署目标中验证通过后,我们可以在应用工作流中点击继续,将最新版本的应用部署到生产部署目标中。部署完成后,在生产环境中查看应用。可以看到生产环境已经是最新的v2.0.0版本:至此,我们首先在测试环境使用Nocalhost,通过KubeVela进行端云联调。验证通过后,再通过更新代码,使用GitOps完成部署更新,并在生产环境中继续更新应用,从而完成应用从开发到上线的完整部署过程。总结使用KubeVela+Nocalhost,不仅可以方便的在开发环境进行云端联调测试,测试完成后还可以一键更新部署到生产环境,让整个开发过程稳定可靠。*参考链接:[1]使用GitOps+KubeVela进行应用持续交付https://kubevela.io/blog/2021...[2]官方文档地址:https://kubevela.io/docs/inst...您可以通过以下资料了解更多关于KubeVela和OAM项目的详细信息:?项目代码库:github.com/oam-dev/kubevela欢迎来到Star/Watch/Fork!?项目官方主页及文档:kubevela.io,从1.1版本开始,提供中英文文档,欢迎开发者翻译更多语言文档。?项目钉钉群:23310022;Slack:CNCF#kubevela频道*