从云原生平台的广泛应用谈起......
云原生平台,特别是以Kubernetes为代表的容器调度平台,已经得到了非常快速的普及。各行业企业的数据中心,纷纷调研并落地适合各自企业现状的Kubernetes云原生应用平台;但是遗憾的是,很少有企业在落地并实施Kubernetes云原生应用平台的时候,考虑如何降低由于云原生平台所带来的开发阶段的额外应用开发成本。
我们可以简单的将开发阶段(或者定义为开发闭环 Inner Loop)的活动,分成下面几个主要板块:
●Learn的阶段
随着微服务软件架构与DevOps的兴起,以及互联网大厂所引领的 “you build it, you run it”,这样的理念的推行,应用开发团队的职责,越来越向传统基础架构所负责的领域延展,包括:设计,开发,测试,打包,运行应用。
为了有效的实践这样的理论,应用开发团队需要及早学习并熟悉应用实际的物理运行计算环境;在云原生K8S平台的广泛普及下,意味着开发团队需要学习并熟悉基于K8S的应用部署平台,利用这样的平台进行应用的开发、调试,甚至进而打包并部署应用到K8S环境中,并提供精益运维的支持;
可现实是,随着K8S平台的实践,越来越多的开发团队意识到,直接基于K8S 平台提供的接口进行开发活动,严重影响开发团队的开发效率;因此,退而求其次,开发环境采用桌面版的容器环境,例如:Docker/Docker Compose,集成测试、生产环境用K8S平台。这种环境的差异,特别是在微服务架构的应用开发、部署、运维场景下,为后期精益运维引入了巨大的风险;更严重的是,有的应用系统非常的复杂,桌面版的容器环境没法满足应用算力的需求,不得不依赖远程的K8S平台进行开发活动,仍然会产生开发效率下降的问题。
Tanzu Application Platform 提供了一个服务层,将K8S的接口屏蔽在了这个服务层之下;利用TAP的服务层接口,开发团队可以快速的开展应用的日常开发、测试、部署等活动。
需要说明的是,本文主要关注在开发,调试阶段如何利用TAP服务层的快速调试API,帮助开发工程师,利用本地或远程的K8S进行应用的开发,调试活动;如果需要了解TAP服务层提供的推送应用API、Bind Backing Service等API的需求,请参考系列文章的其它主题。
●Discovery and Start 的阶段
开发团队在这个阶段,通过 DDD(Domain Driven Design)学习并形成各个子系统的边界、Boris分析子系统间的调用与依赖、SnapE记录子系统的接口规格与描述;同时,学习部署系统的计算平台的基本功能已帮助解决应用系统的可用性等非功能特性;对于基于Kubernetes平台部署的云原生应用系统,意味着开发团队需要分配宝贵的开发时间,让团队成员熟悉Kubernetes平台的基本功能。
Tanzu Application Platform可以极大的降低开发团队成员学习Kubernetes的门槛,将应用在Kubernetes环境中的开发、调试、部署与访问集成到开发团队熟悉并广泛使用的IDE(Integrated Development Environment)中,实现降低开发工程师基于Kubernetes开发应用的门槛。
●Code、Test、Debug 工作流
这个阶段是开发团队的主要日常工作。一个普遍的广为接受的想法和目标,就是尽量让开发团队专注于领域需求的业务代码开发。
但我们发现在基于K8S云原生平台的开发过程中,很少有开发团队在日常的开发中,基于K8S平台来进行日常的开发、调试等工作流程。一个最为朴素的原因,从修改代码,到构建 OCI image镜像,到装配K8S yaml,再到最后的部署,发布应用,访问代码实现修改的结果,这一系列操作下来,至少需要15到20分钟。更麻烦的是如何利用开发工程师熟悉的IDE进行应用的K8S远程断点调试呢?妥协的结果,就是开发团队仍然利用已有的工具,利用桌面环境,利用Docker工具栈,开展Code、Test、Debug的日常工作。对于复杂的微服务应用,或者受限于外部系统依赖, 再或者受限于桌面算力,必然影响开发团队的开发效率。
Tanzu Application Platform 专门针对开发团队使用K8S云原生环境进行应用的开发、测试、调试的场景,利用开源社区提供的 Tilt 工具,结合 TAP Developer Tools Extensions 以及IDE开发工具3重优势,尝试解决开发团队有效利用K8S进行微服务开发、测试、Debug的日常需求。这也是本文重点分享的内容。
利用TAP实现应用云调试
基于之前的背景铺垫,期待大家能够认识到,在云原生下的微服务应用开发循环(inner loop)阶段,在必要的情况下,利用与应用部署的QA或者预生产环境相近似的Developer K8S环境进行开发、测试、调试,能够极大的提升开发效率同时减少未来可能因为环境的差异导致的测试、部署上的风险。
接下来,我们会利用Tanzu Application Platform 应用开发调试 Developer API,以及开源 Tilt 工具、VS code IDE 、Tanzu Developer Tools Plugin,给大家演示如何利用TAP所提供的工具链,帮助开发团队实现快速,便捷的K8S应用云调试。
安装准备工作
如下图所示,在利用TAP实现应用的云调制之前,需要准备一下TAP环境以及必要工具:
- 准备基于Dev角色的桌面或远程TAP Enabled K8S集群
关于基于角色的TAP Dev环境安装,请参考系列文章的TAP安装篇,本文不在赘述;
- 桌面IDE开发环境的准备,目前TAP v1.1 支持的IDE是支持Java开发环境的VSCode,后续版本会继续加入Eclipse与Intellij的IDE的plugin支持;
1.通过 Tanzu Network 官方网站下载 Tanzu Developer Tools for Visual Studio Code;
2.打开VS Code IDE
a.运行“Extensions: Install from VSIX…”.
b.选择扩展文件:tanzu-vscode-extension.vsix.
安装成功后,Reload VSCode
注意:VSCode 的 Tanzu Application Platform Plugin的安装详情请参考官方手册;
正常安装 Tanzu Developer Tools extension 会同时安装如下Plugin:
-Debugger for Java
- Language Support for Java(™) by Red Hat
-YAML extensions
注意:如果任何依赖的Plugin安装失败,请参考官方安装手册,重新手工安装这3个Plugin;
3.请安下图操作,确认 Language Support for Java is running in Standard Mode。 - 在桌面环境中安装 Tilt v0.24.0或以上版本;
- VSCode 的Tanzu Developer Tools extension 的全局配置;
1.如果您的桌面环境可以访问多个K8S集群,请启动VSCode的时候,确保其引用正确的安装有TAP 的K8S环境;
2.启动 VSCode后,点击菜单 File -> Preferences -> Settings -> Extensions -> Tanzu ;
3.在当前的配置页面,配置如下参数:
- Source Image (必选配置):TAP Developer Plugin会将当前项目环境的源代码项目打包,格式为OCI image并推送到本地镜像仓库。这么做的目的是对比前后项目的变化,已决定如何快速更新远程K8S环境中运行的应用。配置举例:your-registry.io/project/tanzu-java-web-app-source。
- Local Path (可选配置):配置当前项目环境的本地路径,默认配置:current directory 。
- Namespace (可选配置):配置应用推送的K8S Namespace的租户空间,默认配置:当前桌面环境的kubeconfig文件中设定的Namespace。
项目工程 Tiltfile 配置文件
通过 Tanzu Developer Tools Extension 以及 本地Tilt 工具,进行Java应用的云端(K8S)调试,需要准备一个叫 Tiltfile 的配置文件;这个文件可以利用 Tanzu Developer Tools Extension提供的模板进行创建和定制化;
如图所示:
1.在项目工程的根目录,创建一个叫 Tiltfile 的空白文件;
2.在文件的空白处,敲入 ti,Tanzu Developer Tools Extension会自动提示Tiltfile的模板,Tab可以自动填充;
3.根据项目的实际情况,进行模板的定制化,如下图:
利用TAP进行Java应用的云调试 - 远程应用自动更新
应用/服务开发工程师日常开发工作,最经常的工作就是编写代码、编译、打包、部署与验证结果。这样的工作流程在云原生(K8S)的开发平台下,变的耗时耗力;下面我们演示利用TAP Developer Tools Extensions 使得开发工程师在云原生的环境下,可以像传统开发环境一样的进行日常的开发工作。
1.启动 Tilt 环境,如下图:
2.(Optional) 启动 Tilt Dashboard
3.第一次启动应用调试,依赖项目的规模,以及TAP平台架构师提供的云环境的流水线的配置,需要一定的时间完成应用从构建,到部署,以及最后的访问;例如下图,是作者的TAP环境,应用部署的流水线配置:
注意:
尽管在本文,我们一直强调的是TAP PaaS平台如何帮助开发团队、开发工程师利用TAP快速开发、迭代云原生的应用程序;我们同时也考虑并实践如何利用DevSecOps的理念,将部分Security、Ops相关的工作,左移到开发阶段;作为TAP的平台架构师,可以将安全相关的工作,例如:代码CVE扫描、容器镜像扫描加入到开发阶段的开发、调试流水线中;一个显而易见的好处,在不影响开发工程师日常工作流程的前提下,提前将安全相关的最佳实践加入到开发阶段以减少后期因为安全、审计而导致的项目延期;
4.访问应用URL
通过上图,可以看到,利用TAP Developer Tools Extension,开发工程师无需被暴露在K8S云原生的环境下,就可以进行应用的开发与调试工作;
当然,如果确实需要利用K8S的native 命令,进行调试,也可以方便的进行操作,如下:
5.应用开发的Iterate,即修改代码,测试结果
例如:修改如下的代码
至于具体的代码,重点关注红框中的时间 tag,我们可以观察到,从Save代码的变更,到访问URL,只用了极短的时间 (4ms);经过测试,基本跟工程师利用本地环境进行开发、测试时间大体相同。
利用TAP进行Java应用的云调试 - 远程设置断点
断点调试,开发工程师开发应用最基本的技能与工作,在基于云原生(K8S)的环境下,变得异常的陌生与复杂。利用TAP Developer Tools Extension for IDE (VSCode) 开发工程师可以在必要的情况下,利用IDE的断点调试能力,通过 TAP Developer Tools Extension,对运行在K8S云原生环境下的应用,进行类似桌面程序开发体验类似的云断点调试功能。
具体的操作如下:
1.IDE (VSCode) 的TAP Developer Extension的配置跟前文提到的过程一致;
2.利用 workload.yaml ,右键功能菜单,选择 Tanzu: Java Debug Start;
3.利用 IDE 的断点调试能力,进行正常的断点的设置,调试;如下图:
利用TAP实现面向开发的应用运行状态监控
国内外互联网大厂,一直都在布道云原生 DevOps 或者 Google SRE,其中有一句最经典的话:”you build it, you run it”;但是具体到如何成功实践这样的理念,一个最朴素的需求:将生产环境中的应用运行状态展示给开发团队。这样的一个朴素的需求,其实对基础架构是非常有挑战的任务:
1.开发团队对运行中的应用需要展示什么样的信息?基础架构通常的集中观测/监控/预警平台提供的各种监控图表,Trace,Log等信息,能否直接暴露给开发团队来使用?这种集中式的平台,培训工作如何展开?
2.运行在生产环境中的应用,在传统的基础架构部门的管理下,能否开放给开发团队成员去访问?会不会产生运维安全问题?
Tanzu Application Platform GUI 为开发团队提供了一个ReadOnly的、面向开发工程师的应用状态展示面板(Application Live View)。
在这里,ReadOnly 的目的显然是消除生产环境运维团队的顾虑,对于开发工程师来说,一个只读的应用运行状态展示面板,大多数的情况下,已经可以帮助开发团队开展故障排查,应用运行调优、产品精益等活动;另外,面向开发工程师的应用状态展示/监控面板,除了大家比较熟悉的CPU利用率、Memory使用趋势等常规指标以外,应用当时的请求RPS、Response Time、Delay、线程池状态、应用运行时的环境变量等等,对开发工程师排查故障都是非常重要的信息。
另外,Tanzu Application Platform GUI基于Spotify 开源项目Backstage 进行的定制化开发,意味着开发团队,可以基于Backstage的Plugin机制,定制符合自己团队、组织的应用运行状态展示面板;
下面的图示,是基于TAP v1.1为大家展示几个典型应用运行状态信息:
1.进入 SpringBoot应用的部署Pod页面
2.通过App Live View 从 Information Category中选择你关心的运行状态信息;
3.下图展示应用运行时的Env信息,对应用故障排查至关重要:
4.Log Levels可在特殊情况下临时动态调整当前应用实例的Log输出级别;
5.SpringBoot Actuator 应用运行状态展示
6.HTTP请求状态展示
更多的应用运行状态信息,读者可以尝试参考之前提供的TAP安装配置文档进行安装并体验,能够获取到比本文中提到的更多的应用检测状态信息的展示,并体会到TAP给企业级应用带来的可观测性的价值。
文章小结:
基于云原生平台或者说K8S平台,进行应用的日常开发、调试,当前在业界还处于刚刚开始的阶段,但是发展非常迅猛;尽管目前很多的开发团队,特别是传统企业开发团队,利用桌面的计算环境进行开发还是当前的主流;但是我们已经注意到,越来越多的企业,在实践以微服务架构进行新业务应用的开发过程中,对利用工具、IDE实现云调试也越来越期待;
VMware TAP PaaS平台在支持开发人员实现应用程序的云调试的这种特性,能够给诸多企业用户软件开发人员带来更好的开发体验。
此外,Tanzu Application Platform是一款面向开发的,高度可扩展的应用PaaS平台。还有很多“有趣”能力等待大家的发掘。请持续关注TAP系列文章的其它专题;
作者简介:
毕建华,VMware大中华区应用现代化部门高级解决方案架构师。多年来一直从事云原生相关领域工作,包括系统设计以及参与多种容器调度平台开发,部署,运维工作;包括,基于Mesos、DCOS平台,开发Dbaas框架;
参与Kubernetes开源项目KUDO的开发与推广;
CNCF认证CKA工程师;
VMware认证Spring Professional工程师
来源|公众号:VMwareTanzu云原生