• 云时代【1】—— 云时代的前夜:虚拟化


    我们常常能听到 虚拟化、云计算、云原生 这三个词,这三者几乎总是一起出现。那么这三者是什么关系呢?当下最火的“容器”技术跟前三者又是什么关系呢?为什么我们能在各种前沿文章中看到“云原生”这个词呢?希望这篇文章能够理清一些东西。

    一、云时代的前夜:虚拟化

    或许更多人听过的是:容器 和 容器化,但容器化其实是虚拟化的一种。我们先从虚拟化介绍起,一步步了解事情的全貌吧。

    (一)虚拟化的背景

    进入21世纪后,大量企业进入以数据中心为业务运营平台的信息服务模式。然而,随着业务增长,数据中心变得越来越复杂,许多挑战接踵而来。

    • 如何通过数据中心快速地创建服务高效管理业务
    • 如何更加灵活、高效、安全地使用 和 管理各种资源,以降低运营成本?
    • 如何共享已有的计算平台,而不是重复创建自己的数据中心

    这些企业痛点推动了虚拟化技术的高速发展

    (二)虚拟化的实现方式

    为了解决上述现实问题,我们使用了虚拟化技术。首先我们看看下面这个简单的软件分层图,通过下面的图我们将能看到:不同虚拟化技术实现的作用位置是不同的
    image.png

    1. 物理机

    对应的是“真实的硬件层”,是提供真实的硬件环境的服务器或者计算机,有时也称为“寄主”,“宿主”。此时没有使用任何的虚拟化技术。

    2. 虚拟机

    虚拟机是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机
    是存在于“硬件层”和“操作系统层”间的虚拟化技术 ,虚拟机能够“伪造”一个硬件抽象接口, 将一个操作系统以及操作系统层以上的层嫁接到硬件上,实现和真实物理机几乎一样的功能。 每一台逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响。
    image.png

    相当于小区里的楼(虚拟化物理机、逻辑物理机),每一栋都是建在小区用地(真实物理机)上。

    3. 容器

    是存在于“操作系统层”和“函数库层”之间的虚拟化技术。容器能够“伪造”操作系统的接口, 将函数库层以上的功能置于操作系统上。
    是**操作系统层虚拟化 (OS Levelvirtualization) **技术。这种技术将 操作系统内核虚拟化,可以允许用户空间软件实例(Instances)被分割或几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers)。
    image.png
    相当于每栋楼(虚拟化物理机)中的一个房间(容器)
    image.png

    4. 似 JVM、PVM 的虚拟机

    存在于“函数库层”和“应用程序”之间的虚拟化技术。
    Java 虚拟机同样具有跨平台特性,而所谓跨平台特性实际上也就是虚拟化的功劳。我们知道 Java 语言是调用操作系统函数库的,JVM 就是在“函数库层”和“应用层”之间建立一个抽象层,对下通过不同的版本适应不同的操作系统函数库,对上提供统一的运行环境交给程序和开发者,使开发者能够调用不同操作系统的函数库
    image.png

    (二)虚拟化的演变

    1. 服务器虚拟化

    传统物理服务器的缺点 **VS ** ** ** 企业实施服务器虚拟化的原因

    • 计算机的CPU、内存等硬件资源利用率低 —> 提高服务器硬件资源利用率
    • 操作系统难以复制和迁移 —> 提高服务可用性
    • 物理服务器众多,维护难度大 —> 方便服务器运维、降低运营成本

    而在一台服务器上运行多个虚拟机,多个虚拟机共享同一台物理服务器的硬件资源。每个虚拟机都是相互隔离的,这样可以在同一台物理服务器上运行多个操作系统以及多个应用程序
    image.png
    image.png

    2. 容器化

    我们能看到服务器虚拟化技术的应用已经带来了巨大的收益,那么为什么还需要容器化呢?容器化跟服务器虚拟化相比有什么优势吗?在对比两者的差异之前,我们需要再好好聊一聊容器这个东西。看明白“容器”之后才能更好的理解两者的差异。

    (1)容器的诞生

    A. 现实困境:容器的诞生背景

    我们发现应用程序要 部署和运行 在底层的技术架构资源上其实并不容易

    • 配置操作系统安装
    • 安装应用运行:JVM 或者 其他解析器
    • 其他:配置和安装 中间件、数据库、缓存等等一系列组件

    这也产生了一个问题:虽然我们提升了技术架构的供给能力,但是应用没有办法更有效的直接利用 底层技术项目资源因此容器就出现来解决:应用和基础架构之间的鸿沟。
    image.png

    B. 解决方案:容器的功能

    那么容器怎么解决这个问题呢?

    • 容器定义了一种文件格式叫“容器镜像”容器镜像把应用本身、应用的配置,依赖的组件 以及 部署的操作 提前定义成模板
    • **在每一台机器上部署一个叫“容器引擎”的软件,容器引擎通过
    • **用容器实例来

    因为有了容器镜像作为模板,所以容器可以轻而易举的启动若干个应用实例。也因此部署变得前所未有的简单,以前可能需要花一两个小时完成的,用了部署扩容,现在几分钟之内就可以完成,效率提升的幅度让人惊讶。
    image.png


    但是,部署的问题解决了,新的问题又来了。现实中,企业里面不止只有一台服务器,而是有成百上千台机器。我们如何将容器应用部署到这成百上千台机器上呢?
    为了解决这个问题,**容器引入了“容器镜像仓库“的概念,它类似于如我们手机上的软件商城,里面存储了各种容器镜像。**具体来说:

    • 开发人员可以把容器镜像发布到容器镜像仓库当中,需要的用户可以通过仓库下载容器镜像
    • 通过每台主机上安装的容器引擎解析容器镜像,然后启动容器实例并运行我们应用程序

    通过容器镜像仓库,我们解决了应用大规模分发的问题。
    image.png


    但是**应用部署后还涉及到一个管理的问题。**我们如何管理每一台机器上的容器引擎的实例?
    我们需要一个集中的管理方案,这是为什么”容器编排“的概念会出现。**通过”容器编排“,我们可以在一个平台上管理成千上万的容器的主机,以及运行在这些机器上面的容器应用。**业界用到最主要的工具就是:Kubernetes(K8S)

    C. 容器是定义

    到此为止,我们已经列出了容器技术里几个关键的核心要点,在容器世界里有五个支柱:容器镜像、容器定量仓库、容器引擎、容器实力以及容器编排。在前面我们聊了他们解决怎样的问题,我们可以再深入一层,看看他们到底具体是什么。

    • 技术架构的角度来看
      • 容器镜像:其实就是压缩包文件,当然它是个具有特别合适的压缩文件
      • 镜像仓库:是一个文件服务器提供镜像的上传和下载
      • 容器引擎:是个轻量级的虚拟化的工具,它利用操作系统内核的能力构建出隔离的环境,也就是容器实例
      • 容器实例:是一个受控的进程,它的资源比如:CPU、内存进程、网络、存储访问等,都受到了管控。
      • 容器编排:是一种资源调度器,它管理了大片的机器,负责根据需求找到合适的机器的资源来运行应用程序。
    • 应用的视角来看
      • 容器镜像:提供了一种应用的交互件的格式。这种交互件格式比传统的交互件包含了更多的内容,它除了包含应用程序,还包含了应用所需要的 配置 以及 依赖组件
      • 容器镜像仓库:解决了应用的分发的问题
      • 容器引擎 和 容器实例:为应用提供了运行的环境
      • 容器编排:则是对应用进行了全生命周期的管理

    image.png

    网上许多回答说:容器是轻量级的虚拟化技术。这个理解其实并没有错,只是这个想法它只反映了容器非常小的一部分的能力以及价值。通过我们上面的分析,我们可以看到容器其实解决的主要是应用在部署、运行惯例以及交付中所遇到的所有问题。容器其实支持了应用 端到端 的交付流程。
    容器技术的实现虽然是建立在基础架构的基础之上,**但是它的价值体现其实是反映在在对上层应用的支持上。**这也是为什么在过去几年许许多多的容器的项目,实际上它是 Paas 项目,微服务的项目,或者是 DevOps的项目。容器是:当前热门的应用的交付手段,容器也将是未来应用交付的标准,未来我们大部分的应用会容器的形式运行在不同的云的环境当中。

    (2)容器的优势

    在理解容器的基础上,介绍容器化的优势就容易多了。**容器本质上是主机运行的一个进程,只不过该进程被进行了各种各样的限制。**主要体现在以下六个方面:

    A. 资源利用率高(*)

    将利用率较低的服务器资源进行整合,用更少硬件资源运行更多业务,降低 IT 支出和运维管理成本

    • 磁盘占用:传统虚拟机需要 GB级别,容器只需要 MB级别
    • CPU内存占用:容器直接作用于硬件资源,不需要额外的虚拟层。

    这个优势带来的直接结果就是:容器的 启动速度更快安装管理更方便。

    我们可以从架构的角度看看为什么 容器的资源利用率比虚拟机 高?
    image.png
    Docker 比 虚拟机 少了抽象层。
    **a. **Docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 Docker 容器上的程序直接使用的是实际物理机的硬件资源。因此在 CPU、内存利用率上 Docker 将会在效率上有明显的优势。
    **b. Docker 利用的是宿主机的内核,**而不需要 Guest OS,节省了 Guest OS 占用的资源。 Docker 在创建一个容器时,不需要重新加载一个操作系统内核,从而避免引寻、加载操作系统内核返回时耗时耗资源的过程。虚拟机软件加载 Guest OS,返回新建过程是分钟级别的,而新建一个 Docker 容器只需要几秒钟。

    B. 资源的隔离性 与 封装程度

    虚拟机 与 容器 的架构就意味着:容器的资源隔离粒度 与 封装粒度 更细。
    虚拟机是系统级别的隔离,容器是进程级别的隔离。
    虚拟机需要打包整个操作系统,容器只需要打包项目代码和依赖信息。

    C. 环境标准化

    一次构建,随处执行。**实现执行环境的标准化发布,部署和运维。**开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 Bug 并未在开发过程中被发现,而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。

    D. 维护和扩展容易

    Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官方镜像docker hub既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

    E. 资源弹性伸缩

    根据业务情况,动态调整计算、存储、网络等硬件及软件资源

    F. 沙箱环境

    避免不安全或不稳定软件对系统安全性、稳定性造成影响,可使用虚拟化技术构建虚拟执行环境。比如:我在容器里面执行rm -rf /*不会把整个服务器搞死,也不影响其他人部署的程序使用。

  • 相关阅读:
    Unity 图片相关
    ClickHouse多种安装方式
    MongoDB系列之Linux环境部署配置
    一个基于C#开发的Excel转Json工具
    Arduino框架下STM32F1/F4系列HID模式程序烧录教程
    GD32F103ZET6奋斗者开发板W5500通信——01 基础移植
    VRRP DHCP ACL NAT 网络核心路由技术综述 (第十课)
    亚马逊国际获得AMAZON商品详情 API
    Java多线程学习入门(五):ThreadLocal以及对象内存布局
    LeetCode 1732. 找到最高海拔
  • 原文地址:https://blog.csdn.net/LU_ZE_XX/article/details/136341860