设计思想
云原生的本质和最终效果
云计算本质上解决的是资源的自动化管理问题,但数字化和信息化的关键在应用,云计算没有解决应用的管理问题,应用的管理和运维是难题,对人依赖度很高,云原生的出现就是为了解决应用的管理问题。
应用管理比资源管理复杂很多,涉及到应用开发、应用架构、应用交付和应用运维等应用层的管理,还要配合应用解决资源自动化管理问题,云原生本质就是解决应用的自动化管理问题。

从效果来看,云原生的最终目标是让开发者聚焦自己的业务,业务之外(基础设施、应用架构、应用运维)的事情不用关心,只需要懂业务就能创造出自己想要的 应用,并能按需交付客户。
应用抽象模型是云原生可落地的关键(实现思路)
云原生落地的难点在使用,如果能将云原生底层复杂的技术包装成开发者熟悉的应用层属性和动作,开发者就不用学习新的概念和技术;如果能将业务跟运维能力解耦,跟微服务框架解耦,就能实现开发者按需扩展运维能力和切换微服务框架,实现对业务按需赋能;如果能实现根据不同客户类型,自定义交付流程和自动化交付,就能大大降低交付成本,提升客户满意度。
当以上三点都能解决,就可以让开发者聚焦在业务本身,业务之外的事情不用关心,有更多精力关注客户价值输出。
**基于以上思考,通过应用抽象模型是个解决思路,对应用整体进行包装和抽象,包含应用运行所需的全部运行定义,与底层技术和概念隔离。**向上用户不需要再学习和了解系统级概念和技术,应用内部把业务和扩展能力解耦,使用应用级概念开发和管理,需要扩展服务治理、运维、安全等能力时按需开启插件。向下则包装Kubernetes的概念和抽象,屏蔽掉底层基础设施的差异,实现应用抽象模型可以运行在各类基础设施上。

应用抽象模版核心设计在三方面:
-
应用级抽象
-
架构充分解耦
-
使 用应用模版交付
应用级抽象能简化理解和使用
应用级抽象是“以应用为核心”的抽象模型,对用户暴露应用级的概念、属性和动作,底层Kubernetes和系统级的概念和技术,要么完全实现自动化,要么包装成应用级的属性和动作。
为了实现灵活的应用编排和自动化调度,Kubernetes定义了很多概念,提供丰富的扩展机制,并以YAML的方式跟它交互,Kubernetes的这些可编程的体验,对管理和扩展Kubernetes的人来说,是非常好的特性,但对于普通开发者,门槛太高,并且很多概念和技术跟自己开发的业务并没有直接关系,所以对于普通开发者来说需要更加友好的操作体验,不需要学习就能使用。

应用级抽象和Kubernetes概念粗粒度的对应关系:
| 应用级属性 | Kubernetes概念 |
|---|---|
| 应用运行环境 | Containers |
| 应用运行属性 | Workload |
| 应用网络属性 | SDN |
| 应用存储属性 | SDS |
| 应用对外服务属性 | Ingress |
| 应用对内服务属性 | Service |
| 应用插件 | Pod |
| 应用配置 | ConfigMap |
应用级抽象并不是要将Kubernetes概念全部隐藏起来,而是对于不同的使用者,职责不同展现不同的交互界面。对普通开发者职责是开发业务,只需要关心应用级的概念,提供应用级的操作界面。
但对于云原生平台的管理人员,除了关心应用级的概念,还要关心Kubernetes的管理和维护,有能力的话还可以扩展平台的能力,所以对于平台管理人员,提供高级的暴露Kubernetes概念的操作界面,或者直接操作Kubernetes也可以管理平台上的应用,通过这种方式也规避了,由于包装概念产生的“黑箱”导致对平台的可观测性和可掌控性不足。
架构充分解耦,根据使用场景按需组合
基于应用级的抽象,应用模型通过标准的Kubernetes API实现跟基础设施的解耦,所有符合标准Kubernetes API 的基础设施都可以实现对接和部署,比如各公有云厂商的Kubernetes实现、K3s、KubeEdge等,通过这样的解耦,开发者只需要关心业务和能力扩展,不用在关心基础设施的差异,对接应用模型的应用不需要改动就能透明部署到公有云、私有云和边缘设备上,实现了应用级多云。
**通常在应用里,还会包括一些跟业务无关的功能,他们的作用是为了让应用更好的运行。**比如:服务治理、微服务框架、运维工具、安全工具等,这些能力跟应用有强耦合关系的,需要改代码扩展能力,将这部分能力解耦,应用就只需要关注在业务了,而且扩展的能力有很强的复用性,其他应用也需要。
应用中扩展能力的解耦使用Kubernetes的Pod,Pod中包含一个或多个容器,所有容器共享网络、存储,应用运行在一个容器,扩展的能力通过扩展容器的方式运行,通过共享的网络和存储实现了应用和扩展能力的解耦,这种解耦方式对业务完全无侵入,扩展的能力用插件的形式包装,就可以实现应用按需安装和启动插件,根据网络流向和容器启动顺序可以定义几种类型插件:
| 插件类型 | 说明 |
|---|---|
| 入口网络插件 | 网络流量先到入口网络插件,然后到业务容器。例如:网关、WAF、安全工具、限流 |
| 出口网络插件 | 网络流量先到业务容器,然后到插件容器。例如:负载均衡、断路器、加密访问 |
| 出入网络插件 | 网络流量先到插件容器,再到业务容器,再回到插件容器。例如:Service Mesh proxy |
| 旁路插件 | 网络上旁路运行。例如:性能分析、监控、调用链分析、日志管理 |
| 初始化插件 | Pod的Init容器,Pod启动先启动Init容器。例如:数据库初始化 |

按照Pod机制实现的插件只能扩展单个业务容器的能力,而要对应用扩展微服务架构能力,需要对每一个业务容器扩展服务治理的插件,这跟Service Mesh的实现机制一致。
Service Mesh的Data Plane需要对每个业务容器注入Proxy,对于完整应用就是扩展Service Mesh能力,对完整应用扩展的能力是应用级插件,根据注入Proxy的差异可以支持多种类型的Service Mesh实现,比如:Istio、Linkerd、Dapr,应用可以按需开启Service Mesh能力,或更换实现框架。当应用跟微服务架构解耦,每一个业务容器不再受微服务框架和开发语言限制,每个业务容器只需要专注业务本身,业务容器之间也同步实现了解耦。