openstack预备知识---虚拟化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openstack预备知识---虚拟化相关的知识,希望对你有一定的参考价值。

一、虚拟化

1、什么是虚拟化?

    虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。

    物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。

    那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢? 

    这个主要是通过一个叫做 Hypervisor 的程序实现的。

2、虚拟化的分类

    根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种: 

    1)1型虚拟化

        Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。

    2)2型虚拟化 

        物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。

    两种类型的对比:

    1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高; 

    2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。

3、KVM

    1)基本概念

        KVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。 

        KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。

        那 IO 的虚拟化,比如存储和网络设备由谁实现呢? 

        这个就交给 Linux 内核和Qemu来实现。

        说白了,作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。 

    2)Libvirt

        Libvirt 是啥? 简单说就是 KVM 的管理工具。

        其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。 

        OpenStack 底层也使用 Libvirt。

        Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh

        libvirtd是服务程序,接收和处理 API 请求;

        API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具;

        virsh 是我们经常要用的 KVM 命令行工具,后面会有使用的示例。

    3)KVM实际操作

        a、准备KVM实验环境

        b、启动第一个虚机

        c、远程管理虚机

    4)KVM虚拟化原理

        a、CPU虚拟化

            一个 KVM 虚机在宿主机中其实是一个 qemu-kvm 进程,与其他 Linux 进程一样被调度。

        

            虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。

            虚机的 vCPU 总数可以超过物理 CPU 数量,这个叫 CPU overcommit(超配)。 

            KVM 允许 overcommit,这个特性使得虚机能够充分利用宿主机的 CPU 资源,但前提是在同一时刻,不是所有的虚机都满负荷运行。 

        b、内存虚拟化

            KVM 通过内存虚拟化共享物理系统内存,动态分配给虚拟机。

            为了在一台机器上运行多个虚拟机,KVM 需要实现 VA(虚拟内存) -> PA(物理内存) -> MA(机器内存)直接的地址转换。

            虚机 OS 控制虚拟地址到客户内存物理地址的映射 (VA -> PA),但是虚机 OS 不能直接访问实际机器内存,因此 KVM 需要负责映射客户物理内存到实际机器内存 (PA -> MA)。

        

        c、存储虚拟化

            KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。

            Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型。

            Volume 是在 Storage Pool 中划分出的一块空间,宿主机将 Volume 分配给虚拟机,Volume 在虚拟机中看到的就是一块硬盘。

             a)目录类型的 Storage Pool

             b)LVM类型的 Storage Pool

             c)其他类型的Storage Pool

        d、网络虚拟化

            a)Linux Bridge

            (a)基本概念

                假设宿主机有 1 块与外网连接的物理网卡 eth0,上面跑了 1 个虚机 VM1,现在有个问题是: 

                如何让 VM1 能够访问外网?

                至少有两种方案

                    1)将物理网卡eth0直接分配给VM1,但随之带来的问题很多: 

                        宿主机就没有网卡,无法访问了; 

                        新的虚机,比如 VM2 也没有网卡。 

                    2)推荐的方案:给 VM1 分配一个虚拟网卡 vnet0,通过 Linux Bridge br0 将 eth0 和 vnet0 连接起来

                        

                        Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。

                        多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备。

                在上面这个例子中,当有数据到达 eth0 时,br0 会将数据转发给 vnet0,这样 VM1 就能接收到来自外网的数据; 

                反过来,VM1 发送数据给 vnet0,br0 也会将数据转发到 eth0,从而实现了 VM1 与外网的通信。

            (b)动手实践虚机网络

            (c)理解virbr0

                    virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。

            b)VLAN

                LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。

                一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。

                一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。

                VLAN 表示 Virtual LAN。 

                一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。 

                计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。 

                简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。

        

                举个例子:有两组机器,Group A 和 B。 

                我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,但是 A 和 B 中的机器无法互相访问。 

                方法一:使用两个交换机,A 和 B 分别接到一个交换机。 

                方法二:使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的 VLAN 中。

                请注意: 

                VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。 

                但在三层(比如IP)上是可以通过路由器让 A 和 B 互通的。概念上一定要分清。

                

                现在的交换机几乎都是支持 VLAN 的。 

                通常交换机的端口有两种配置模式: Access 和 Trunk。

                Access 口 

                    这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 

                    不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。 

                    Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。 

                    Access 口只能属于一个 VLAN。

                Trunk 口 

                    假设有两个交换机 A 和 B。 

                    A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3 

                    那如何让 AB 上相同 VLAN 之间能够通信呢?

                    办法是将 A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。这样的端口就是Trunk口了。 

                    VLAN1、2、3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。

        

            现在看看 KVM 虚拟化环境下是如何实现 VLAN 的

            

                eth0 是宿主机上的物理网卡,有一个命名为 eth0.10 的子设备(软件实现了一个交换机(当然是虚拟的))与之相连。 

                eth0.10 就是 VLAN 设备了,其 VLAN ID 就是 VLAN 10。 

                eth0.10 挂在命名为 brvlan10 的 Linux Bridge 上,虚机 VM1 的虚拟网卡 vent0 也挂在 brvlan10 上。

     

            这样的配置其效果就是: 

            宿主机用软件实现了一个交换机(当然是虚拟的),上面定义了一个 VLAN10。 

            eth0.10,brvlan10 和 vnet0 都分别接到 VLAN10 的 Access口上。 

            而 eth0 就是一个 Trunk 口。 

            VM1 通过 vnet0 发出来的数据包会被打上 VLAN10 的标签。

            

            eth0.10 的作用是:定义了 VLAN10 

            brvlan10 的作用是:Bridge 上的其他网络设备自动加入到 VLAN10 中

            c)Linux Bridge + VLAN = 虚拟交换机


        对 KVM 的网络虚拟化做个总结。

            1、物理交换机存在多个 VLAN,每个 VLAN 拥有多个端口。 

               同一 VLAN 端口之间可以交换转发,不同 VLAN 端口之间隔离。 

               所以交换机其包含两层功能:交换与隔离。

            2、Linux 的 VLAN 设备实现的是隔离功能,但没有交换功能。 

               一个 VLAN 母设备(比如 eth0)不能拥有两个相同 ID 的 VLAN 子设备,因此也就不可能出现数据交换情况。

            3、Linux Bridge 专门实现交换功能。 

                将同一 VLAN 的子设备都挂载到一个 Bridge 上,设备之间就可以交换数据了。

            总结起来,Linux Bridge 加 VLAN 在功能层面完整模拟现实世界里的二层交换机。

                eth0 相当于虚拟交换机上的 trunk 口,允许 vlan10 和 vlan20 的数据通过;

                eth0.10,vent0 和 brvlan10 都可以看着 vlan10 的 access 口 

                eth0.20,vent1 和 brvlan20 都可以看着 vlan20 的 access 口

        

