K8S(一)虚拟化、容器化构建云计算平台的基本概念及原理解析-中间件专区论坛-技术-SpringForAll社区

K8S(一)虚拟化、容器化构建云计算平台的基本概念及原理解析

本章主题
1、认识kubernetes (k8s) 在企业中应用场景? —– 为什么要学习K8s??
2、云技术(云计算平台) — 虚拟化及虚拟化基本概念及原理
3、云技术(云计算平台) — 容器技术及容器技术基本概念及原理


前言

k8s 偏向运维技术 ,后端程序员为什么要学习k8s??

  • 1、以前项目开发:开发,运维是密不可分 — 上线 运维,开发密不可分
  • 2、开发&运维 结合更紧密 — DevOps — 流水线生产方式

公司对程序员要求:

  • 高级程序员(研发公司):
    1、应用发布 (linux) — CI/CD — k8s
    2、运维
    3、线上故障排查能力
  • 技术主管:
    运维能力(熟练)
  • 技术专家:
    运维能力(精通)

未来展望:

  • 1、所有的项目都是流水线生产方式 —- 降本增效
  • 2、所有的项目都是容器化方式进行部署 — 迁移,充分利用服务器资源
  • 3、k8s对项目开发架构有影响,对项目架构有新的一些思考–serverless
    技术方向:容器编排技术非常火,成为当下项目开发流水线生产一个技术标准。(程序员必须了解,认识,精通)

普及程度:

  • 1、一线城市很多公司都已经普及,构建了自己公司私有云环境。(阿里云,网易云…)
  • 2、还有很多公司没有普及:k8s非常难,学习曲线非常陡峭…

认识kubernetes (k8s) 在企业中应用场景?—-为什么要学习k8s?

  • 1、互联网企业可以利用k8s构建一套自动化的运维平台(运维工作:自愈、自动伸缩……) —- 降本增效
  • 2、互联网企业,有很多服务器资源(物理机),为了充分利用服务器资源,使用k8s构建私有云环境,项目运行在云。
  • 3、项目开发中,产品需求不停的迭代,更新(产品)— 意味着项目不停的发布新的版本 — k8s可以实现项目从开发到生产无缝迁移。

一、虚拟化

1. 虚拟化基本概念及原理

1.1 什么是虚拟化

在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

虚拟化技术是一套解决方案。完整的情况需要CPU、主板芯片组、BIOS和软件的支持,例如VMM软件或者某些操作系统本身。即使只是CPU支持虚拟化技术,在配合VMM的软件情况下,也会比完全不支持虚拟化技术的系统有更好的性能。

在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件对资源充分利用

虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。

虚拟化(英语:Virtualization)是一种资源管理技术,就是用来把物理资源(服务器,网络,硬件,CPU)进行隔离(分离)的一种技术。打破了物理资源不可分割障碍。

1.2 虚拟化作用

1.2.1 对高性能物理计算机的资源进行充分利用

把性能强的物理机拆成多个虚拟机,每个虚拟机之间都是隔离的:
在这里插入图片描述
自己的应用只占用一台虚拟机资源即可,压力大的话也可以占用多台:
在这里插入图片描述

如果没有虚拟机化技术,在使用高性能计算机时候,存在大量的计算资源的浪费。使用虚拟化技术对物理资源进行隔离,把隔离的资源进行分配使用。虚拟化技术实际上就是对物理硬件资源的一种调度。

1.2.2 对老旧硬件资源重组后再充分利用

将老旧、性能低的多台服务器重组成高性能的云计算平台,提供分布式计算服务
在这里插入图片描述

1.3 虚拟化分类

1.3.1 全虚拟化架构

虚拟机的监视器(hypervisor)是类似于用户的应用程序运行在主机的OS之上,如VMware的workstation,这种虚拟化产品提供了虚拟的硬件。
在这里插入图片描述

Hardware Layer:硬件层
Host OS:操作系统层
Virtual Machine Manager:虚拟机管理器
VM Management Software:虚拟机管理软件
Virtual Hardware:虚拟硬件
Guest OS:用户操作系统

