使用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为应用名称"
