2. 云计算的落地实践(上)
本章讲解知识点
- 云计算如何落地实践
- 物理机与虚拟机
- 容器虚拟技术
- Docker 横空出世
- PaaS 时代来临
- 业界实践
<br>
1. 云计算如何落地实践
我们上一节讲了有关云计算的概念,那么我们思考一下,云计算在现实中是如何落地实践的呢?
如今云计算落地实践中,已经形成了一套有效的体系。一家公司的传统业务如数据库、计算引擎、前端等,这样业务要上云,那么首先我们需要一个 IaaS,这个 IaaS 可以租用大公司已经搭建好的框架,也可以自己搭建 IaaS,如今自己搭建 IaaS 有三种主流工具:OpenStack、VmWare 和 RedHat,这三种方式各有千秋,也正在激烈竞争,群雄逐鹿谁能笑到最后,可以拭目以待。
而 OpenStack 在个人自学与公司实践中是最常见的,我们简单介绍一下 OpenStack:
OpenStack 是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。OpenStack 为私有云和公有云提供可扩展的弹性的云计算服务。OpenStack 由多个核心项目(即 OpenStack 服务)组成:
- 计算(Compute):Nova。一套控制器,用于为单个用户或使用群组管理虚拟机实例的整个生命周期,根据用户需求来提供虚拟服务。负责虚拟机创建、开机、关机、挂起、暂停、调整、迁移、重启、销毁等操作,配置 CPU、内存等信息规格。
- 对象存储(Object Storage):Swift。一套用于在大规模可扩展系统中通过内置冗余及高容错机制实现对象存储的系统,允许进行存储或者检索文件。可为 Glance 提供镜像存储,为 Cinder 提供卷备份服务。
- 镜像服务(Image Service):Glance。一套虚拟机镜像查找及检索系统,支持多种虚拟机镜像格式(ISO、QCOW2、Raw、VMDK),有创建镜像、上传镜像、删除镜像、编辑镜像基本信息的功能。
- 身份服务(Identity Service):Keystone。为 OpenStack 其他服务提供身份验证、服务规则和服务令牌的功能,管理Domains、Projects、Users、Groups、Roles。
- 网络&地址管理(Network):Neutron。提供云计算的网络虚拟化技术,为 OpenStack 其他服务提供网络连接服务。为用户提供接口,可以定义 Network、Subnet、Router,配置 DHCP、DNS、VLAN。
- 块存储 (Block Storage):Cinder。为运行实例提供稳定的数据块存储服务,它的插件驱动架构有利于块设备的创建和管理,如创建卷、删除卷,在实例上挂载和卸载卷。
- 数据库服务(Database Service):Trove。为用户在 OpenStack 的环境提供可扩展和可靠的关系和非关系数据库引擎服务。
当我们有了 OpenStack,将其安装到集群中,集群是由多台物理服务器组成,OpenStack 将集群的硬件资源,如 CPU、内存、磁盘、网络虚拟化扔进资源池里提供给客户端使用,OpenStack 管理这些资源的申请、释放等一系列生命周期。
OpenStack 各项目间的主要关系:
这样我们就打造出一个 IaaS 层了。
接下来,公司的业务就能在 IaaS 层跑起来了吗?答案是否定的。我们要利用 IaaS 层的资源创建出虚拟机来,虚拟机就像一台物理机一样有操作系统,也可以在上面安装应用。虚拟机的实现方式是在物理计算机上运行一个虚拟化软件层,称为虚拟机管理器(VMM),也称为 hypervisor。VMM 使得多个虚拟机实例可以在同一台物理计算机上运行,同时保证它们之间互相隔离,以及对物理计算机资源的适当分配和管理。
那么在这些虚拟机上跑应用,这样有什么好处呢?
- 资源隔离:不同的业务可以在不同的虚拟机上运行,互不干扰,达到资源隔离。
- 动态伸缩:当我们不需要业务了,直接删除虚拟机,释放资源即可,十分方便。需要多少资源,就创建对应资源的虚拟机,动态伸缩性好。
- 配置灵活:一台物理机上可以运行多个虚拟机,多个虚拟机可以安装不同的操作系统,如 Linux、macos、Ubuntu。
- 易于迁移,如果物理主机 A 出现故障,A 上面的虚拟机可以迁移到物理主机 B 上去,这样不影响业务。
当我们有了虚拟机后,我们就可以在虚机上安装相关应用了。
你会发现,在虚机上安装相关应用这一步和我们在物理机上安装应用好像没什么区别,你的感觉是对的。这一步甚至根本不涉及到 PaaS 层,不要急,请跟着我的思路慢慢来。
<br>
2. 物理机与虚拟机
我们安装一个软件是个什么流程呢?来一起对比一下物理机部署和虚拟机部署:
先说物理机:
在一台物理服务器上,我们需要安装操作系统,然后布置应用,如 redis,mysql,nginx,有以下几个缺点:
- 部署慢
- 成本高
- 资源浪费
- 难以迁移和扩展
- 可能会被限定硬件厂商
由于物理机的诸多问题,后来出现了虚拟机:
一个物理机上可以部署多个虚拟机,一个虚拟机上运行一个 app。
但是虚拟机还是有局限性,我们依然要在虚拟机上安装应用,这一步花费的时间和物理机没有差别。不仅如此,如果一个虚拟机上运行一个 app,这个 app 依赖的配置和 SDK 可能很少,但是我们却要为这个 app 创建出一个完整的操作系统来,这也太浪费资源了,这样的后果是物理主机创建不了多少个虚拟机就将资源耗尽。
<br>
3. 容器虚拟技术
物理机和虚拟机都有局限,那么有人就思考了,安装应用需要依赖操作系统,一个操作系统可以安装多个应用。如果我将应用依赖的操作系统抽取出来,只跑一个应用,如 redis 和 mysql 两个数据库,对于操作系统的配置要求、SDK 依赖不一样,那么给 redis 抽取一个操作系统只包含 redis 独有的配置与 SDK 依赖,而给 mysql 抽取一个操作系统只包含 mysql 独有的配置与 SDK 依赖,那么我们就又实现了一层资源隔离,而且还节约资源了,因为不需要为一个 app 创建出完整的操作系统来。
这就是容器虚拟技术的设想。app 就像运行在一个容器里面一样。
你说会,这有啥用?仔细一思考,除了资源隔离和节约资源外确实没有太大进步。但是当结合 Union File System(联合文件系统)技术后,容器虚拟技术再也无可阻挡。在联合文件系统中,多个文件系统被按照特定的顺序进行层次化合并,形成一个虚拟的文件系统层次结构。当用户在这个虚拟的文件系统中访问文件或目录时,联合文件系统会根据预先设定的规则从各个底层文件系统中选择合适的文件或目录进行返回。在联合文件系统中,各个底层文件系统的文件和目录并不会被复制到新的文件系统中,而是通过符号链接或者其他方式进行引用,从而实现了文件系统的合并。
关于 Union File System(联合文件系统)技术会在以后章节详细展开,这里不表。
容器虚拟技术的好处
3.1. 节省资源
容器相对于虚拟机,容器只需要具备 app 运行的配置和 SDK 即可,不需要创建完整的操作系统,使用的资源大大减少。
3.2. 资源隔离
比如一个虚拟机,跑一个 app,如 redis,没什么问题。但是我想跑不同版本的 redis,那么配置是不是可能冲突,环境是不是受到了污染?
而如果换用容器技术,一个容器就是一个小操作系统,一个虚拟机上可以跑多个容器,那么轻易实现了跑不同版本的 redis,而且还资源隔离,删除容器即卸载了对应版本,是不是非常方便。
3.3. 安装时间大大缩短和灵活移植
一个容器运行了 redis,对应的系统配置和 SDK 依赖都是一样的,那么如果我能将这个容器导出成文件格式,然后再另一台虚拟机上导入运行起来,这样是不是就节省了安装时间呢?没错,容器虚拟技术结合 Union File System(联合文件系统)技术就是这么做的。
这样带来的效率提升简直无可言喻。开发以容器虚拟技术开发应用后,将其打包导出,直接交给测试,测试在自己的环境上导入并运行,直接就可以完成测试,大大缩短了应用开发周期。而测试人员完成应用测试后,将其导出,直接就可以上线工业环境,缩短了业务上线周期。
甚至将文件开源,建立容器镜像库,全世界的人都可以使用,安装应用只需要下载对应镜像即可快速安装,大大减少了学习成本。
<br>
4. Docker 横空出世
其中容器虚拟化技术以 Docker 为首,Docker 是基于 Go 语言实现的云开源项目,Docker 的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的 APP(可以是一个 WEB 应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
4.1 虚拟机技术与容器虚拟化技术对比
- 虚拟机技术需要在宿主机上安装虚拟化软件,然后在虚拟化软件上安装操作系统和应用程序。每个虚拟机都有自己的操作系统内核和资源管理器,因此虚拟机可以运行不同版本的操作系统和应用程序。容器虚拟化技术则不需要虚拟化软件,而是在宿主机的操作系统上运行,共享主机的操作系统内核。每个容器都有自己的用户空间,但共享主机的内核和系统资源。
- 虚拟机技术提供了更高的隔离性和安全性,因为每个虚拟机都运行在独立的环境中,并且可以配置不同的安全策略和网络设置。容器虚拟化技术虽然也提供了一定的隔离性,但容器之间仍然共享主机的操作系统内核和系统资源,因此容器之间可能存在潜在的安全风险。
- 虚拟机技术需要更多的资源,例如内存和处理器,因为每个虚拟机都需要运行一个完整的操作系统内核和资源管理器。容器虚拟化技术则可以共享主机的操作系统内核和系统资源,因此需要更少的资源,并且可以更高效地运行。
- 虚拟机技术通常需要更长的启动时间,因为需要启动完整的操作系统和资源管理器。容器虚拟化技术启动时间更短,因为只需要启动容器的用户空间。
<br>
5. PaaS 时代来临
容器虚拟化技术大行其道后,传统业务全部容器化,享受到容器化技术的便捷,同时问题也随之而来,当容器越来越多时,容器的管理、编排成了大难题。
容器的生命周期如何管理,容器故障如何监控,相互有依赖关系的容器如何部署等等问题。
人们发现,需要借助一个平台来管理我们的容器,PaaS 时代随之来临。PaaS 平台其中以 Kubernetes 为代表。Kubernetes,简称 K8s,是一个开源的、用于管理云平台中多个主机上的容器化的应用平台,提供了应用部署,规划,更新,维护的一种机制。Kubernetes 可以自动化应用程序的部署、扩展和管理,并提供了一种通用的方式来管理容器化应用程序。它支持多种容器运行时,包括 Docker,可以运行在公共云、私有云和混合云环境中。
<br>
6. 业界实践
搭建 IaaS 后,用于创建虚拟机,在虚拟机上部署 PaaS,用于管理同时部署在虚拟机上的容器,这就是业界普遍的云计算实践。
当然我们也可以直接在物理服务器上构建 PaaS 集群,不需要再创建虚拟机。这种方式称为裸机部署模式,这是未来云计算发展的另一种趋势,好处就在于除去了虚拟机这一层,平台性能可以提升 30%。
<br>
面试题
1. 容器技术的优势⭐⭐
- 资源利用率高:容器使用的资源非常少,容器之间可以共享操作系统的内核,避免了多个虚拟机之间资源浪费和冗余,因此相比传统虚拟化技术可以更好地利用物理服务器的资源。
- 快速启动和停止:由于容器本身就是轻量级的进程,因此容器可以非常快速地启动和停止。这使得容器技术非常适合用于动态伸缩和弹性扩展等场景。
- 隔离性强:容器之间相互隔离,不会相互干扰,保证了应用程序的稳定性和安全性。同时,容器技术提供了多种隔离机制,例如网络隔离、文件系统隔离、进程隔离等。
- 灵活性强:容器技术可以跨平台使用,支持多种操作系统和硬件架构,同时容器技术可以方便地将应用程序打包和分发,提高了应用程序的可移植性和可重复性。
- 管理和部署简单:容器技术可以很方便地实现应用程序的管理和部署,容器镜像可以轻松地进行版本控制和更新,同时容器编排工具可以实现自动化部署和运维。
2. 虚拟机技术与容器虚拟化技术对比⭐⭐
- 虚拟机技术需要在宿主机上安装虚拟化软件,然后在虚拟化软件上安装操作系统和应用程序。每个虚拟机都有自己的操作系统内核和资源管理器,因此虚拟机可以运行不同版本的操作系统和应用程序。容器虚拟化技术则不需要虚拟化软件,而是在宿主机的操作系统上运行,共享主机的操作系统内核。每个容器都有自己的用户空间,但共享主机的内核和系统资源。
- 虚拟机技术提供了更高的隔离性和安全性,因为每个虚拟机都运行在独立的环境中,并且可以配置不同的安全策略和网络设置。容器虚拟化技术虽然也提供了一定的隔离性,但容器之间仍然共享主机的操作系统内核和系统资源,因此容器之间可能存在潜在的安全风险。
- 虚拟机技术需要更多的资源,例如内存和处理器,因为每个虚拟机都需要运行一个完整的操作系统内核和资源管理器。容器虚拟化技术则可以共享主机的操作系统内核和系统资源,因此需要更少的资源,并且可以更高效地运行。
- 虚拟机技术通常需要更长的启动时间,因为需要启动完整的操作系统和资源管理器。容器虚拟化技术启动时间更短,因为只需要启动容器的用户空间。
本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总