如今社会高速发展,各种新技术层出不穷,云计算的概念早就不新鲜了。作为互联网从业者,如果不能深入了解云计算的概念,我们就无法在各大技术论坛深入浅出地装X,甚至有可能辩论不过小区门口天天看新闻联播的老大爷。
因此,深入理解云计算的相关概念是非常必要的。然而,当我们尝试搞懂云计算究竟是什么时,一定会面临各种问题。比如一开始,当我们在百度搜索引擎中搜索“云计算”时,会发现百度百科给它的定义是这样的:
云计算(cloud computing)是分布式计算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。
虽然百度百科用客观严谨的角度解释了云计算的概念,从业一到三年的专业人士可能能够轻松地理解其中的含义,但作为一个对于云计算仅知一二的小白来说,但是这确实他娘的不是一句人话。
啥是分布式计算?啥是资源共享池?为啥要把巨大的数据计算处理程序分解成无数个小程序?这些难以理解其存在意义的抽象名词无疑是晦涩难懂且狗屁不通的,给大家理解云计算的基本概念带来了层层阻碍,更别说理解之后的OpenStack、Hypervisor、KVM、Docker、K8S等等更加抽象的技术概念了。
因此,为了让零基础的小白也能零门槛读懂云计算到底是个啥,以及实现云计算所需要的种种技术之间的关系,本文将尽可能地减少专业术语在本文中所占的比重,并用较多的例子、类比等方式来解释相关的概念(因为作者水平也很菜,写不出太高深的东西来)。废话不多说,我们开始吧!
在深入介绍云计算各种技术之前,我们先简单了解一下云计算出现的背景。
在20世纪电脑被发明的时候,还没有网络,每个电脑(PC),就是一个单机。这台单机是由包括CPU、内存、硬盘、显卡在内的硬件资源构成的。用户在单机上,安装操作系统和应用软件,进行基本的操作和开发。
后来,出现了网络(Network),人们开始通过网络交换信息和资源。
再后来,CPU计算能力不断进步,但社会发展对计算能力要求也不断提高。人们渐渐意识到提升一台单机的计算能力的性价比不足以满足需求,而满足用户需求的方式,则是把单机集中起来,放在机房里,然后让用户通过网络,去访问和使用机房里的计算机资源。机房里的计算机资源就是现在俗称的服务器(Server)。
再再后来,小型网络发展成大型网络,机房规格不断进化,产生了互联网(Internet)和IDC(Internet Data Center)的概念。无数用户接入网络寻找资源,而为了满足数以TG计的服务需求,无数大型机房的计算能力相互连接,越来越多的计算机资源和应用服务(Application)被集中起来为用户提供服务。其中,部署了大量计算任务的各类IDC被统称为“云端”。
经过对云计算历史的简单回顾,我们不难发现,云计算的出现,不仅有效地将那些部署在本地的计算任务转移到了计算能力更强、更快捷的云端,使得PC从日益增长的繁重任务中解放了出来,而且还实现了资源共享、远程存储、网络互联等其它功能。
用更通俗的话来讲,说白了,云计算就是把计算机资源集中起来,放在网络上。
现在,云计算资源就好比我们现在日常生活中所使用的水、电、气等资源。我们想得到干净的水源,只需要打开厨房里的水龙头,而不需要在大江大河旁边建立自来水厂。
想一想在电力没有普及的18世纪,当时的工厂为了获得电能,不得不自己自备小型发电机,就好比云计算没出现之前的开发人员,只能把项目部署在自己的几台PC当中。而生活现代社会的我们,想要得到电能再也不用自己用破旧的手摇发电机自己发电了。只需要打开开关,国家电力机关已经帮你完成了发、输、配、改等一系列工作。
假设你是一个想要搭建自己企业网络环境的小型企业老板,如果不存在云端这一概念,那么你只能苦逼地花费高昂的资金去购买昂贵的硬件,再一步一步配置OS、开发环境、把自己的项目部署在上边…不仅花费贼贵,而且效果还不一定符合需求,实在是惨!
而云计算的出现彻底打破了这一局面。你只需要选择租用大型云平台构造自己的云,即可轻松获得和自己辛苦搭建环境同等效果的计算资源了!
说了这么多,想必大家对于云计算是个啥玩意有了一定的了解和认识。那么云计算到底有啥特点和牛X之处呢?让我们走进下一节。
刚才我们有提到过在云端上部署计算机资源,那么这一步究竟部署的是个啥呢?别急,我们先来思考一个吃水饺的问题。
假设某一天,张小胖饥肠辘辘,准备自己做一顿水饺。他先从菜市场买了面、菜、油等诸多原料,再回家擀饺子皮、调饺子馅、把饺子包好,最后打开了天然气,放到锅里一顿煮。这一顿操作和设备(包括食材、厨房设备、餐桌、餐具和制作过程)都是由自己准备的,我们暂且将它称作“本地部署”。
有一天,张小胖突发奇想,不想自己做了,于是他直接从零售店买了一袋速食水饺,回家自己下着吃,味道甚至比自己包出来的更美味。这一步,原材料都不用自己准备了,只需要准备煮生产饺子的锅,并且自己动手操作就好了。这种方式,我们把它称作“IaaS”(Infrastructure as a Service),也就是人们常说的“基础设施即服务”。
后来的一天,小胖同学突然大懒懒,不愿意出门买东西了,但是他还是想吃水饺,那这可怎么办呢?这时,他打开了“饿了么”(饿了么记得打广告费),给自己点了一份水饺。这一步,小胖都不用自己动手煮饺子了,除了餐桌和餐具是必须自己准备的,连煮饺子的锅也不需要了。那么这种方式,我们暂且将它称作“PaaS”(Platform as a Service),即“平台即服务”。
最后,我们的小胖同学连收拾餐桌和刷完的耐心也没有了,他直接上饭店要了一份现成的饺子,吃得十分过瘾。到了这一步,获得的直接是最终的产品,别的啥也不需要自己准备了。那么这种方式我们就把它叫做“SaaS”(Software as a Service),也就是我们常说的“软件即服务”。
用吃水饺的例子形容云计算的三个特征可能并不是很准确,但是确实大体上概括了这三种层次所提供服务的范围。借助上图,我们来正式认识一下这三个层次的概念。
第一层次,云服务商提供了最底层的硬件资源,主要包括CPU(计算资源),硬盘(存储资源), 还有网卡(网络资源)等。
第二层次,要高级一些。我们不直接使用CPU、硬盘、网卡等硬件设备,而是厂家直接帮我们把操作系统(如Windows、Linux)和数据库软件(例如Mysql、Sqlserver)等基本软件资源装好。
第三层次,更高级一些,厂家不但帮我们装好了操作系统这些基本的,还要把具体的应用软件装好,例如人脸识别服务端软件、在线视频服务端软件等,我们可以直接使用服务。
这三种层次,就是大家经常听到的IaaS、Paas、 SaaS。
经过上述讨论,我们对于云计算是个啥玩意、能给我们带来哪些服务就有了一个简单的认识。那么日常大多数企业利用云计算的形式是什么样的呢?百度百科告诉我们,大体可以分为三种形式:私有云、公有云、混合云。我们通过一个荤段子简单了解一下这几种形式的区别。
你娶了一个老婆,这叫传统IT架构。
你娶了很多风格气质各异的小老婆,以至于形成了后宫,这叫私有云。你的后宫就叫计算资源池。你从后宫里选出懂事有能的管理其他小老婆,这叫私有云管理方案。管事的那个就是HYPERV或VMWARE。
你不娶小老婆,改成包养很多情人,这叫托管云。
你是穷人,没有钱包养任何人也没钱娶小老婆,你选择去洗浴中心解决问题,这叫面向中小企业的公有云服务。 你在享受公有云服务的同时还得交公粮,这叫中小企业的混合IT架构。
你是富人,但也喜欢去高级夜总会,这叫面向大企业用户的公有云服务。
你有钱,同时包养小老婆和情人,还去洗浴中心,这叫混合云。但是在混合云里,最关键的业务还是会谨慎地采用传统IT架构。
原出处知乎,完整版欢迎移步:https://link.zhihu.com/?target=http%3A//zhi.hu/ZlP2
聊了这么多云计算的服务模式,那么云计算的提供厂商是怎么为我们提供服务的呢?这才是我们作为技术人员真正应该关心的东西。
首先我们举个例子,假设你在家里自己摆了台服务器开个文件传输权限,用于同学之间共享资料,那么一台云主机完全够用。
但如果在是“双11”的淘宝购物节期间的阿里巴巴淘宝网站,面对全球几十亿用户访问,每秒几百GB的流量…这个显然就不是几根网线几台服务器能解决的了的了。我们需要设计一个超大容量、超高并发(同时访问)、超快速度、超强安全的云计算系统,才能满足业务平稳运行的要求。
那么,我们如何达到这样的要求呢?换句话来说,我们需要通过什么技术来实现一个这么牛X哄哄的超大规模云计算系统呢?接下来就进入本篇文章的重点——How to 云计算。
假设你是一家云服务公司的老板。某天,打东边来了个小明,他对你说:“我要一台四核CPU、8GB内存、300GB硬盘的服务器!”
你说:“彳亍!”可是你手头上并没有配置恰好全部符合小明需求的机子!
小明气呼呼地走了。这时,打北边来了个小红,她对你说:“我想要一台装了Ubuntu 16.04版本、Tomcat和Mysql 5.5.60版本的服务器!”
你说:“彳亍!”于是,你灰头土脸地找了半天符合要求版本的Linux系统烧写盘,然后花了半天时间现装好了Tomcat、Mysql等开发全家桶。
等你装好了抬头一看,小红早就不耐烦地走了。这时,打南边来了一车面包人,闹腾腾地冲你喊什么的都有:“老板,我要包含语音识别和人脸识别SDK的云平台!”、“老板!来份Nvidia P100 GPU 、内存配比为1:7.5的计算型GPU !”、“老板一份MySQL+Redis+数据库备份的云数据库打包带走!”…
老板,卒。
这个故事告诉我们,想要满足群众的需求,就必须能够提供多样化多层次的云计算服务。那么,我们该怎么实现对资源的合理调用和管理呢?
我们对物理资源进行管理的第一步,就是“虚拟化”。
虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
简单来说,虚拟化就是在一台物理服务器上,运行多台“虚拟服务器”。这种虚拟服务器,也叫虚拟机(Virtual Machine)。
举个例子,大家都有在阿里云或者腾讯云等大厂租过服务器的经历,那么你作为租户,使用的其实是阿里云提供给你的一台虚拟机。也就是说,阿里从大量的服务器集群中,分出了一定的cpu、内存等等资源给你,就成了一台完整的虚拟机。
那么,谁来完成物理资源虚拟化的工作呢?就是大名鼎鼎的Hypervisor。
Hypervisor ,翻译过来是“超级监督者”, 也叫做VMM (Virtual Machine Monitor )。它不是一款具体的软件,而是一类软件的统称。
Hypervisor分为两大类。
第一类, hypervisor直接运行在物理机之上。虚拟机运行在hypervisor之上。
第二类,物理机上安装正常的操作系统(例如Linux或Windows ) ,然后在正常操作系统上安装hypervisor ,生成和管理虚拟机。
这样直接解释概念可能大家没有一个直观的认识。我们举个例子:
相信很多人都有在Windows系统装Linux虚拟机的经历。大家打开了自己的电脑之后,通过VMware或者别的软件,又打开了一个“子电脑”。大家在“子电脑”里,你可以和正常电脑一样运行程序,例如刷微博登微信等等。如果你愿意,你可以同时打开好几个“子电脑”,里面各自跑不同的程序。“子电脑”和“子电脑”之间,是相互隔离的,互不影响。
那么,我们所使用的VMware就是我们刚才提到的Hypervisor,除此之外,主流公司还推出了Xen、Virtual Box等商业虚拟化软件。但是,真正厉害的,是KVM ( kernel-based virtual machine )。它是基Linux内核的虚拟机,也是目前最受追捧的虚拟化方案。
像KVM这样的Hypervisor软件,实际上是提供了一种虚拟化能力,模拟CPU的运行,更为底层。但是它的用户交互并不良好,不方便使用。
于是,为了更好地管理虚拟机,就需要OpenStack这样的云管理平台。它有点像个商店,负责管理商品(计算资源、存储资源、网络资源等)。然而它本身不制造商品(不具备虚拟化能力),它的商品,来自于KVM。
回过头来简单总结一下,虚拟化技术就是将一堆物理设备虚拟成多个逻辑设备使用(也存在将多个物理设备虚拟成一个逻辑设备使用)的技术。
(具体实现有CPU虚拟化、硬盘虚拟化、网络虚拟化等等,本文不再详述)
回到本节开头的那个例子,如果你是那个云厂商的老板,并且掌握了主流虚拟化技术,那么当面对一车面包人各式各样的需求时,就不用苦逼兮兮地一个个亲自配置了,只需要把现有的硬件虚拟化的各式资源卖出去,就可以灵活地解决大家稀奇古怪的各种需求。
书接上回,前文所说的虚拟化方式,人们在使用一段时间后发现,它存在一些问题。
不同的用户,有时候只是希望运行各自的一些简单程序,跑一个小进程。为了不相互影响,就建立了虚拟机,显然浪费有点大,且花费时间也比较长。比方说我就只是想开台小机子给树莓派当服务器收收数据,但却不得不为此开一台新的虚拟机,这无疑有点彪。
而且,有的时候,想要迁移自己的服务程序,就要迁移整个虚拟机。显然,迁移过程也会很复杂。
本质上来说,虚拟机直接模拟了整套操作系统。以作者本人为例,每次开个VM跟真的开机似的,不仅占内存,启动还贼慢。
有没有办法更灵活快速一些呢 ?答案当然是肯定的,这正是我们本节要介绍的"容器( Container )”。
容器也是虚拟化的一种方式,但是它属于"轻量级”的虚拟化。它的目的和虚拟机一样,都是为不同进程或者项目之间创造"隔离环境”。但是,它又和虚拟机有很大的不同。虚拟机是 操作系统级别的资源隔离,而容器本质上是进程级的资源隔离。我们看下边的图,就能轻松地了解容器和虚拟机之间的异同。
看完了容器和虚拟机在架构方面的异同,我们不难发现,容器更便捷灵活。从运行时间角度上来看,容器的启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。这也是容器被广大技术人员追捧的原因。
我们吹了半天容器的牛X之处,但是大家可能还是对于容器技术到底是个啥、能干啥缺乏直观的理解。既然如此,我们就不得不对当下最火爆的容器引擎——Docker进行深入的探讨了。
Docker的官方logo是一只背着好多集装箱的可爱的小胖鲸鱼。所谓Docker,翻译过来的意思就是“码头上的搬运工人”。那么,它究竟是干啥玩意的呢?不要着急,我们还是先通过一个例子来认识它。
某天,张小胖同学又饿了,于是他又想给自己包顿饺子。于是,他擀饺子皮、调饺子馅、烧开了水炖饺子…一套流程下来,他终于做出了一顿香喷喷的饺子。
这时,他突然想道:“我包的饺子这么好吃,可是每次都要自己亲自动手费老半天劲儿,我实在是太懒了。要是有个神奇的背包,让我可以把饺子存到背包里当做饺子镜像,以后想吃的时候直接把饺子镜像复制粘贴出来,直接就能吃上新鲜的饺子了,嘿嘿嘿。”
突然,不知从哪蹦出来个老头,扔给他一个有魔法的背包。
小胖将信将疑地把饺子放了进去。神奇的事情发生了,背包里的饺子果然具有了复制粘贴功能。从今往后不管小胖走到哪,他都能凭着背包里的饺子存档随时掏出一盘饺子。
从此,小胖和饺子过上了幸福的生活。
啰啰嗦嗦说了这么多废话,我们不难发现Docker技术的三大核心概念,分别是:
刚才的例子里面,那个放在背包里的“饺子镜像”,就是Docker镜像。而背包,就是Docker仓库。我随时随地凭借饺子镜像粘贴出来的饺子,就是一个Docker容器。
说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。这句话啥意思呢?就是每个人用这个饺子镜像复制出来的饺子形状都是一样的,但是里边具体啥馅是不一定的。
小胖天天吃饺子,过了仨月,小胖突然想,我既然能复制饺子镜像,那我能不能复制别的食物,比如包子、馅饼、烤鸭之类的呢?
也就是说,大家如果把各自的镜像共享出来,那是不是每个人都能获得好多好多的好吃的?
答案当然是肯定的。大家最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像,就相当于一个装满了各种美食的背包。
(关于Docker更多具体技术,欢迎大家移步我的其他博客)
就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。
从吃饺子的角度看,如果缺乏一个管理仓库中各种食物镜像的安全性和口味的大厨,万一有的食物镜像里边有毒可咋整?再说也不是所有人都懂怎么吃每一种食物啊。
就在这个时候,K8S出现了。
K8S,就是基于容器的集群管理平台。它的全称,是kubernetes,但是这个词太长了,大家又都比较懒懒,因此把“k”和“s”中间的八个字母缩写成一个“8”,它的意思是“掌舵人”。我们看它的Logo也能看出来。
K8S的架构,略微有一点复杂,我们简单来看一下。
一个K8S系统,通常称为一个K8S集群(Cluster)。这个集群主要包括两个部分: 一个Master节点(主节点)一群Node节点(计算节点)。主要职责是容器编排( Container Orchestration )一启动容器,自动化部署、扩展和管理容器应用,还有回收容器。
简单来说,K8S有点像容器的保姆。它负责管理容器在哪个机器上运行,监控容器是否存在问题,控制容器和外界的通信等等。
当今社会飞速发展,新概念、新技术的迭代可谓日新月异。曾经被2010年的马化腾不看好、称之为“今后几百年才能用得上”的云计算技术,不知不觉间已经成了像空气一样的、每个人感受不到却都离不开的资源。
今天我们大体上了解了一下云计算的诞生历史、IaaS/PaaS/SaaS三大特性,并简要了解了KVM、Hypervisor、Openstack等虚拟化技术的涵义和Docker、K8s等容器技术的涵义。希望这篇博客能够帮助你理解云计算究竟是个啥玩意,并且我希望它有助于你在和小区门口看新闻联播的老大爷的辩论中取得胜利。
如果你觉得这篇博客不错,不妨给作者点个赞~
参考博客:
https://zhuanlan.zhihu.com/p/53260098
https://www.zhihu.com/question/27211555/answer/556692696
https://blog.csdn.net/qq_44584356/article/details/104420687
https://www.jianshu.com/p/312056e70387?from=timeline
https://blog.csdn.net/gui951753/article/details/81045508?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task