云原生12要素应用模型

大家可能听过Netflix的故事,在AWS Region故障的时候,它的服务仍然没受到什么影响,能继续对外提供流媒体服务。他们遵循的就是云原生应用与云平台的契约:即使云平台再可靠,也不会100%可用,而上层应用需要通过架构设计来保证业务连续。

具体而言,就是云原生应用要具备12要素(https://12factor.net/ )才能满足以上契约。

  • 使用版本控制管理代码
  • 应用基于代码库和依赖声明式的打包
  • 不同环境的应用包应保持不变,无需重新打包
  • 应用使用到的后端服务(如数据库、NoSQL、缓存、消息中间件等)可以自助使用(创建、绑定使用、解绑、删除等),服务不绑定于某个IP,通过逻辑的名字如DNS, 注册中心的名称来调用
  • 应用尽量保持无状态,状态(如用户Session、缓存)不依赖于本机内存(易失性的),应保存在公共的缓存服务器或NoSQL数据库中,没有本地文件系统(易失性的)的I/O,如特定路径的文件读写等
  • 应用优先使用水平伸缩,通过增加/减少实例数量实现扩缩容
  • 应用能快速启动,支持优雅终止,保持在1分钟以内;不同应用可以独立启动和停止,无特定顺序
  • 不同环境(如开发、集成测试、用户验收测试、预生产、生产环境等)尽量保持等价一致
  • 日志输出到STDOUT/STDERR,由平台工具进行日志聚合
  • 管理操作(如创建数据库schema,初始化数据等)也作为一次性的任务来执行
    Pivotal在自身的实践中,又增加了3个要素:
  • 优先设计服务的API,并保持稳定和兼容
  • 应用应对外暴露遥感(Telemetry)接口,提供可观测性(Observability),如是否健康(以本地检查为主,不含外部依赖)、是否就绪、指标输出、埋点跟踪等
  • 租户的安全隔离,基于角色的认证和授权(RBAC)

Netflix也开源贡献出自己内部使用的框架,通过与Pivotal合作Spring Cloud Netflix项目,在广大的Java/Spring开发者社区普及了云原生应用的12要素。无论应用是部署到公有云还是私有云,无论是否容器化部署,都应该尽可能满足这12要素,这样应用才能更充分的利用底层云平台,而底层的云平台也才能更好的调度应用,提供更好的云服务。


Kubernetes的应用模型

很多企业新开发的应用现在也基本都会选择部署到Kubernetes平台,而不是直接部署到云平台之上,因为Kubernetes屏蔽了底层云平台的细节,提供了更高层的抽象,包括应用模型,也契合了云原生应用12要素的要求。

但与此同时,开发人员也已经意识到Kubernetes的学习曲线还是太陡峭了,Kubernetes对开发人员而言太复杂了,要做到生产就绪真心不容易。

假设一个微服务的开发人员,当他好不容易实现了业务逻辑,要把应用部署到Kubernetes的时候,起码还要做两件事:

1.构建容器:比如使用Dockerfile构建出容器镜像,并保存到企业镜像库中
2.配置部署yaml:通常包括Deployment,Service或Ingress,ConfigMap/Secret, ServiceAccount, Role/RoleBinding等

当他在准备这些Kubernetes的 yaml文件的时候,其实就是在利用Kubernetes的原生抽象模型,然后交给Kubernetes去做调度和部署。

一个典型的部署应用到Kubernetes的yaml大致是这样的:


大约需要配置50行yaml,包括:

  • 应用的名字
  • 镜像的位置
  • 环境变量
  • 资源的需求
  • 监听的端口
  • Liveness/Readiness Probe
  • 实例的数量
  • 服务访问的方式(如负载均衡类型)等。

很多开发人员其实不知道可能还需要考虑一些更高级的配置才能生产就绪,比如NetworkPolicy,SecurityContext,PodDisruptionBudget等。


Knative的应用模型

社区也意识到Kubernetes对开发体验不够友好,所以出现了类似Knative这样更高层次的抽象,如Knative Service, Knative Route, Knative Revison, Knative Configuration,底层仍然利用Kubernetes的Deployment,ReplicaSet,Pod等原生抽象。

从部署的yaml文件来看,Pod部分基本上保持不变,总体而言,比原生k8s yaml要配的内容少一些,并且短一些,比如不需要单独配置服务访问的方式,而是通过Knative的Route来自动生成访问域名;也不需要配置实例数量,而是依赖Knative自动伸缩。


Cloud Foundry的应用模型

在Kubernetes没有成为容器调度的事实标准之前,上一代的PaaS平台以Cloud Foundry为代表,在Cloud Foundry的用户中一直流传这样一句格言:“这是我的代码,帮我在云上部署运行应用,我不关心到底是怎么实现的 (Here is my source code, Run it on the cloud for me, I do not care how…)”,用来形容Cloud Foundry比较友好的开发者体验。

我们来看一个典型的Cloud Foundry的部署Java Spring应用的文件manifest.yaml

开发者只需指定应用的名字、应用的代码(如python代码)或部署包(如Java jar包)的路径、资源的需求(内存)、实例的数量、绑定的服务、环境变量等,剩下的就由平台来自动配置了。当然,开发者还可以做更多配置比如访问路由的域名、健康检查的方式、启动命令等,具体可参见:
https://docs.pivotal.io/application-service/2-12/devguide/deploy-apps/manifest-attributes.html


TAP的应用模型

TAP作为新一代PaaS平台,主要基于Kubernetes技术体系,以Knative作为云原生运行时,但同时也继承了Cloud Foundry的开发体验,试图博采众长,青出于蓝而胜于蓝。
一个典型的TAP应用的部署文件workload.yaml是这样的:

可以看出,TAP的开发体验更接近于Cloud Foundry,都需要指定指定应用的名字、资源的需求(CPU / Memory limits/requests)、绑定的服务(ServiceClaims)、环境变量。

不一样的是不需要指定应用的部署包的路径,而是指定代码在版本库的位置(或代码在镜像库中的位置),相当于覆盖了CI/CD的完整流程。

当然,如果只需使用CD部分的功能的话,也可以直接指定CI流程构建出的jar包或镜像在镜像库的位置。TAP同时也支持GitOps的部署模式,自动拉取版本库的变化,并在集群中应用执行并确保一致。

如果眼尖的话,就可以注意到workload yaml并没有像Cloud Foundry的manfest.yaml那样指定应用实例的数量,而是依赖于Knative的自动伸缩特性。对于不采用缩容到零的需要长期运行的应用,其实可以通过指定实例数量的上下限(增加annotationautoscaling.knative.dev/minScale和maxScale)来调整伸缩的范围。

为与Cloud Foundry保持向下兼容,TAP有一个专门的Cloud Foundry的适配器(Adapter),可以直接使用Cloud Foundry的manfest.yaml来部署到TAP上。

需要特别指出的是,在label中指定应用类型(workload type),可以自动选择TAP中的供应链,比如web 类型的应用就会执行内置的一条基础供应链ootb_supplychain_basic,即:


在做实际部署的时候,默认使用Knative Service的方式部署,当然也可以沿用原来的方式选择以原生Kubernetes的方式部署。

实际生成的部署yaml是这样的(以Knative Service为例,有删减):


Workload的配置经过流水线自动转化成了Knative Service的配置,并添加了表示元数据的Annotation/Labels, 用于可观测行的环境变量JAVA_TOOL_OPTIONS以及Readiniess Probe等。


服务绑定

云原生12要素中第4要素建议把后端服务作为可附加的资源来使用(Treat backing services as attached resources)。也就是:大多数应用应该实现为无状态的,所以应用的状态就需要保存在后端服务中,如数据库、消息中间件等有状态的持久化存储。应用通过绑定后端服务去使用这些服务来读写状态数据。

以Java应用访问MySQL数据库为例:

  • 传统的方式是由开发人员在配置文件中配置连接字符串,如URL、username、password,然后在应用中读取配置项,生成DataSource,创建出Connection 供应用使用;做得好的微服务,一般把配置信息保存在统一的配置中心然后在应用启动时动态获取。

  • 在Kubernetes中,则需配置ConfigMap/Secret对象(或环境变量),在应用中读取后使用。

  • Cloud Foundry则不需要这些具体配置,只要绑定(bind)服务实例的名字即可。服务实例对应的具体的访问地址、用户名和密码是以环境变量的形式自动注入到应用实例中的。如果应用实例采用了Spring Cloud Binding类库,会自动生成DataSource,不采用Spring类库的话,就要自己写程序解析这些环境变量然后生成DataSource。

  • 与Cloud Foundry类似的,TAP只需声明使用(Claim)的服务实例的类型和名字,具体配置连接字符串会自动以Secret的方式mount到应用实例供使用。同样的,如果应用实例采用了Spring Cloud Binding类库,也会自动生成DataSource。

当然,服务的提供需要符合k8s-binding-spec (https://github.com/servicebinding/spec ),这是由我们和IBM/Redhat共同开源的规范,用于标准化应用访问服务的方式。

采用服务绑定的方式,开发人员不需要直接接触到密码这样的安全敏感信息,也不需要注意配置文件中密码的的保密,更不会不小心将包含密码的配置文件提交到版本库保存,更安全;应用和服务实例的绑定关系可以在不同环境下保持不变(虽然同名的服务实例在不同环境下其实是不同的),更稳定。服务实例在非生产环境可以由开发人员自服务,按需创建,在生产环境则可由运维团队统一管理和创建。
如果采用的是共有云平台提供的服务,也不需要直接使用云平台的SDK,而是通过统一的Service Broker抽象层去使用,避免与云平台的紧耦合。


总结与展望

TAP是一个比较新的产品,还在持续的迭代和发展中,其应用模型支持的抽象也会越来越丰富。比如现在支持的主要应用类型是web应用,实现了source-to-url和image-to-url,很快就会扩展支持更多类型的应用(如function, tcp等),以及Jenkins/ArgoCD集成等场景。

以上初步介绍了TAP的应用模型,我们会在后续的系列文章中进一步介绍TAP的其它组件,敬请关注与期待!如果您有任何反馈,也请联系我们!


作者简介:


罗治年,VMWare大中华区应用现代化部门的资深云原生应用架构师,有20多年的软件研发和架构设计经验,曾先后就职于埃森哲、毕博管理咨询、迪士尼、Pivotal等公司,长期从事企业IT规划,企业级系统架构设计,及系统研发和实施管理等工作。近期主要专注于采用敏捷开发方法实现微服务云原生应用的设计和开发,对传统应用实现现代化并实现云上迁移拥有丰富的实战经验,并获得诸多技术认证,包括:Spring Professional, Kubernetes 管理员 (CKA) 、AWS Professional、DevOps Professional和Cloud Foundry 专家等。

来源|公众号:VMwareTanzu云原生

TAP 系列文章6 | TAP的应用模型相关推荐

  1. TAP 系列文章9 | 应用开发加速器

    背景 对于开发人员来说,尤其是新加入的人员来说,一直以来都有个困惑,那就是如何高效地启动应用开发.通常情况下,开发部门通过一定时间的积累,会有相关的开发规范和项目规范.如何让新人能够最快的适应这些规范 ...

  2. 推荐系统FM系列文章(一)-- FM模型

    0. 写在前面 推荐系统相关从业人员肯定对FM(Factorization Machines)模型不会感到陌生,工业界及学术界在FM的基础上也提出了一系列优化模型,这些模型至今仍广泛应用于各类场景.本 ...

  3. 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)

    统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...

  4. FPGA经验谈系列文章——FPGA开发方向以及算法开发模型

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--FPGA开发方向以及算法开发模型 前言 接口方向 算法方向 总结 前言 FPGA开发笼统的说可以分为两个方向 ...

  5. 架构技术实践系列文章

    王晓宇:电商异步消息系统的实践 秦鹏:从应用到平台,云服务架构的演进过程 郭炜:从0到N建立高性价比的大数据平台 李智慧:宅米网技术变迁--初创互联网公司的技术发展之路 陶文质:分布式系统设计的求生之 ...

  6. 【理解 Cilium 系列文章】(二) 理解网络数据包的流转过程

    Cilium 作为近两年最火的云原生网络方案,可谓是风头无两.作为第一个通过 ebpf 实现了 kube-proxy 所有功能的网络插件,它的神秘面纱究竟是怎样的呢?本系列文章将带大家一起来慢慢揭晓 ...

  7. KVM详解,学习kvm系列文章

    目录 (1):简介及安装 1. KVM 介绍 1.0 虚拟化简史 1.1 KVM 架构 2. KVM 的功能列表 3. KVM 工具集合 4. RedHat Linux KVM 安装 4.1 在安装  ...

  8. 积少成多 Flash(ActionScript 3.0 Flex 3.0) 系列文章索引

    [源码下载] 积少成多 Flash(ActionScript 3.0 & Flex 3.0) 系列文章索引 作者:webabcd Flash 之 ActionScript 3.0  1.积少成 ...

  9. 系列文章|OKR与敏捷(三):赋予团队自主权

    OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余.这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为 ...

最新文章

  1. 面试AI Lab能力测评
  2. 头条二面:宕机后,Redis如何实现快速恢复?
  3. php代码实现做网络安全的功能,基于PHP关键词审计技巧?网络安全源代码审计
  4. 忘记SAP系统Client 000的所有账号密码
  5. python安装matlabb库_Python调用MATLAB的方法(mlab接口库)(未总结)-Go语言中文社区...
  6. All CUDA devices are used for display and cannot be used while debugging.
  7. a标签传值到另一个页面_vue-router页面传值及接收值
  8. [转]ubuntu系统瘦身-清理系统垃圾文件
  9. 【leetcode】Merge Sorted Array
  10. android 注解创建对象,Android ORM 框架:GreenDao 使用详解
  11. 数据分析挖掘全套课程视频spss/sas/R/excel/案例实战体系教学
  12. 铅酸电池充电C语言程序,铅酸电池如何充电_铅酸电池充电原理 - 全文
  13. adb 判断imei_获取设备序列号 SN码(对应:设置-关于手机-状态-序列号 )
  14. 自增运算,阴间代码《奇思妙想二》
  15. 如何看电脑内存型号?
  16. MySQL——MySQL高可用之PXC
  17. 佳能Canon PIXMA MG4170 打印机驱动
  18. UnicodeMath编码教程(转载)
  19. Vmare horizon client 5.0安装过程中自动取消
  20. Android通过adb查看wifi密码

热门文章

  1. Azkaban (一) --------- Azkaban 概论
  2. 计算机机房如何批量重装,在网吧或学校机房怎么批量安装系统?
  3. 小旋风蜘蛛池V9.02源码
  4. Java期末作品设计——赛事信息管理系统
  5. excel 快捷换行,去除空白换行符
  6. Android Dialer源码分析之拨号主界面ListsFragment
  7. 湘潭大学计算机考研复试题,湘潭大学信息工程学院2019考研复试程序设计练习题...
  8. 为Blog添加广告语
  9. 2021年最适合上班族的25个副业,男女通用!
  10. 深度探索C++对象模型第2章 构造函数语义学