此架构是建立在操作系统上的

1.3.2 OS层虚拟化架构

在这里插入图片描述

Hardware Layer:硬件层
Host OS:操作系统层
Virtualization Layer:虚拟化层

docker容器化就是这种

1.3.3 硬件层虚拟化

在这里插入图片描述

Hardware Layer:硬件层
Virtual Machine Manager:虚拟机管理器
Guest OS:用户操作系统

直接在硬件层上虚拟化

硬件层的虚拟化具有高性能和隔离性,因为hypervisor直接在硬件上运行,有利于控制VM的OS访问硬件资源,使用这种解决方案的产品有VMware ESXi 和 Xen server

Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor,VMM)。

Hypervisor是所有虚拟化技术的核心,非中断的支持多工作负载迁移是hypervisor的基本功能。当服务器启动并执行Hypervisor时,会给每一台虚拟机分配适量的内存、CPU、网络和磁盘资源,并加载所有虚拟机的客户操作系统。

Hypervisor是所有虚拟化技术的核心,让软硬件架构和管理更高效、更灵活,硬件的效能能够更好地发挥出来。常见的产品有:VMware、KVM、Xen等等

注意:资源隔离实际上使用的调度程序,把这些资源调度分配给os,这个调度程序叫hypervisor

2. 虚拟化技术 —(构建云计算平台)

目前你认为有几种方式构建云计算平台???

  • 物理机构建云计算机平台(机房建设,硬件选择,网络建设,环境维护…)
  • 虚拟化技术构建云计算平台
    • OpenStack:
      • 开源管理项目 OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目.
      • 美国国家航天局 & RackSpace 开发 ,开源
        作用: 提供云平台的基础设施服务,让云平台管理,架构变得更简单。
    • KVM(Kernel-based Virtual Machine)基于linux内核的虚拟机
      • KVM 虚拟机技术,已经融入到linux内核。
    • VMWare
      • VMWare (Virtual Machine ware)是一个“虚拟PC”虚拟机管理管理软件

2.1 OpenStack

OpenStack:开源管理项目 OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它不是一个软件,而是由几个主要的组件组合起来完成一些具体的工作。OpenStack由以下五个相对独立的组件构成:

  • OpenStack Compute(Nova)是一套控制器,用于虚拟机计算或使用群组启动虚拟机实例;
  • OpenStack镜像服务(Glance)是一套虚拟机镜像查找及检索系统,实现虚拟机镜像管理;
  • OpenStack对象存储(Swift)是一套用于在大规模可扩展系统中通过内置冗余及容错机制,以对象为单位的存储系统,类似于Amazon S3;
  • OpenStack Keystone,用于用户身份服务与资源管理
  • OpenStack Horizon,基于Django的仪表板接口,是个图形化管理前端。

这个起初由美国国家航空航天局和Rackspace在2010年末合作研发的开源项目,旨在打造易于部署、功能丰富且易于扩展的云计算平台。OpenStack项目的首要任务是简化云的部署过程并为其带来良好的可扩展性,企图成为数据中心的操作系统,即云操作系统。

Openstack项目层级关系:
在这里插入图片描述

  • 第一层是基础设施层,这一层主要包含Nova、Glance和Keystone,如果我们要想得到最基本的基础设施的服务,必须安装部署这三个项目。
  • 第二层是扩展基础设施层,这一层可以让我们得到更多跟基础设施相关的高级服务,主要包含Cinder、Swift、Neutron、Designate和Ironic等,其中Cinder提供块存储,Swift提供对象存储,Neutron提供网络服务,Designate提供DNS服务,Ironic提供裸机服务。
  • 第三层是可选的增强特性,帮用户提供一些更加高级的功能,主要包含Ceilometer、Horizon和Barbican,其中Ceilometer提供监控、计量服务,Horizon提供用户界面,Barbican提供秘钥管理服务。
  • 第四层主要是消费型服务,所谓的消费型服务,主要是指第四层的服务都需要通过使用前三层的服务来工作。 第四层主要有Heat、Magnum、Sahara、Solum和Murano等,其中Heat主要提供orchestration服务,Magnum主要提供容器服务,Sahara主要提供大数据服务,我们可以通过Sahara很方便地部署Hadoop、Spark集群。Solum主要提供应用开发的服务,并且可以提供一些类似于CI/CD的功能。Muarno主要提供应用目录的服务,类似于App Store,就是用户可以把一些常用的应用发布出来供其他用户去使用。最右边是Kolla,Kolla的主要功能是容器化所有的OpenStack服务,便于OpenStack安装部署和升级。

