云技术如何一步步演进的?
云原生解决了什么问题?
电脑刚被发明的时候,还没有网络,每个电脑(PC),就是一个单机。
这台单机,包括CPU、内存、硬盘、显卡等硬件。用户在单机上,安装操作系统和应用软件,完成自己的工作。
后来,有了网络,单机与单机之间,可以交换信息,协同工作。
再后来,单机性能越来越强,就有了服务器(Server)。把一些服务器集中起来,放在机房里,然后让用户通过网络,去访问和使用机房里的计算机资源。
再后来,小型网络变成了大型网络,就有了互联网(Internet)。小型机房变成了大型机房,就有了IDC(Internet Data Center,互联网数据中心)。
当越来越多的计算机资源和应用服务被集中起来,就变成了——“云计算(Cloud Computing)”。无数的大型机房,就成了“云端”。
如果要对物理资源进行管理,第一步,就是“虚拟化”。
虚拟化是云计算的基础。简单来说,虚拟化就是在一台物理服务器上,运行多台“虚拟服务器”。这种虚拟服务器,也叫虚拟机(VM,Virtual Machine)。
直接使用物理设备的缺陷:
从表面来看,这些虚拟机都是独立的服务器,但实际上,它们共享物理服务器的CPU、内存、硬件、网卡等资源。
虚拟机监视器可以对捕获的特权指令进行替换操作,从而完整地模拟出某个虚拟机监视器下的特权操作。“陷阱+模拟”机制从本质上保证了可影响虚拟机监视器正常运行的指令由虚拟机监视器模拟执行,而大部分非敏感指令还是照常运行在物理CPU上。
简单来说,虚拟化就是通过模仿下层原有的功能模块创造接口来“欺骗”上层的机制。通常的做法是在整个系统架构中增加一个抽象层,负责分割下层的物理资源,然后组合成逻辑资源供上层使用。
直接使用虚拟机的缺陷:
时间灵活性:虚拟化服务并非随时可用,同时虚拟化的过程还需要比较复杂的人工配置,随着集群规模的扩大,人工配置愈加复杂、耗时。所以,仅通过虚拟化软件管理的物理服务器规模并不是特别大,一般是几十台至百台的规模。
空间灵活性:缺乏分布式部署,无法实现资源弹性扩展。当用户数量增多时,虚拟化软件所能管理的集群规模远未达到理想的程度,很可能造成资源不够。所以,随着对集群规模的需求越来越大,必须采取自动化的流程来实现资源弹性扩展。
操作灵活性:缺乏统一的自动化管理。虽然创建一台虚拟机的过程相对较为基础,但是操作的灵活性意味着用户可以更方便、迅速地对资源进行更进一步的管理操作,所有操作都可以通过自动化脚本来实现。
云计算的目标,就是解决这三大灵活性的问题。云控制平台通过调度器(Scheduler)来管理由几千台物理服务器抽象而来的虚拟资源池,无论用户需要多少CPU、内存、硬盘资源的虚拟机,调度器都会自动在资源池中匹配到最合适的资源,通过虚拟机的形式供给资源,并做好配置。这个阶段我们称为“池化”或者“云化”。虚拟化的能力和灵活性到了这个阶段,才可以被称为“云计算”,在这之前都只能叫作“虚拟化”。
云计算指IT基础设施的交付和使用模式,用户可以通过网络,以按需、易扩展的方式获得所需计算机资源。
第一层次,是最底层的硬件资源,主要包括CPU(计算资源),硬盘(存储资源),还有网卡(网络资源)等。
第二层次,用户不直接使用CPU、硬盘、网卡,厂商把操作系统(例如Windows、Linux)装好,把数据库软件装好,用户直接使用。
第三层次,厂商不但要装好操作系统这些基本的,还要把具体的应用软件装好,例如FTP服务端软件、在线视频服务端软件等,用户可以直接使用服务。
IaaS: Infrastructure-as-a-Service(基础设施即服务)
用户可以通过管理页面或者API创建一台EC2实例(虚拟机),然后直接通过浏览器或者通过SSH客户端登录控制台,而不再需要考虑物理服务器购买、网络的布线、操作系统安装等烦琐的传统IT基础运维工作。
PaaS: Platform-as-a-Service(平台即服务)
它直接为用户提供一套平台,包括语言运行环境、编程框架及数据存储中间件等一系列功能。这个平台可以是Java开发平台,用户只需要在遵守平台开发规范的前提下,编写自己的业务代码,单击运行,平台就会自动完成代码编译和打包,以及程序所需的数据存储(例如MySQL),即通过调用SDK或者API就可以使用平台,使得用户可以更加关注自己的业务代码的编写。
SaaS: Software-as-a-Service(软件即服务)
它是最高层的抽象,对于最终用户,它不关心任何技术相关内容,以服务的方式交付。我们使用的在线云编辑器就是一种SaaS服务,只需要通过浏览器就可以在线编辑Word或者PPT,并且可以云端保存,而且只要在能够连接到互联网的情况下,都可以编辑,用户不需要关心背后的实现细节。SaaS将应用的最终形态直接交付使用者,向用户暴露更少的技术细节。
使用虚拟化一段时间后,发现它存在一些问题:不同的用户,有时候只是希望运行各自的一些简单程序,跑一个小进程。为了不相互影响,就要建立虚拟机。如果建虚拟机,显然浪费就会有点大,而且操作也比较复杂,花费时间也会比较长。而且,有的时候,想要迁移自己的服务程序,就要迁移整个虚拟机。显然,迁移过程也会很复杂。所以就引入了“容器(Container)”。
容器也是虚拟化,但是属于“轻量级”的虚拟化。它的目的和虚拟机一样,都是为了创造“隔离环境”。但是,它又和虚拟机有很大的不同——虚拟机是操作系统级别的资源隔离,而容器本质上是进程级的资源隔离。
容器与传统虚拟机的对比
Pivotal最新官网对云原生概括可以具体化为4个要点:DevOps+持续交付+微服务+容器,一种构建和运行应用程序的方法。
微服务:微服务的关键优势在于可组合性,将应用分解为一组更小的轻量级服务,而这些服务可通过应用编程接口 (API) 轻松组合并相互连接。
容器和编排:容器是轻量级的可执行组件,包含在任何环境中运行代码所需的所有元素(包括应用源代码和依赖项)。容器提供工作负载可移植性,支持“一次构建、随处运行”的代码,使开发和部署过程大大简化。由于它们可以独立部署,因此还有助于避免各种语言、库和框架之间的磨合。这种可移植性和灵活性使得容器成为构建微服务架构的理想选择。
DevOps:云原生应用的开发需要改为采用像 DevOps 这样的敏捷交付方法,开发者和 IT 运营团队就可以密切协作,自动执行基础架构和软件交付流程。DevOps 可以加快一个想法从提出到部署的整个过程。DevOps 的核心在于,在应用的整个生命周期中,都要确保日常运维任务自动化和环境的标准化,容器可以提供标准化的环境。
持续集成和持续交付 (CI/CD):通过该自动化流程,可以更快地修复、扩缩和部署系统。通过 CI/CD 流水线,可以自动构建、测试和部署应用更改,而无需安排停机时间或等待维护窗口。持续交付可确保软件发布更可靠、风险更低,从而使得团队可以更快速、更频繁地提供新的服务和功能。
采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。
云原生解决了什么问题?
部署和扩展困难:传统软件部署通常需要手动配置和管理,而且在应对大规模流量时很难快速扩展。
环境一致性:开发、测试和生产环境之间的不一致性会导致问题的出现,因为应用在不同环境中的运行可能会产生不同的结果。
资源浪费:传统部署方式可能会导致资源的浪费,因为通常需要为应用的最高负载进行配置,而在低负载时会浪费资源。
恢复缓慢:基于虚拟机的基础设施相对于基于微服务的应用程序来说,是缓慢而低效的。因为单个虚拟机启动/关闭的速度很慢,并且在部署应用程序代码之前就会带来巨大的开销。