不懂 Kubernetes 实现云原生是什么体验?
云原生的本质和最终效果
要明白什么是云原生,就要先弄明白云计算是什么有什么问题,云计算将计算资源、网络、存储等基础设施统一管理,通过资源规模化和自动化管理,实现降低资源的成本和提高资源的管理效率,云计算本质上解决的是资源的自动化管理问题,但数字化和信息化的关键在应用,云计算没有解决应用的管理问题,应用的管理和运维是难题,对人依赖度很高,云原生的出现就是为了解决应用的管理问题,应用管理比资源管理复杂很多,涉及到应用开发、应用架构、应用交付和应用运维等应用层的管理,还要配合应用解决资源自动化管理问题,云原生本质就是解决应用的自动化管理问题。
从效果来看,云原生的最终目标是让开发者聚焦自己的业务,业务之外(基础设施、应用架构、应用运维)的事情不用关心,只需要懂业务就能创造出自己想要的应用,并能按需交付客户。
使用 Kubernetes 落地云原生困难重重
当前云原生相关的技术很多,其中最关键是容器、微服务架构、Kubernetes ,他们颠覆式的解决了应用管理自动化问题。
-
容器技术解决了应用打包和部署自动化问题,通过容器打包保证了应用基础环境的一致性,实现了一次打包,处处运行。同时容器可以定义应用运行资源,部署时按需占用资源,实现从应用角度解决资源管理自动化。
-
微服务架构解决了复杂应用的解耦和治理问题,当业务越大越复杂,微服务架构将业务拆分和解耦成多个模块,并通过服务治理实现微服务运行和管理的自动化。
-
Kubernetes解决了应用编排和调度自动化问题,它是应用自动化管理最关键的拼图,底层基于容器、SDN、SDS,能实现各类型应用和微服务部署和运维过程自动化。
为了实现应用管理自动化,还有很多云原生相关的技术,像SDN(网络自动化管理)、SDS(存储自动化管理)、Helm(复杂应用交付自动化)、Service Mesh(无侵入扩展服务治理能力)、Monitoring(监控自动化)、Logging(日志自动化)、Tracing(性能分析自动化)、Chaos engineering(容错自动化)、Gateway(网关自动化)、SPIFFE (应用访问安全自动化)等等,这些技术可以跟Kubernetes结合起来使用,解决应用各个运维特征的管理自动化问题。
上面这些技术主要围绕着Kubernetes,所以落地过程主要是Kubernetes落地,Kubernetes落地过程一般分为两部分,Kubernetes的搭建和Kubernetes的使用。对于Kubernetes搭建,基于以上技术自主搭建完整的Kubernetes集群非常复杂,既要学习这些技术还要了解他们的原理, 最困难的是要把他们有机的组装起来。不过大多公司有专职的维护工程师,可以抽出大把时间来学习和尝试。或者,选择公有云厂商提供的Kubernetes商业服务,所以,搭建Kubernetes是有路径落地的。
相比搭建Kubernetes,Kubernetes的使用一般是开发人员,开发人员人数众多,使用习惯和学习门槛决定了开发人员的接受度,而云原生平台的使用不仅要改变开发习惯,还要学习很多新技术,落地过程困难重重。
-
需要学习很多新概念和技术。 云原生相关的技术和概念有很多,光 Kubernetes就有很多新的概念和抽象,像Workload、Pod、Service、Ingress、ConfigMap、PV等,如果要用好还需要学习Kubernetes周边的很多概念和技术。
-
已有应用需要改造,开发习惯需要改变。 已有的应用要运行在 Kubernetes上,需要会写 Dockerfile 和 YAML,如果要改造成微服务架构,还需要按照框架的SDK改造代码,跟之前的开发习惯会有很大变化。
-
如何将应用高效交付给客户,Kubernetes及上面这些技术并没有解决。 应用只有交付给客户才能产出价值,当前交付客户的自动化程度不高,Kubernetes并没有解决交付过程自动化的问题。在 To C的场景,业务频繁迭代,交付的频率很高,需要保质保量。在To B场景,交付更加复杂,不同的客户有不同的要求,需要针对不同客户有不同的交付模式,比如SaaS、私有交付、离线交付、个性化交付等,交付也是成本里的大头。
应用抽象模型是云原生可落地的关键(实现思路)
云原生落地的难点在使用,如果能将云原生底层复杂的技术包装成开发者熟悉的应用层属性和动作,开发者就不用学习新的概念和技术;如果能将业务跟运维能力解耦,跟微服务框架解耦,就能实现开发者按需扩展运维能力和切换微服务框架,实现对业务按需赋能;如果能实现根据不同客户类型,自定义交付流程和自动化交付,就能大大降低交付成本,提升客户满意度;当以上三点都能解决,就可以让开发者聚焦在业务本身,业务之外的事情不用关心,有更多精力关注客户价值输出。
基于以上思考,通过应用抽象模型是个解决思路,对应用整体进行包装和抽象,包含应用运行所需的全部运行定义,与底层技术和概念隔离。向上用户不需要再学习和了解系统级概念和技术,应用内部把业务和扩展能力解耦,使用应用级概念开发和管理,需要扩展服务治理、运维、安全等能力时按需开启插件。向下则包装Kubernetes的概念和抽象,屏蔽掉底层基础设施的差异,实现应用抽象模型可以运行在各类基础设施上。
应用抽象模版核心设计在三方面:
- 应用级抽象
- 架构充分解耦
- 使用应用模版交付