2.2 KVM

KVM(Kernel-based Virtual Machine)基于内核的虚拟机 KVM是集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。 KVM最大的好处就在于它是与Linux内核集成的,所以速度很快。
在这里插入图片描述

2.3 VMWARE

VMWare (Virtual Machine ware)是一个“虚拟PC”虚拟机管理软件。它的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。

与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就象标准Windows应用程序那样切换。而且每个操作系统你都可以进行虚拟的分区、配置而不影响真实硬盘的数据,你甚至可以通过网卡将几台虚拟机用网卡连接为一个局域网,极其方便。安装在VMware操作系统性能上比直接安装在硬盘上的系统低不少,因此,比较适合学习和测试。


二、容器化(容器技术基本概念及原理)

有了虚拟化技术,为什么还需要使用容器化技术构建云计算平台??

  • KVM虚拟化在同等CPU,内存,IO,网络,运行相同服务,占用资源非常大。
  • 容器化技术 就是非常轻量级资源隔离技术,容器化镜像小道几KB,达到几百M,隔离性没有虚拟机彻底

1. 容器发展史

1.1 Chroot

容器技术的概念可以追溯到1979年的UNIX Chroot。这项功能将Root目录及其它子目录变更至文件系统内的新位置,且只接受特定进程的访问,其设计目的在于为每个进程提供一套隔离化磁盘空间。1982年其被添加至BSD。
在这里插入图片描述

chroot只是提供了对进程文件目录虚拟化的功能,不能够防止进程恶意访问系统。这个问题在FreeBSDGails容器技术中得以解决

根据目录来进行隔离

1.2 FreeBSD Jails

FreeBSD Jails与Chroot的定位类似,不过其中包含有进程沙箱机制以对文件系统、用户及网络等资源进行隔离。通过这种方式,它能够为每个Jail、定制化软件安装包乃至配置方案等提供一个对应的IP地址。Jails技术为FreeBSD系统提供了一种简单的安全隔离机制。它的不足在于这种简单性的隔离也同时会影响Jails中应用访问系统资源的灵活性。
在这里插入图片描述

给目录分配一个网络地址,可以对目录进行隔离。

1.3 Solaris Zones

Solaris Zone技术为应用程序创建了虚拟的一层,让应用在隔离的Zone中运行,并实现有效的资源管理。每一个Zone 拥有自己的文件系统,进程空间,防火墙,网络配置等等。

Solaris Zone技术真正的引入了容器资源管理的概念。在应用部署的时候为Zone配置一定的资源,在运行中可以根据Zone的负载动态修改这个资源限制并且是实时生效的,在其他Zone不需要资源的时候,资源会自动切换给需要的资源的Zone,这种切换是即时的不需要人工干预的,最大化资源的利用率,在必要的情况下,也可以为单个Zone隔离一定的资源。
在这里插入图片描述

已经实现了隔离,每一个空间都有独立存储,网络,防火墙.

1.4 LXC

LXC指代的是Linux Containers,其功能通过Cgroups以及Linux Namespaces实现。也是第一套完整的Linux容器管理实现方案。在LXC出现之前, Linux上已经有了类似 Linux-Vserver、OpenVZ 和 FreeVPS。虽然这些技术都已经成熟,但是这些解决方案还没有将它们的容器支持集成到主流 Linux 内核。相较于其它容器技术,LXC能够在无需任何额外补丁的前提下运行在原版Linux内核之上。目前LXC项目由Canonical有限公司负责赞助及托管。

