今天距离2009年阿里云写下的第一行代码已经过去11年的时间,如今上云已经是不可逆的趋势,也是企业实现数字化转型的重要路径,也是过去10年IT基础软件创业的最大机会。云原生 (Cloud Native)可谓是 IT 界近两年最火的概念之一,众多互联网科技巨头都已经在积极拥抱云原生。我们认为云原生就是下一个云时代,也是未来5-10年德联资本的重点投资方向。
云计算的最初目标是资源管理
我们为什么此刻要说云原生是下一个云时代,在引入云原生概念之前,先看一下目前云计算的现状。
云计算诞生的最初目标是面向资源的管理,传统的物理服务器在每个时刻只能部署单个操作系统,应用跑在操作系统上通过操作系统进行硬件资源的调用(比如过去的SUN、IBM、HP等公司都是这种模式),存在采购不灵活、使用粒度不灵活、复用不灵活、运维不灵活等问题。
云计算最核心的虚拟化技术将物理服务器中的计算、网络、存储等各种物理资源予以抽象和转换,可以让用户像配置电脑一样获取想要的资源,可以在云中随时申请和配置各种各样的主机和操作系统,时间和空间上非常灵活,并且可以实现资源层面的弹性,用户使用云计算时并不需要关心底层资源的容量有多少。像亚马逊、阿里巴巴采购了大量的硬件服务器资源建造IDC,然后云化,通过互联网租给用户来使用,可以按照资源的使用量来付费。
用一个公式说明云计算的革命性:1000台机器 * 1小时 = 1台机器 * 1000小时,假设我们需要运行一个计算任务,用本地的1台物理服务器需要运行1000个小时才能完成,而通过云计算申请同时使用1000台机器,即可用1小时完成,大大提升了计算的效率。
云计算可以让小公司和大公司在IT基础设施上重新获得平等,降低了早期技术类创业公司的创业门槛,这也是云计算技术的伟大之处。
Cloud 1.0存在的问题:需要应用来适配云
云计算不仅要实现资源层面的弹性,还需要实现应用层面的弹性。而Cloud 1.0时代,云计算存在的一个问题就是需要应用来适配云,传统应用迁移到云计算是一项非常有挑战的任务。虽然云计算实现了资源层面的弹性,而应用层面还不够弹性。
云计算厂商会提前将一些通用的应用,比如数据库、消息中间件等,变成标准的PaaS层应用放在云平台上供用户使用。而一些用户自己开发的应用并不是通用的,云厂商也不知道会出现什么样的安装方式,因此安装的过程需要借助一些自动化的工具,比如Chef、Ansible、Puppet、SaltStack等,通过用户写脚本的方式将自己的应用配置信息融入到自动化的安装过程。然而不同的云环境千差万别,一个脚本往往在一个环境中运行正确,但到另一个环境中就不行。
因此Cloud 1.0存在的问题是需要应用来适配云:
我们使用云计算的最终目的是部署应用,而不是操作系统
应用出现问题很多情况都是由于环境变化和配置变更导致
容器技术可以很好地解决问题
容器引领云计算2.0时代
以容器技术为核心的云计算2.0时代到来,为什么容器技术可以让应用更加灵活地应对环境的变化和弹性扩展?
一个技术的诞生都有属于它的思想,虚拟化技术面向的是资源管理,而容器技术面向的是应用管理。
先看左边这张图:
虚拟化技术通过Hypervisor(虚拟机监视器)将物理设备上的CPU、内存、磁盘等各种资源虚拟化,实现多个独立的操作系统(Guest OS),这些操作系统共用底层的物理资源,然后Guest OS上面再跑一些应用。虚拟化技术打破了计算机内部实体结构间不可切割的障碍,提升了资源利用率,使用户能用更好的方式来使用这些计算机硬件资源,因此以虚拟化技术为核心的Cloud 1.0最主要实现的是物理机上云。
虚拟化技术存在的问题是虚拟环境的创建、部署、移植应用都比较麻烦,在部署应用之前需要先虚拟化出一个操作系统,而操作系统本身就是一个很笨重的应用程序,需要占用一些资源,比如虚拟化一台2G内存的主机,可能虚拟化操作系统本身就要占用800M内存。
再看右边这张图:
容器技术是直接利用Host OS操作系统内核中的 Cgroups 的资源管理能力和 Namespace命名空间的视图隔离能力,只隔离应用程序的运行时环境,让应用在一个独立的沙箱中运行,但容器之间可以共享同一个操作系统,不需要再为了创建应用的运行环境而先去创建一个操作系统。
容器技术相比虚拟化技术的优势:共享操作系统内核、轻量级、资源利用率高、秒级启动、易于移植,将一个个应用单独封装隔离,极大地提升了应用的部署密度和弹性。因此以容器技术为核心的Cloud 2.0时代可以更好地让应用上云,并且能够更高效的利用云资源。
Kubernetes成为容器编排的标准
2013年dotCloud公司发布Docker开源项目,Docker是容器技术的一种实现,Container的另一个意思是集装箱,我们可以看到Docker产品LOGO像是一个小鲸鱼搬运了一批集装箱,集装箱里面装的就是各种应用。
Docker降低了使用容器技术的复杂度,让用户更方便地创建和使用容器,更重要的是提出了创新的应用打包规范Docker镜像,就像通过集装箱可以把应用运行到世界上任何一个港口,将应用程序和运行环境解耦,即屏蔽操作系统环境的差异性。通过将应用制作成Docker镜像,开发者可以使应用在不同的环境中一致、可靠地运行,真正实现“build once, run everywhere”。容器镜像也迅速成为软件应用分发的工业标准。
在Docker完成对容器的创建后,会产生大量的容器,对它们进行管理,需要一个能对容器进行编排的工具。设想我们在码头上有非常多的集装箱,如何将它们进行编排调度,放到所需要的位置,这是一个非常复杂的问题。
Kubernetes是Google开源的容器集群管理系统,它解决了Docker应用于庞大的业务实现时,存在的难以编排、管理和调度的问题,凭借其优秀的开放性、可扩展性以及活跃开发者社区,在容器编排之战中脱颖而出,成为容器编排的事实标准。
云原生最大化释放云的价值
介绍完云原生时代最主要的两个技术:Docker和Kubernetes,可以引出云原生的概念:
CNCF是2015年由Google、红帽、微软等大型云计算厂商及一些开源公司共同成立的云原生基金会,致力于培养和维护一个厂商中立的开源生态系统,来推广云原生技术。
CNCF基金会如此定义云原生:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用,云原生的代表技术包括容器、服务网格(ServiceMesh)、微服务、不可变基础设施和声明式API。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统,结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统做出频繁和可预测的重大变更。
另一种主流的说法是:云原生 = 微服务+ DevOps +持续交付+容器化。这几种技术都是相辅相成的。
从我们的视角来看,云原生是最大化利用云的能力、发挥云的价值的最佳路径,全新的软件开发、部署和运维模式,软件诞生即长在云上。
Cloud Native is eating the world:2011年,A16Z的合伙人Marc Andreessen在《华尔街日报》发表了一篇文章,直指“Software is eating the world。软件正在吞噬世界”。正如其所说,软件行业这些年快速发展并已经渗透进各行各业,而过去十年云计算吞噬了软件,现在云原生正在吞噬云计算。
CNCF Landscape,基于K8S的生态体系
CNCF官方有一张Landscape云原生全景图。云原生生态是一个庞大的技术集合,如上图所示,截止到2020年7月,CNCF云原生全景图中共有9个大类(应用定义与开发、编排与管理、运行时、配置、平台、可观测性与分析、Serverless、会员和其他),29个功能模块,总共1427个项目。这1427个项目历史共计融资金额达到665亿美金。
Landscape所列的这些项目,基本所有类别都围绕Kubernetes展开,Kubernetes作为CNCF的第一个种子项目是云原生绝对的核心技术,也是未来云计算的操作系统。
可以看到CNCF Landscape里面绝大部分都是开源项目,我们也相信未来云原生时代,开源软件会变成软件交付的一种主要的形式。
CNCF Landscape云原生层次结构
我们抽象一下CNCF云原生全景图,从景观中剥离出所有单独的技术,除去会员、伙伴和Serverless,将云原生全景图分成以下6大类:
1、供应层(Provisioning):这一层的主要作用是为容器准备标准化的基础环境,包括自动化部署和配置工具、容器镜像仓库(比如VMware中国团队开源的Harbor)、安全合规框架、密钥管理解决方案。
2、运行时(Runtime):这一层是应用容器化后的整个运行环境,也是云原生中最核心的部分,包括存储、计算、网络,例如ROOK云原生存储服务、CNI云原生网络管理和Containerd容器运行环境管理。这里最重要的是以Docker为代表的Container Runtime。
3、编排和调度(Orchestration & Management):这一层负责云原生环境的管理,对容器基础设施和应用进行管理,类似操作系统,包括编排和调度(Kubernetes)、服务发现和治理、远程调用(RPC)、服务代理、API网关、服务网格。这一层最重要的技术是Kubernetes。
4、应用程序的定义与开发(App Definition and Development):容器平台上运行的具体应用和工具,侧重于工程师构建云原生应用程序并使其运行的工具,也可以理解为容器应用商店,根据应用的不同使用场景,可以分为数据库、流处理和消息队列、应用和镜像制作、CICD。这一层代表性的技术是Helm,是一个Kubernetes的软件包管理工具,用于简化部署和管理Kubernetes应用,让用户完成在Kubernetes集群上的应用分发。
5、竖着的两大类是跨所有层运行的工具,一个是平台(Platform),即CNCF认证的平台供应商,将这些层的多种技术捆绑到一个解决方案中,包括Kubernetes发行版、Kubernetes安装程序,如AWS、阿里云、Azure等这些云厂商。
6、另一个是可观察性和分析(Observability and Analysis),这里包含了监控(Prometheus)、日志(Fluentd)和追踪工具(Jaeger),实现云原生环境整体的可观测性,云原生环境中的微服务和容器等技术带来更多的动态性和复杂性,因此对应用系统的可观测非常重要。这一层的代表性技术是云原生标准监控工具Prometheus。
云原生技术范畴
总结一下,可以把云原生的技术范畴大概分为以下几个方面:
第一部分是云应用定义与开发流程。包括应用定义与镜像制作、配置CI/CD、消息和Streaming以及数据库等。
第二部分是云应用的编排与管理流程。这也是Kubernetes比较关注的一部分,包括了应用编排与调度、服务发现治理、远程调用、API网关以及ServiceMesh。
第三部分是监控与可观测性。这部分所强调的是云上应用如何进行监控、日志收集、Tracing以及在云上如何实现破坏性测试,也就是混沌工程的概念。混沌工程是一种提高技术架构弹性能力的复杂技术手段,即可以在整个系统中随机发现故障的位置,很多公司都采用某种形式的混沌工程来提高现代架构的可靠性。
第四部分是云原生的底层技术,比如容器运行时、云原生存储技术、云原生网络技术等。
第五部分是云原生工具集,在前面的这些核心技术点之上,还有很多配套的生态或者周边的工具需要使用,比如流程自动化与配置管理、容器镜像仓库、云原生安全技术以及云端密码管理等。
最后则是Serverless。Serverless是一种PaaS的特殊形态,它定义了一种更为“极端抽象”的应用编写方式,包含了FaaS和BaaS这样的概念。而无论是FaaS还是BaaS,其最为典型的特点就是按实际使用计费,因此Serverless计费也是重要的知识和概念。
云原生知名创业公司
这里介绍4家国外知名的云原生领域创业公司:
(1)Rancher成立于2014年,由CloudStack之父梁胜创建,是一个开源的企业级K8S管理平台,实现了K8S集群在混合云+本地数据中心的集中部署与管理。目前Rancher在全球拥有超过三亿的核心镜像下载量,40000家企业客户,是业界应用最为广泛的Kubernetes管理平台。2020年7月SUSE以6亿美金收购Rancher。
(2)Hashicorp成立于2012年,是一家开源的DevOps工具链提供商,集开发、运营和安全性于一体,产品包括多云资源管理和编排工具Terraform、身份验证工具Vault、服务网格Consul、集群调度引擎Nomad、开发环境构建工具Vagrant等基础设施自动化工具,贯穿持续交付的整个流程,加速应用的开发和部署效率。
(3)Datadog成立于2010年,为IT团队和业务团队提供统一的云环境监控和分析SaaS平台,将监控功能与基础架构、应用程序、日志管理结合在同一个解决方案,并推出了网络性能监控和用户体验监控的产品。Datadog平台具有可扩展性,每天监控超过10万亿个事件以及数百万个服务器和容器。2019年Datadog IPO,保持高速的增长。
(4)Kong是一个开源的API网关,2015年开发,提供API管理功能,对于微服务化的应用是一个非常有帮助的工具,与业务无关的公共服务都可以交给API网关,并围绕API管理可通过插件实现流量控制、身份认证、协作转换、服务发现等功能,可作为全生命周期的API管理平台,超过5000家开源用户和超过100家付费用户。
德联资本的云原生投资方向
我们在云原生时代的主要投资方向:
一是,工作负载类,包括比较底层的云原生网络、存储,容器和容器的编排和管理,数据库等;
二是,非工作负载类,包括云原生的运维、监控、持续集成和交付(CI/CD)等,更多偏向于配套生态和周边工具集;
三是,中间件属性类的项目,如消息中间件、API网关等;
四是,云原生安全相关的项目。
这四类项目我们都非常看好,对于云原生来说,它们之间是紧密相依的。但每类项目在国内的发展成熟度会有所不同,导致赛道里企业的数量、体量会不太一样。目前,工作负载类的项目更为成熟,企业的估值也相对较高;非工作负载类项目次之;中间件、安全相关的项目则处于更早期的阶段。
总体来看,我们认为云原生是一场基于云的DevOps之旅,是一场开源运动,未来的软件一定是长在云上的,云的价值也一定会回归到应用本身。因此对于云原生方向的投资,我们会重点关注以下几个方面:
DevOps方向:有了云原生架构才能更好落地DevOps,真正落地的DevOps才能更好发挥云原生的价值,所有云原生的用户使用Kubernetes的目的都是为了交付和管理应用。Kubernetes可以视为云原生时代的操作系统,对用户暴露出一组声明式API,它实际的用户不是业务开发人员、也不是业务运维人员,而是平台开发者,即有能力基于Kubernetes在上面再构建平台的人群。这就导致Kubernetes对业务开发和运维人员不是很友好,因此基于Kubernetes再构建出一个平台来面向业务开发、运维人员来更好地使用,提供一致的开发和运维体验,降低云原生落地复杂度,也是非常有价值的,就像Windows相比Linux的区别,图形化界面降低了普通人上手使用操作系统的门槛。
开源项目:在云原生体系里,开源项目比普通商业项目更占优势,开源项目更容易被其它产品支持和集成,并且云原生相关技术的早期使用者以开发者为主,开源项目更容易在开发者群体中快速建立口碑和影响力,社区对于好的技术是公平的,同时在社区支持下,开源项目质量更容易得到保证。开源也是我们认为最难投的方向之一,做好开源项目非常不容易,要同时具有技术创新和商业创新,两者做到良性循环。开源与传统的公司相比有不同的模式和进入市场策略,一个常见的陷阱是产品-市场匹配度非常高,导致市场-价值匹配变得不再必要,社区版产品虽然有很多的下载量,但最终没有形成很多的付费用户。创业者一定要在早期的时候就想好相对于社区版,商业版产品将以什么形式呈现。
面向云原生应用,平台层能力的工具集:我们认为只有能够为用户提供平台层能力的工具,才会真正成为开发者关心和愿意付费的产品,如果是单点产品,那么价值要足够强,刚需且使用高频,例如数据库,绝大部分的应用开发都必须用到数据库。
创始团队需要对技术和云原生生态有深刻的洞察和思考,有前瞻性视角。举例来说,我们看到云原生以及整个生态的发展趋势,应用中间件能力将进一步下沉,变成Kubernetes的一部分。这一领域的创业者需要思考自己的产品与Kubernetes以及社区未来发展方向的关系,会不会与趋势发生偏离或者被降维打击。