二、云计算

1、基本概念

    计算(CPU/内存)、存储和网络是 IT 系统的三类资源。 

    通过云计算平台,这三类资源变成了三个池子。 

    当需要虚机的时候,只需要向平台提供虚机的规格。 

    平台会快速从三个资源池分配相应的资源,部署出这样一个满足规格的虚机。 

    虚机的使用者不再需要关心虚机运行在哪里,存储空间从哪里来,IP是如何分配,这些云平台都搞定了。

    

    云平台是一个面向服务的架构,按照提供服务的不同分为 IaaS、PaaS 和 SaaS。 

    (1)IaaS(Infrastructure as a Service)基础设施即服务;提供的服务是虚拟机。 

    IaaS 负责管理虚机的生命周期,包括创建、修改、备份、启停、销毁等。 

    使用者从云平台得到的是一个已经安装好镜像(操作系统+其他预装软件)的虚拟机。 

    使用者需要关心虚机的类型(OS)和配置(CPU、内存、磁盘),并且自己负责部署上层的中间件和应用。 

    典型的 IaaS 例子有 AWS、Rackspace、阿里云等

    

    (2)PaaS(Platform as a Service)平台即服务;提供的服务是应用的运行环境和一系列中间件服务(比如数据库、消息队列等)。 

    使用者只需专注应用的开发,并将自己的应用和数据部署到PaaS环境中。 

    PaaS负责保证这些服务的可用性和性能。 

    典型的 PaaS 有 Google App Engine、IBM BlueMix 等

    

    (3)SaaS(Software as a Service)软件即服务;提供的是应用服务。 

    使用者只需要登录并使用应用,无需关心应用使用什么技术实现,也不需要关系应用部署在哪里。 

    SaaS的使用者通常是应用的最终用户。 

    典型的 SaaS 有 Google Gmail、Salesforce 等

    

2、云计算和openstack

    OpenStack is a cloud operating system that controls large pools of compute, storage, and networking resources throughout a datacenter, all managed through a dashboard that gives administrators control while empowering their users to provision resources through a web interface.


    以上是官网对 OpenStack 的定义,OpenStack 对数据中心的计算、存储和网络资源进行统一管理。 

    由此可见,OpenStack 针对的是 IT 基础设施,是 IaaS 这个层次的云操作系统。

以上是关于openstack预备知识---虚拟化的主要内容,如果未能解决你的问题,请参考以下文章

OpenStack

虚拟化 - 每天5分钟玩转 OpenStack

虚拟化 - 每天5分钟玩转 OpenStack

别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点

OPENSTACK学习笔记

学习—虚拟化 - 每天5分钟玩转 OpenStack