在这里插入图片描述

lxc底层通过Cgroups以及Linux Namespaces实现,是基于进程资源的隔离,不是物理资源的隔离,隔离的模式没有虚拟化技术隔离的更彻底。

1.5 Docker(2013)

Docker项目最初是由一家名为DotCloud的平台即服务厂商所打造,其后该公司更名为Docker。Docker在起步阶段使用LXC,而后利用自己的Libcontainer库将其替换下来。与其它容器平台不同,Docker引入了一整套与容器管理相关的生态系统。其中包括一套高效的分层式容器镜像模型、一套全局及本地容器注册表、一个精简化REST API以及一套命令行界面等等。

与Docker具有同样目标功能的另外一种容器技术就是CoreOS公司开发的Rocket. Rocket基于App Container规范并使其成为一项更为开放的标准。
在这里插入图片描述

docker底层就是LXC,虽然后来换成Libcontainer,但其底层还是通过Cgroups以及Linux Namespaces实现

2. Docker容器

2.1 Docker历史

2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。
在这里插入图片描述
这家公司主要提供基于PaaS的云计算技术服务。具体来说,是和LXC有关的容器技术。LXC,就是Linux容器虚拟技术(Linux container)、后来,dotCloud公司将自己的容器技术进行了简化和标准化,并命名为——Docker。

Docker技术诞生之后,并没有引起行业的关注。而dotCloud公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。

什么是“开源”?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。(Open Source,开源)

有的软件是一开始就开源的。也有的软件,是混不下去,创造者又不想放弃,所以选择开源。自己养不活,就吃“百家饭”嘛。

2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源。

不开则已,一开惊人。

越来越多的IT工程师发现了Docker的优点,然后蜂拥而至,加入Docker开源社区。

Docker的人气迅速攀升,速度之快,令人瞠目结舌。

开源当月,Docker 0.1版本发布。此后的每一个月,Docker都会发布一个版本。到2014年6月9日,Docker 1.0版本正式发布。

此时的Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像Google、微软、Amazon、VMware这样的巨头,都对它青睐有加,表示将全力支持。

Docker火了之后,dotCloud公司干脆把公司名字也改成了Docker Inc。

Docker和容器技术为什么会这么火爆?说白了,就是因为它“轻”。

2.2 Docker原理

容器是一种轻量级的虚拟化技术,因为它跟虚拟机比起来,它少了一层 hypervisor 层。先看一下下面这张图,这张图简单描述了一个容器的启动过程。

在这里插入图片描述
最下面是一个磁盘,容器的镜像是存储在磁盘上面的。上层是一个容器引擎,容器引擎可以是 docker,也可以是其它的容器引擎。引擎向下发一个请求,比如说创建容器,这时候它就把磁盘上面的容器镜像运行成在宿主机上的一个进程。

对于容器来说,最重要的是怎么保证这个进程所用到的资源是被隔离和被限制住的,在 Linux 内核上面是由 cgroup 和 namespace 这两个技术来保证的

docker是基于cgroup、namespace 进程隔离的技术

容器 = cgroup + namespace + rootfs + 容器引擎

  • Cgroup: 资源控制
  • namespace: 访问隔离
  • rootfs:文件系统隔离。镜像的本质就是一个rootfs文件
  • 容器引擎:生命周期控制

2.3 Cgroup

Cgroup 是 Control group 的简称,是 Linux 内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用。对不同资源的具体管理是由各个子系统分工完成的。
在这里插入图片描述
Cgroup 可以对进程进行任意分组,如何分组由用户自定义。

子系统介绍:

2.3.1 cpuset 子系统

cpuset 可以为一组进程分配指定的CPU和内存节点。 cpuset 一开始用在高性能计算上,在 NUMA(non-uniform memory access) 架构的服务器上,通过将进程绑定到固定的 CPU 和内存节点上,来避免进程在运行时因跨节点内存访问而导致的性能下降。

