最近因为微服务项目的实施,开始深入了解云计算的基础架构。越往前推进,越发现微服务架构要能成功,绝对离不开基础设施的支撑,基础架构的云化,项目管理的devops化,都是微服务能够落地的必不可少的支撑要素。这边简要记录一下自己学习云计算的学习笔记。
注:文章里面比较多的引用了网易刘超老师的不是技术也能看懂云计算,大数据,人工智能这篇文章的观点,特此说明。
有人说,要想深入了解一门技术,就要去了解它的历史,它发展的来龙去脉,它的诞生是为了解决怎样的痛点,只有这样你才能知道为什么它要如此发展,各个时间点的技术抉择又是基于何种考虑。所以在谈云计算之前,我们先来谈一谈软件交付方式的发展历史。
软件交付发展阶段
客户端软件
在计算机诞生的初期,其实是没有软件这种说法的。一般的常用程序都是随硬件生产商附赠预装在硬件里面的,算是买硬件送软件。而且特别难用,不是专业人士根本用不了(需要打孔神马的),买去的客户一般都是为了完成特定目的(IBM最早就是做人口普查统计和制表机的)。随着计算机技术的不断发展,性能不断提升,价格不断下降,这时候开始有了个人PC,而此时也诞生了很多的专业软件,可以完成各种各样特定领域的专业任务。典型的如早期的windows,office,wps等等软件。这些软件一般是以磁盘或者光盘的方式交付,运行在客户PC机里面,也不需要联网,安装完就可以使用了。一直到2000年之前这种方式还是软件交付的主流方式。
B/S阶段
随着软件工业发展越来越成熟,各种专业软件层出不穷,软件的升级周期越来越短,原有的客户端软件模式的弊端开始不断显现。要升级的话需要去安装补丁包,用户还要找各种渠道找到这些补丁包,升级率大大降低。只是升级还好说,如果软件被发现有重大bug或者漏洞,根本不可能让所有客户快速升级。此外有些软件我可能只需要用一两次,但是也必须安装,时间一长电脑里一大堆用不着的没用软件。这时候,随着网络的普及,基于万维网的应用开始渐渐流行,这些软件不同于传统软件,不需要安装,只需要打开浏览器,基于标准的http协议与服务器进行通讯,就可以使用,而且保证用户永远使用的是最新版本的软件,各种漏洞的修复也是即时的。基于互联网技术,用户体验得以大大提升。为了以示和传统软件供应商的区别,这类提供互联网服务的一般自称为SP(服务提供商),他们所提供的一般称之为服务(service),而不是软件(software)。
互联网应用为我们打开了新世界的大门,但是用户体验的提升不是免费的,B/S架构的核心,是client-server模式,即服务提供方必须提供服务器,供客户端进行访问,client与server之间基于标准的http协议进行握手通讯,这个服务才能访问到。而server对外能提供的服务能力,便取决于计算(服务有多快)、存储(服务的数据量)、网络(如何访问到服务)这三个核心问题,也就是所谓的IT基础设施,SP需要在机房内部署服务器集群,并解决计算、存储、网络等一系列问题,才能对外提供服务。
IT基础设施发展阶段
自建机房
一般比较大的公司,都会有自己的机房。机房的配电、温度、湿度、UPS、机架、柴油发电机、网络配置、机房监控等等全部自己搞定,好处是所有环节全部掌握在自己手里,相对自主可控,当然坏处是成本非常之高,一般的中小型公司承受不了。
IDC托管
基于上述自建机房的痛点,有了IDC托管模式。因为电信运营商掌握了相当多的网络资源,所以这种模式电信运营商搞的比较多。运营商出资建设机房,网络、机架、配电等等头痛的问题都由IDC服务商来搞定,SP只需要出钱租一个机架放自己的服务器就行了,大大降低了运维成本。(注意这边其实已经出现了租户的概念)这相当于开发商造好了写字楼,里面水,电,网络,日常办公用具都帮你准备好了,你只需要租下一个格子间,就可以立马办公了,省事不少。
云计算
其实一般的应用,没钱的用IDC托管模式,有钱的自建机房,只要访问量的波动不是特别大,已经满足绝大部分需求了,为啥会出来“云计算”这东东?大家知道,“云计算”这个概念最早是由谷歌的CEO埃里克·施密特在2006年提出的,阐述的是一种基于互联网的,能够提供动态易扩展的虚拟化资源的能力。大家刚听到的时候也是一脸懵逼,云里雾里,不知所谓。但这时候有一家公司也已经持续在这方面工作了很长时间,并在同年推出了全球第一个大规模商用落地的云计算产品。这家公司就是亚马逊,亚马逊为何需要云计算?众所周知,亚马逊是一家电商公司,电商的特点就是波峰波谷极为明显,在促销期间的用户访问量可能是平时的几十倍甚至上百倍,为此购买了一大堆的服务器,但平时却根本用不着。于是它就老琢磨着平时这些空闲的计算资源是否可以出售给其他需要的公司使用,这样我的服务器资源就得到了有效利用,也不算白买了,这就是云计算里面很重要的一个概念按需付费,用多少付多少,妈妈再也不担心我的服务器空放在那里吃灰了。所以从一开始来看,亚马逊的出发点就是为了盘活自己的闲置资源。哪知道产品推出后异常火爆,因为按需付费,弹性伸缩的理念切实击中了市场痛点,aws至此赚的盆满钵满,引得后续谷歌、微软等大佬纷纷入局。
为什么云计算能如此火爆?正如刘超老师所说,云计算的本质是实现资源及架构的全面弹性。一个SP,这个月生意好了,访问量增大了我想加个5台服务器,下个月生意不好了,这5台我又不要了,你要是这么去和IDC谈,估计要被他踢出来,因为IDC的服务器管理都是基于实体服务器的,加一台就是真的搬一台服务器上架。但是云计算是基于虚拟化技术的,所以说它的资源分配就灵活多了,不需要去动实体机,只要在不同的实体机之间进行虚拟机的资源调度(Vmware的技术甚至能做到在不停机的情况下把一台虚拟机从一个节点调度到另外一个节点,ip地址保持不变,进程运行不中断),通过多租户管理划分给不同的客户就行了,客户根本不知道自己的虚拟机是在哪个机架上的,也不需要知道。在云计算平台上,用户可以获得真正的时间灵活性和空间灵活性,即我想什么时候要,就能什么时候得到,我想要多少,就能得到多少,这是基于传统的机房托管模式所完全无法达到的高度。
云计算的开源与闭源
云计算虽然说理念很好,市场很大,大家都想做,但其实技术壁垒还是相当高,不是谁想做就能做。第一个商用落地的云计算产品是AWS,这也是目前全球云计算市场的龙头老大,虽然aws的虚拟化技术是基于开源的kvm和xen,但是它云化的代码是闭源的。第一名日子过的很爽,第二名日子就不好过了,这家公司名字可能很多人都没听过,叫Rackspace。这公司想了想,反正也搞不过老大,索性把技术开源,大家一起来搞,说不定还有机会,于是他们和NASA联合,做出了一个开源项目,这个项目就是大名鼎鼎的openstack。openstack一开源,所有想做云计算的厂家都疯了,IBM,惠普,戴尔,华为,联想等等,都疯了。原来云平台大家都想做,看着亚马逊赚了这么多钱,眼巴巴看着没办法,想自己做一个好像难度还挺大。现在好了,有了这样一个开源的云平台OpenStack,所有的IT厂商都加入到这个社区中来,对这个云平台进行贡献,包装成自己的产品,连同自己的硬件设备一起卖。有的做了私有云,有的做了公有云,OpenStack已经成为开源云平台的事实标准。国内的腾讯云和华为云,底层技术也是基于openstack(阿里云是自研的飞天)。
云计算各类概念
IaaS
基础设施即服务:通过前面的介绍,这个概念就很好理解了,这也是云计算的本质:即通过虚拟化技术,实现计算、网络、存储等资源的弹性调度以及统一管理及监控。我们讲云计算,一定是先要实现IaaS,没有IaaS,云计算就是无本之木,无源之水。IaaS的代表产品,开源的有openstack(好像也就这一个),闭源的有aws、azure、gcp、阿里云等等。
PaaS
平台即服务:通过IaaS,实现了计算资源的弹性,但离真正的弹性还是差一口气,这口气差在了应用的部署上面。试想我原来10个虚拟机,上面跑着应用,通过IaaS平台扩到100台虚拟机,但是这多出来的90台虚拟机上面是空的,没有应用,于是我还得一台一台去部署应用,这显然是愚蠢且不可接受的。所以说云平台还得管应用,用户体验才能做到最好,这就是PaaS干的活了。PaaS上面部署应用主要分为两种模式:
通用软件部署
这部分我们一般称之为通用中间件,或者说中间件PaaS化,这些中间件一般是以应用商店的形式展现在云计算平台上面(比如mysql、redis、kafka、rabbitmq、mongodb等等)。大家可以去阿里云或者华为云上面看一下,那些云数据和消息中间件都是属于这种模式,点一下,就可以自动创建了,还可以创建HA高可用集群,你都不用管,并且有专门的运维团队负责维护。比如mysql集群,自己装一个是非常麻烦的,但是在云平台上面就是点几下鼠标的事情,都自动帮你弄好了,且有云平台的专家进行维护,通过中间件PaaS化,大大降低了中间件的运维成本。-
客户软件部署
客户软件就是客户自己的业务系统了,这部分的功能由于涉及业务,维护方面肯定需要客户自己维护了,云平台做不了,但是云平台可以帮你解决自动部署的问题,即我准备好了部署包,PaaS平台可以自动帮你部署到100台虚拟机上去,不需要自己一台一台去部署(当然你也可以写ansible脚本去做自动部署,本质一样的)。
PaaS的代表产品,开源的有pivotal的cloud foundry,redhat的openshift。其中cf一度有成为PaaS平台标准的可能,如果不是后来杀出一个K8S的话,当然k8并不完全做的是PaaS的工作,这是后话,后面再表。
其实技术发展到今天,PaaS不光是管应用部署,涉及应用生命周期的很多方面它都在管,比如应用监控、告警、日志收集、灰度发布、CI/CD等等。如果应用是微服务架构,甚至还要包括网关、注册中心、配置中心、熔断、限流、降级、调用链跟踪等等一系列功能,这些在广义上都可以称之为PaaS平台的功能。现在一般主流的云平台,都会提供微服务的解决方案,比如阿里云的EDAS,华为云的servicestage,但这些还是相对产品化的(一般都是基于spring cloud或者dubbo开发的一套微服务框架,云平台帮你部署好了),现在的技术发展趋势,是把这些服务治理的功能进一步下沉到云平台的基础设施,即PaaS平台里面去。(比如以Istio为代表的service mesh技术)。看到这里,你应该理解了,为什么微服务的落地,离不开云化基础设施的建设了吧。
SaaS
软件即服务:SaaS的定义有很多,大家理解都不一样。一般来说,我不认为面向最终用户的软件可以称之为SaaS,比方说用户登陆一个电商网站购物,其实这个网站是跑在云平台上的,还是一个服务器的tomcat里面,用户是不关心的,他只管买买买,网站的IT架构和他无关。当然你也可以说电商网站通过卖会员,出租网上店铺提供各类云服务,但这些本质上都是一种商业模式。如果这样的服务也能称之为SaaS,那其实所有基于B/S架构的应用都可以称之为SaaS,这和我们传统认知的云计算理念不符。我理解,SaaS服务是面向企业用户的,而且一般是由云计算厂商提供的,中小企业没有技术能力或者算力去做的服务。
SaaS典型的应用场景是大数据和人工智能。大数据一般需要进行大规模的并行计算,中小企业没有这个算力,也不想搭建复杂的大数据集群,那么可以把这个计算放到云服务商搭建好的hadoop或者spark集群上面去算,计算结果包装成服务给企业用。而人工智能,一般需要大量的基础铺底数据进行训练,中小型企业也没有这些数据,但是云服务商有,于是也可以包装成服务去卖。比如人脸识别算法,即使厂商给你部署了一套环境,你也用不起来,因为你没有数据。而我们可以调用云服务商的api,直接进行人脸识别。而且前面说了,云计算的一个特点是按需付费,在前期业务量不是很大的情况下,企业就不需要去买一套完整的人脸识别产品,只需要按照api的调用次数付费,成本也大大下降了。所以说,一般云计算平台上,都会有大数据和人工智能的相关产品,他们的关系是很紧密的,也是能充分发挥出云计算厂商优势的地方。
说到这里,云计算的三兄弟IaaS、PaaS和SaaS终于凑齐了。相信通过上面的介绍,你也了解了,不管是哪种aaS,都是面向企业用户的,和终端用户(个人)沾不上边。云计算本质上来说提供了企业IT资源弹性管理和应用开发、部署、运维的一种全新模式。现在市面上充斥的诸如医疗云、市民云等等xx云,如果是给最终用户提供服务的话,我认为本质上与普通的互联网应用无异,纯粹是搭云计算的热度炒作,和云计算本身搭不上边,你把它换成医疗平台、市民平台是一样的。
云计算的分类
公有云
云计算最早的形式就是公有云,公有云也最符合谷歌最初提出的云计算模型。公有云部署在公网上,客户通过云平台按需申请资源,使用资源,一般面向的客户是中小型企业。目前公有云,国际上来说,亚马逊aws,微软azure,谷歌gcp,ibm的ibm cloud并称四大巨头,国内的话是阿里云、华为云、腾讯云构成头部企业,一般只有大厂有实力去做公有云(一般公有云节点都会达到几十万甚至上百万,全球部署几十个可用区),而且这块的市场现在瓜分得已经差不多,新玩家也很难入场。公有云一般提供的功能比较完整,迭代速度也很快,云计算厂商最新的技术都会优先放到公有云上。
私有云
公有云有很多优点,尤其适合初创型企业,可以快速构建完整、可靠的基础设施,节省了大量建设成本。但是就像《人月神话》里面所说,“没有银弹”,公有云不能解决所有问题,尤其在企业规模变大后,企业更加倾向于自建数据中心,一方面是数据安全性的考虑,另一方面也可以对于IT架构的规划有更强的自主性。公有云的提供商一般不是中立的,本身也在经营很多业务,有些领域甚至有竞争关系,一旦做大后,你就很难去用这些公有云了。你无法想象京东会把所有服务托管在阿里云上,也无法想象支付宝会把业务托管在腾讯云上。这时候,企业就有建设私有云的需求。
而如果跳出互联网这个圈子,私有云这种模式,更对传统企业的胃口。对于传统企业,我总结了下,称之为“三有三无”。有钱(一般都是行业巨头不差钱),有资源(机房和服务器),有人(运维人员),无技术(云计算技术),无流程(devops),无理念(云原生思想)。企业想上云而不得法门,市场就是这样的,有需求自然就会产生供给,各类私有云公司顺势而生。做私有云的公司很多,有多少?可以去看一下CNCF的官方网站,底下白银会员的位置,一堆xx云,xx cloud公司(国内的大概占了一半,你就知道云计算在中国多火了),基本都是这种模式,这些公司早先靠给大企业部署运维私有化的openstack起家,这些年docker火了之后,基本都转型做基于kubernetes的容器云了。而这些公司,一般都是轻资产公司,本身不会也无能力去运行大规模的服务器集群,他们一般给企业做流程咨询,卖自己开发的基于开源技术的云管产品,帮助那些传统企业建立敏捷流程,将基础设施进行云化改造,并提供基于openstack或者kubernetes的技术支持。这和传统企业的需求一拍即合,现在有越来越多的传统企业在进行数字化转型,所以这块的市场也是越来越火,传统的公有云巨头也在慢慢切入这个市场。但是一旦实施了私有云,考虑到企业的私有化数据中心规模是相对固定的,云计算的一个巨大优势弹性便几乎损失殆尽了。
混合云
公有云和私有云都各有利弊,所以现在的技术趋势就是两种云的混合使用,称之为混合云。一般倾向于核心业务,不太变更的服务(稳态)放私有云,互联网业务、需要承载大并发量的业务(敏态)放公有云,这样混合使用,既保证了核心业务数据的安全性,也充分利用了云计算的弹性资源这一巨大优势,可以说是取两家所长。著名的12306就是典型的混合云架构,占巨大流量和计算资源的余票查询服务部署在阿里云上,而核心的购票服务部署在私有云上,这是一个结结实实利用云计算弹性的绝好实例。目前混合云的实施落地占比在逐年稳步提升,也反映了市场的取向。
云计算的演化路径
这个题目比较大,自己尝试着说一下。大家都知道云计算的概念是在2006年提出,距今也有10多年了,在这些年里云计算的市场发生了巨大的变化,云计算也从一个虚无缥缈的理念演变成了你手中实实在在的账单。在这段发展过程中,我想分几个阶段来说。
PaaS
如果要我用一句话形容PaaS,就是“出师未捷身先死”,还没火起来就被docker干掉了。就像我之前说的,在2013年左右,cloud foundry已经几乎成了开源PaaS平台的事实标准,眼看能一统天下。这边我先说说,PaaS项目被大家接受的一个主要原因,就是它提供了一种名叫应用托管的能力。传统的基于aws或者openstack的虚拟机,你要部署一批应用,就需要写脚本或者用手工的方式,而这个部署过程难免会碰到云端虚拟机和本地环境不一致的问题,而PaaS项目恰好就是为了解决这个问题的,cf在虚拟机上启动应用时,会使用内核的cgroups和namespace机制为每个应用单独创建一个“沙盒”的隔离环境,在“沙盒”中启动进程,这就是PaaS项目最核心的能力--环境隔离,各个用户开发的应用跑在独立的沙盒里面,以此保证你本地和云端的开发及运行体验是一致的。
Docker
看了上面的介绍,你不难发现,这个所谓的“沙盒”,就是容器嘛!并没有什么特别的高深的技术,而docker,也无非就是容器技术的一种,本质上和cf用的容器技术没有太多的区别(cf用的容器技术叫做warden)。Docker能火的真正原因,是它提供了容器镜像,这一个创造性的发明,一下子打通了开发、测试、生产等等所有环境,通过模版化的环境申明,保证了一个镜像,不管在哪里运行,效果都是一致的,这对于开发人员来说吸引力太大了。docker凭借这一发明,瞬间完成了对PaaS平台的绝杀。
Kubernetes
docker通过容器镜像,解决了环境标准化的问题,但对于云上的应用来说,还是必须要解决应用如何部署的问题,于是人们发现,兜兜转转之后,其实现在又回到了PaaS深耕多年的领域--应用的打包和分发。怎么把docker容器部署在不同的节点上,整个集群如何去调度容器,现在有了一个新的名词-容器编排。关于容器编排之争,又可以写一大篇,这边就不展开了,总之竞争也是非常惨烈,最后kubernetes杀出重围,目前已经成为了容器编排的事实标准。
关于kubernetes,本身也是一个比较奇葩的所在。深入了解之后,你会发现它不仅仅只是一个容器编排工具(swarm真的就只是一个容器编排工具)。它做了一部分的IaaS的事情(计算、存储、网络资源的管理,根据namespace进行的多租户管理),一部分PaaS的事情(应用的自动部署、调度、回滚),甚至还有一部分微服务架构要做的事情(服务注册、服务发现、网关,如果再配合istio那基本是全功能型了)。K8所承载的功能,介于IaaS和PaaS之间,我更愿意称之为IaaS+。K8的出现是划时代的,对于规模在800个节点以下的中小型集群,甚至都不需要传统的IaaS基础设施,全部交给k8接管,这也是现在比较流行的所谓“裸金属云”。
从云到容器云
传统的云计算是基于虚拟化技术来进行资源调度的,而现在的技术趋势,是基于容器来进行资源调度,颗粒度更小(进程级别),与应用的结合更加紧密。从云到容器云,我形容是云计算从1.0到2.0的升级演化,从市场表现来看,这种升级是得到市场认可的,目前那些私有云公司,纷纷从openstack转kubernetes,也能看出这种技术演变的趋势。docker干掉了PaaS,kubernetes几乎能干掉IaaS,基于docker+kubernetes的容器云解决方案已经是目前云计算的主流方案,K8已经模糊了IaaS和PaaS的边界,以后IaaS、PaaS这类名词可能会越来越少的提及。(当然超大规模的服务器节点管理,IaaS还是必不可少的,只是重要性没有以前那么高了)
云原生
了解了上述理念,是时候来谈谈云原生了,什么是云原生?按照CNCF组织的官方定义,云原生技术帮助公司和机构在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。这是比较官方的说法,说白话的话就是云原生应用就是匹配云计算基础设施的应用开发及管理的模式,这些应用开发出来天生就是适合跑在云里的,或者说没有云是跑不起来的。注意这边提到的这朵“云”,绝非传统意义的“云”(虚拟化云),而是“容器云”,更明确的说,是基于kubernetes的云(至于为什么是k8,你看看cncf都是谁在搞就知道了)。所以说,如果你还没上k8,那对不起了,云原生的应用生态你享受不到了,谷歌爸爸不带你玩了,上了k8,你就算在云原生里入门了(不得不说谷歌的生态建设能力太牛)。
从业界的最佳实践来讲,云原生有一个所谓的黄金三角,即微服务+devops+容器化,微服务是优化应用架构,容器化是优化IT基础架构,devops是优化企业组织架构及项目管理流程。传统的IaaS、PaaS、SaaS是基于分层机制,自基础设施慢慢上升到应用这一层,而云原生从一开始就把项目看成是一个整体,从项目立项就开始切入,打通项目的设计、开发、测试、部署、运维、监控全流程,通过devops串起开发(微服务)和运维(容器)更加紧密的合作,从理念上来说我觉得更加先进。关于云原生相关话题,下次有机会再展开讨论。