cpuset 的主要接口如下:

  • cpuset.cpus: 允许进程使用的CPU列表
  • cpuset.mems: 允许进程使用的内存节点列表

2.3.2 cpu 子系统

cpu 子系统用于限制进程的 CPU 利用率。具体支持三个功能
第一,CPU 比重分配。使用 cpu.shares 接口。
第二,CPU 带宽限制。使用 cpu.cfs_period_us 和 cpu.cfs_quota_us 接口。
第三, 实时进程的 CPU 带宽限制。使用 cpu_rt_period_us 和 cpu_rt_quota_us 接口。

2.3.3 cpuacct 子系统

统计各个 Cgroup 的 CPU 使用情况,有如下接口:

  • cpuacct.stat: 报告这个 Cgroup 在用户态和内核态消耗的 CPU 时间,单位是 赫兹
  • cpuacct.usage: 报告该 Cgroup 消耗的总 CPU 时间。
  • cpuacct.usage_percpu:报告该 Cgroup 在每个 CPU 上的消耗时间。

2.3.4 memory 子系统

限制 Cgroup 所能使用的内存上限。

  • memory.limit_in_bytes:设定内存上限,单位字节。
    默认情况下,如果使用的内存超过上限,Linux 内核会试图回收内存,如果这样仍无法将内存降到限制的范围内,就会触发 OOM,选择杀死该Cgroup 中的某个进程。
  • memory.memsw,limit_in_bytes: 设定内存加上交换内存区的总量。
  • memory.oom_control: 如果设置为0,那么内存超过上限时,不会杀死进程,而是阻塞等待进程释放内存;同时系统会向用户态发送事件通知。
  • memory.stat: 报告内存使用信息。

2.3.5 blkio 子系统

限制 Cgroup 对 阻塞 IO 的使用。

  • blkio.weight: 设置权值,范围在[100, 1000],属于比重分配,不是绝对带宽。因此只有当不同 Cgroup 争用同一个 阻塞设备时才起作用
  • blkio.weight_device: 对具体设备设置权值。它会覆盖上面的选项值。
  • blkio.throttle.read_bps_device: 对具体的设备,设置每秒读磁盘的带宽上限。
  • blkio.throttle.write_bps_device: 对具体的设备,设置每秒写磁盘的带宽上限。
  • blkio.throttle.read_iops_device: 对具体的设备,设置每秒读磁盘的IOPS带宽上限。
  • blkio.throttle.write_iops_device: 对具体的设备,设置每秒写磁盘的IOPS带宽上限。

2.3.6 devices 子系统

控制 Cgroup 的进程对哪些设备有访问权限

  • devices.list: 只读文件,显示目前允许被访问的设备列表,文件格式为
    类型[a|b|c] 设备号[major:minor] 权限[r/w/m 的组合]
    a/b/c 表示 所有设备、块设备和字符设备。
  • devices.allow: 只写文件,以上述格式描述允许相应设备的访问列表。
  • devices.deny: 只写文件,以上述格式描述禁止相应设备的访问列表。

2.4 NameSpace

Namespace 是将内核的全局资源做封装,使得每个namespace 都有一份独立的资源,因此不同的进程在各自的namespace内对同一种资源的使用互不干扰。

举个例子,执行sethostname这个系统调用会改变主机名,这个主机名就是全局资源,内核通过 UTS Namespace可以将不同的进程分隔在不同的 UTS Namespace 中,在某个 Namespace 修改主机名时,另一个 Namespace 的主机名保持不变。

目前,Linux 内核实现了6种 Namespace。
在这里插入图片描述
与命名空间相关的三个系统调用:

  • clone:创建全新的Namespace,由clone创建的新进程就位于这个新的namespace里。创建时传入 flags参数,可选值有 CLONE_NEWIPC, CLONE_NEWNET, CLONE_NEWNS, CLONE_NEWPID, CLONE_NEWUTS, CLONE_NEWUSER, 分别对应上面六种namespace。
  • unshare:为已有进程创建新的namespace。
  • setns:把某个进程放在已有的某个namespace里。

namespace 是用来做资源隔离的,在 Linux 内核上有七种 namespace,docker 中用到了前六种。第七种 cgroup namespace 在 docker 本身并没有用到,但是在 runC 实现中实现了 cgroup namespace(即在运行状态用到了cgroup namespace)
在这里插入图片描述

  • 第一个是 mout namespace。mout namespace 就是保证容器看到的文件系统的视图,是容器镜像提供的一个文件系统,也就是说它看不见宿主机上的其他文件,除了通过 -v 参数 bound 的那种模式,是可以把宿主机上面的一些目录和文件,让它在容器里面可见的;

    隔离文件挂载点,每个进程能看到的文件系统都记录在/proc/$$/mounts里。在一个 namespace 里挂载、卸载的动作不会影响到其他 namespace。

  • 第二个是 uts namespace,这个 namespace 主要是隔离了 hostname 和 domain;

    UTS namespace 对主机名和域名进行隔离。为什么要隔离主机名?因为主机名可以代替IP来访问。如果不隔离,同名访问会出冲突。

  • 第三个是 pid namespace,这个 namespace 是保证了容器的 init 进程是以 1 号进程来启动的;

    隔离进程号,不同namespace 的进程可以使用相同的进程号。
    当创建一个 PID namespace 时,第一个进程的PID 是1,即 init 进程。它负责回收所有孤儿进程的资源,所有发给 init 进程的信号都会被屏蔽。

  • 第四个是网络 namespace,除了容器用 host 网络这种模式之外,其他所有的网络模式都有一个自己的 network namespace 的文件;

    隔离网络资源。每个 namespace 都有自己的网络设备、IP、路由表、/proc/net 目录、端口号等。网络隔离可以保证独立使用网络资源,比如开发两个web 应用可以使用80端口。
    新创建的 Network namespace 只有 loopback 一个网络设备,需要手动添加网络设备。

  • 第五个是 user namespace,这个 namespace 是控制用户 UID 和 GID 在容器内部和宿主机上的一个映射,不过这个 namespace 用的比较少;

    隔离用户和用户组。它的厉害之处在于,可以让宿主机上的一个普通用户在 namespace 里成为 0 号用户,也就是 root 用户。这样普通用户可以在容器内“随心所欲”,但是影响也仅限在容器内。

  • 第六个是 IPC namespace,这个 namespace 是控制了进程间通信的一些东西,比方说信号量;

    Linux 提供很多种进程通信机制,IPC namespace 针对 System V 和 POSIX 消息队列,这些 IPC 机制会使用标识符来区别不同的消息队列,然后两个进程通过标识符找到对应的消息队列。
    IPC namespace 使得 相同的标识符在两个 namespace 代表不同的消息队列,因此两个namespace 中的进程不能通过 IPC 来通信。

  • 第七个是 cgroup namespace,用 cgroup namespace 带来的一个好处是容器中看到的 cgroup 视图是以根的形式来呈现的,这样的话就和宿主机上面进程看到的 cgroup namespace 的一个视图方式是相同的;另外一个好处是让容器内部使用 cgroup 会变得更安全。

2.5 rootfs

rootfs 代表一个 Docker 容器在启动时(而非运行后)其内部进程可见的文件系统视角,或者叫 Docker 容器的根目录。

先来看一下,Linux 操作系统内核启动时,内核会先挂载一个只读的 rootfs,当系统检测其完整性之后,决定是否将其切换到读写模式。

Docker 沿用这种思想,不同的是,挂载rootfs 完毕之后,没有像 Linux 那样将容器的文件系统切换到读写模式,而是利用联合挂载技术,在这个只读的 rootfs 上挂载一个读写的文件系统,挂载后该读写文件系统空空如也。Docker 文件系统简单理解为:只读的 rootfs + 可读写的文件系统。

假设运行了一个 Ubuntu 镜像,其文件系统简略如下
在这里插入图片描述
在容器中修改用户视角下文件时,Docker 借助 COW(copy-on-write) 机制节省不必要的内存分配。

三、Docker&KVM&OpenStack比较

1. Docker&KVM

VM 利用 Hypervisor 虚拟化技术来模拟 CPU、内存等硬件资源,这样就可以在宿主机上建立一个 Guest OS,这是常说的安装一个虚拟机。
在这里插入图片描述
每一个 Guest OS 都有一个独立的内核,比如 Ubuntu、CentOS 甚至是 Windows 等,在这样的 Guest OS 之下,每个应用都是相互独立的,VM 可以提供一个更好的隔离效果。但这样的隔离效果需要付出一定的代价,因为需要把一部分的计算资源交给虚拟化,这样就很难充分利用现有的计算资源,并且每个 Guest OS 都需要占用大量的磁盘空间,比如 Windows 操作系统的安装需要 1030G 的磁盘空间,Ubuntu 也需要 56G,同时这样的方式启动很慢。正是因为虚拟机技术的缺点,催生出了容器技术。

容器是针对于进程而言的,因此无需 Guest OS,只需要一个独立的文件系统提供其所需要文件集合即可。所有的文件隔离都是进程级别的,因此启动时间快于 VM,并且所需的磁盘空间也小于 VM。当然了,进程级别的隔离并没有想象中的那么好,隔离效果相比 VM 要差很多。

总体而言,容器和 VM 相比,各有优劣,因此容器技术也在向着强隔离方向发展。

Docker提供了一种程序运行的容器,同时保证这些容器相互隔离。虚拟机也有类似的功能,但是它通过Hypervisor创建了一个完整的操作系统栈。不同于虚拟机的方式,Docker依赖于Linux自带的LXC(Linux Containers)技术。LXC利用了Linux可以对进程做内存、CPU、网络隔离的特性。Docker镜像不需要新启动一个操作系统,因此提供了一种轻量级的打包和运行程序的方式。而且Docker能够直接访问硬件,从而使它的I/O操作比虚拟机要快得多。

疑问:

Docker可以直接跑在物理服务器上,这引起大家的疑问:假如已经用了Docker,还有必要使用OpenStack吗?

Docker和KVM的性能测试对比图表。和预期的一样,启动KVM和Docker容器的时间差异非常显著,而且在内存和CPU利用率上,双方差距非常大,如下表所示。
在这里插入图片描述
双方巨大的性能差异,导致了在相同工作负载下,KVM需要更多的CPU和内存资源,导致成本上升。

2. KVM&openstack

在这里插入图片描述
openstack是云管理平台,其本身并不提供虚拟化功能,真正的虚拟化能力是由底层的hypervisor(如KVM、Qemu、Xen等)提供。所谓管理平台,就是为了方便使用而已。如果没有openstack,一样可以通过virsh、virt-manager来实现创建虚拟机的操作,只不过敲命令行的方式需要一定的学习成本,对于普通用户不是很友好。

KVM是最底层的hypervisor,是用来模拟CPU的运行,然而一个用户能在KVM上完成虚拟机的操作还需要network及周边的I/O支持,所以便借鉴了qemu进行一定的修改,形成qemu-kvm。但是openstack不会直接控制qemu-kvm,会用一个libvirt的库去间接控制qemu-kvm。qemu-kvm的地位就像底层驱动来着。

OpenStack:开源管理项目

OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它不是一个软件,而是由几个主要的组件组合起来完成一些具体的工作。OpenStack由以下五个相对独立的组件构成:

  • OpenStack Compute(Nova)是一套控制器,用于虚拟机计算或使用群组启动虚拟机实例;
  • OpenStack镜像服务(Glance)是一套虚拟机镜像查找及检索系统,实现虚拟机镜像管理;
  • OpenStack对象存储(Swift)是一套用于在大规模可扩展系统中通过内置冗余及容错机制,以对象为单位的存储系统,类似于Amazon S3;
  • OpenStack Keystone,用于用户身份服务与资源管理以及
  • OpenStack Horizon,基于Django的仪表板接口,是个图形化管理前端。

这个起初由美国国家航空航天局和Rackspace在2010年末合作研发的开源项目,旨在打造易于部署、功能丰富且易于扩展的云计算平台。OpenStack项目的首要任务是简化云的部署过程并为其带来良好的可扩展性,企图成为数据中心的操作系统,即云操作系统。

KVM:开放虚拟化技术

KVM(Kernel-based Virtual Machine)是一个开源的系统虚拟化模块,它需要硬件支持,如Intel VT技术或者AMD V技术,是基于硬件的完全虚拟化,完全内置于Linux。

2008年,红帽收购Qumranet获得了KVM技术,并将其作为虚拟化战略的一部分大力推广,在2011年发布RHEL6时支持KVM作为唯一的hypervisor。KVM主打的就是高性能、扩展性、高安全,以及低成本。

与Linux的缘分

一个被某些热心支持者成为云时代的Linux,是公有云与私有云的开源操作系统。一个则是Linux内核的一部分,将Linux转换成一个Type-1 hypervisor,无需任何变更就能享受现有的Linux内核进程调度、内存管理和设备支持。

OpenStack炙手可热,它如同Linux一样,旨在构建一个内核,所有的软件厂商都围绕着它进行工作。OpenStack的许多子项目,对云计算平台中的各种资源(如计算能力、存储、网络)提供敏捷管理。此外,OpenStack也提供对虚拟化技术的支持。

KVM集成在Linux的各个主要发行版本中,使用Linux自身的调度器进行管理。KVM专注于成为最好的虚拟机监控器,是使用Linux企业的不二选择,加上它还支持Windows平台,所以也是异构环境的最佳选择。

OpenStack与KVM都发展迅猛

OpenStack是一个拥有众多支持者的大项目。时至今日,已经有超过180家企业和400多位开发人员对这一项目积极地做着贡献,而其生态系统甚至更为庞大,已经超过了5600人和850家机构。在今年9月,OpenStack基会正式成立。白金会员有红帽、IBM与惠普等,黄金会员包括思科、戴尔与英特尔等。

OpenStack基本上是一个软件项目,有近55万行代码。分解成核心项目、孵化项目,以及支持项目和相关项目。除了以上提及的五大组成,与虚拟网络有关的Quantum首次被列为核心项目。

KVM是一个脱颖而出的开放虚拟化技术。它是由一个大型的、活跃的开放社区共同开发的,红帽、IBM、SUSE等都是其成员。2011年,IBM、红帽、英特尔与惠普等建立开放虚拟化联盟(OVA),帮助构建KVM生态系统,提升KVM采用率。如今,OVA已经拥有超过250名成员公司,其中,IBM有60多位程序员专门工作于KVM开源社区。

3. Docker&openstack

OpenStack和Docker之间是很好的互补关系。Docker的出现能让IaaS层的资源使用得更加充分,因为Docker相对虚拟机来说更轻量对资源的利用率会更加充分;
在这里插入图片描述

云平台提供一个完整管理数据中心的解决方案,至于用哪种hypervisor或container只是云平台中的一个小部分。像OpenStack这样的云平台包含了多租户的安全、隔离、管理、监控、存储、网络等其他部分。云数据中心的管理需要很多服务支撑,但这和用Docker还是KVM其实没多大关系。

Docker不是一个全功能的VM, 它有很多严重的缺陷,比如安全、Windows支持,因此不能完全替代KVM。现在Docker社区一直在弥补这些缺陷,当然这会带来一定的性能损耗。

4. 总结

  • openstack 主要用于云计算平台管理,同时提供一些基础设施一些管理服务。
  • KVM 虚拟化技术 — 可以利用虚拟化技术构建云计算平台
  • docker 和 openstack 可以形成优势互补。
    docker是一个非常轻量级的容器技术,使用容器技术构建云平台,充分利用服务资源,性能非常高
    OpenStack可以管理基础设置服务。基础设施服务构建交给openstack

 

原文:https://blog.csdn.net/weixin_41947378/category_10426192.html

请登录后发表评论

    没有回复内容