企业级虚拟化Virtualization - KVM技术

Posted struggle-1216

tags:

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

1、什么是虚拟化和虚拟机

1、虚拟化

(1)虚拟化是为一些组件(例如虚拟应用、服务器、存储和网络)创建基于软件的(或虚拟)表现形式的过程。它是降
低所有规模企业的 IT 开销,同时提高其效率和敏捷性的最有效方式。

(2)虚拟化可以提高 IT 敏捷性、灵活性和可扩展性,同时大幅节约成本。更高的工作负载移动性、更高的性能和资源
可用性、自动化运维 - 这些都是虚拟化的优势,虚拟化技术可以使 IT 部门更轻松地进行管理以及降低拥有成本和运
维成本。其他优势包括:

降低资金成本和运维成本。
最大限度减少或消除停机。
提高 IT 部门的工作效率、效益、敏捷性和响应能力。
加快应用和资源的调配速度。
提高业务连续性和灾难恢复能力。
简化数据中心管理。
真正的 Software-Defined Data Center 的可用性。

2、虚拟机  

虚拟计算机系统称为“虚拟机”(VM),它是一种严密隔离且内含操作系统和应用的软件容器。每个自包含虚拟机都是
完全独立的。通过将多台虚拟机放置在一台计算机上,可仅在一台物理服务器或“主机”上运行多个操作系统和应用,
名为“hypervisor”的精简软件层可将虚拟机与主机分离开来,并根据需要为每个虚拟机动态分配计算资源。

虚拟机的主要特性:

1、分区
可在一台物理机上运行多个操作系统。
可在虚拟机之间分配系统资源。

2、隔离
可在硬件级别进行故障和安全隔离。
可利用高级资源控制功能保持性能。

3、封装
可将虚拟机的完整状态保存到文件中。
移动和复制虚拟机就像移动和复制文件一样轻松。

4、独立于硬件
可将任意虚拟机调配或迁移到任意物理服务器上。

2、云计算

云计算是概念最早是由Google 前首席执行官埃里克•施密特(Eric Schmidt)在2006 年8 月9 日的搜索引擎大会上首次提出的一种构想,而“云计算”就是这种构想的代名词,

云计算以虚拟化为基础,以网络为中心,为用户提供安全、快速、便捷的数据存储和网络计算服务,包括所需要的硬件、平台、软件及服务等资源,而提供资源的网络就被称为“云”。

1、云计算分类:

公有云:比如aws、阿里云以及azure、金山云、腾讯云等都属于公有云,每个人都可以付费使用,不需要自己关心
底层硬件,但是数据安全需要考利。
私有云:在自己公司内部或IDC自建Openstack、VMware等环境
混合云:既要使用公有云,又要使用私有云,即自己的私有云的部分业务和公有云有交接,这部分称为混合云

2、云计算分层 

IaaS:基础设施服务,Infrastructure-as-a-service #自建机房 PaaS:平台服务,Platform-as-a-service #公有云上的Redis、RDS等服务,
甚至是手机上的APP SaaS:软件服务,Software-as-a-service #企业邮箱、OA系统等。

技术图片

3、虚拟化技术分类

1、模拟器:在一个host之上通过虚拟化模拟器软件,模拟出一个硬件或者多个硬件环境,每个环境都是一个独立的虚拟机,CPU、IO、内存等都是模拟出来的,可以在宿主机模拟出不同于当前物理机CPU指令集的虚拟机,比如可以在Windows 模拟出mac OS、unix系统,比较出名的模拟器有:pearpc、QEMU、Bochs。

2、全虚拟机化/准虚拟化:full virtualization/native virtualization,全虚拟化不做CPU和内存模拟,只对CPU和内存做相应的分配等操作,完全虚拟化需要物理硬件的支持,比如需要CPU必须支持并且打开虚拟化功能,例如Intel的 Intel VT-X/EPT,AMD的AMD-V/RVI,以在CPU 层面支持虚拟化功能和内存虚拟化技术,因此完全虚拟化是基于硬件辅助的虚拟化技术,vmware workstation、vmware esxi、paralles desktop、KVM、Microsoft Hyper-V。

3、半虚拟化:para virtualization,半虚拟化要求guest OS 的内核是知道自己运行在虚拟化环境当中的,因此guestOS的系统架构必须和宿主机的系统架构相同,并且要求对guest OS的内核做相应的修改,因此半虚拟化只支持开源内核的系统,不支持闭源的系统,比较常见的半虚拟化就是早期版本的XEN,但是Xen 从其3.0 版本开始,可以支持利用硬件虚拟化技术的支持(http://www-archive.xenproject.org/files/xen_3.0_datasheet.pdf),实现了完全虚拟化,可以在其平台上不加修改的直接运行如Linux/Windows 等系列的操作系统,使得系统具备了更好的兼容性。
技术图片

hypervisor类型 

直接运行到物理机:vmware esxi、rhev hypervisor

需要运行到操作系统:KVM,XEN,vmware workstation

4、KVM的介绍、准备工作和qemu-kvm 命令详解

1、KVM介绍

(1)介绍

  KVM:就是Keyboard Video Mouse的缩写。KVM 交换机通过直接连接键盘、视频和鼠标 (KVM) 端口,让您能够访问和控制计算机。KVM 技术无需目标服务器修改软件。这就意味着可以在 Windows 的 Bios 环境下,随时访问目标计算机。KVM 提供真正的主板级别访问,并支持多平台服务器和串行设备。

  KVM 技术已经从最初的基础SOHO办公型,发展成为企业 IT 基础机房设施管理系统。可以从kvm 客户端管理软件轻松的直接访问位于多个远程位置的服务器和设备。KVM over IP 解决方案具备完善的多地点故障转移功能、符合新服务器管理标准 (IPMI) 的直接界面,以及将本地存储媒体映射至远程位置的功能。

  KVM 是个"怪胎",原本是类型2 的主机虚拟化;但一旦在OS 上加载了kvm.ko 模块,就会"感染"OS,使其变为hypervisor(kvm),原本的软件空间作为控制台,转化成类型1 模式的主机虚拟化。

技术图片

(2)KVM的组件

① kvm.ko:模块

  API 应用程序编程接口

② qemu-kvm:用户空间的工具程序;

  qemu-KVM是一种开源虚拟器,它为KVM管理程序提供硬件仿真。

   运行中的一个kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数即能完成虚拟机启动,终止此进程即能关闭虚拟机;

③ libvirt 虚拟化库:Libvirt是一个C工具包,可以与最近版本的Linux(以及其他操作系统)的虚拟化功能进行交互。主包包含了导出虚拟化支持的libvirtd服务器。

  C/S:

    Client:

      libvirt-client

      virt-manager

  Daemon:

    libvirt-daemon

 

(3)KVM模块load进内存之后,系统的运行模式:

  内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为"Guest-Kernel"模式;

  用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;

  客户机模式:GuestOS的用户模式;所有的非IO类请求。

实战一、实现宿主机为NAT模式,安装叠加虚拟机

KVM需要宿主机CPU必须支持虚拟化功能,因此如果是在vmware workstation上使用虚拟机做宿主机,那么必须要在虚拟机配置界面的处理器选项中开启虚拟机化功能。

(1)前提:

① 必须跑在x86 系统的架构上

② 必须支持硬件级虚拟化

  vmx:Intel VT-x

  svm:AMD AMD-v

③ 在虚拟机上再虚拟化,需开启虚拟化 Intel VT-x/EPT,且虚拟机此时使用的是NAT模式网络

技术图片

(2)判断CPU是否支持硬件虚拟化:

[root@centos-7~]#grep -E "vmx|svm" /proc/cpuinfo

注意:vmx 或 svm 必须出现一个,表示是支持的

  vmx:Intel VT-x

  svm:AMD AMD-v

 技术图片

 (3)安装前准备

① 装载KVM 模块

[root@centos-7~]#yum install qemu-kvm qemu-kvm-tools libvirt virt-manager  virt-install -y

② 检测kvm 模块是否装载

 技术图片

③ 启动安装的服务,并设置为开机启动

[root@centos-7~]#systemctl start libvirtd
[root@centos-7~]#systemctl enable  libvirtd

3、virsh-install命令使用帮助:

[root@linux-node1 ~]# virt-install  --help
usage: virt-install --name NAME --ram RAM STORAGE INSTALL [options]

使用指定安装介质新建虚拟机。

optional arguments:
  -h, --help            show this help message and exit
  --version             show program‘s version number and exit
  --connect URI         使用 libvirt URI 连接到 hypervisor

通用选项:
  -n NAME, --name NAME  客户端事件名称
  --memory MEMORY       配置虚拟机内存分配。例如:
                        --memory 1024 (in MiB)
                        --memory 512,maxmemory=1024
  --vcpus VCPUS         为虚拟机配置的 vcpus 数。例如:
                        --vcpus 5
                        --vcpus 5,maxcpus=10,cpuset=1-4,6,8
                        --vcpus sockets=2,cores=4,threads=2,
  --cpu CPU             CPU 型号及功能。例如:
                        --cpu coreduo,+x2apic
                        --cpu host
  --metadata METADATA   配置虚拟机元数据。例如:
                        --metadata name=foo,title="My pretty title",uuid=...
                        --metadata description="My nice long description"

安装方法选项:
  --cdrom CDROM         光驱安装介质
  -l LOCATION, --location LOCATION
                        安装源(例如:nfs:host:/path、http://host/path
                        ftp://host/path)
  --pxe                 使用 PXE 协议从网络引导
  --import              在磁盘映像中构建虚拟机
  --livecd              将光驱介质视为 Live CD
  -x EXTRA_ARGS, --extra-args EXTRA_ARGS
                        附加到使用 --location 引导的内核的参数
  --initrd-inject INITRD_INJECT
                        使用 --location 为 initrd 的 root
                        添加给定文件
  --os-variant DISTRO_VARIANT
                        在其中安装 OS 变体的虚拟机,比如
                        ‘fedora18‘、‘rhel6‘、‘winxp‘ 等等。
  --boot BOOT           配置虚拟机引导设置。例如:
                        --boot hd,cdrom,menu=on
                        --boot init=/sbin/init (for containers)
  --idmap IDMAP         为 LXC 容器启用用户名称空间。例如:
                        --idmap uid_start=0,uid_target=1000,uid_count=10

设备选项:
  --disk DISK           使用不同选项指定存储。例如:
                        --disk size=10 (new 10GiB image in default location)
                        --disk /my/existing/disk,cache=none
                        --disk device=cdrom,bus=scsi
                        --disk=?
  -w NETWORK, --network NETWORK
                        配置虚拟机网络接口。例如:
                        --network bridge=mybr0
                        --network network=my_libvirt_virtual_net
                        --network network=mynet,model=virtio,mac=00:11...
                        --network none
                        --network help
  --graphics GRAPHICS   配置虚拟机显示设置。例如:
                        --graphics vnc
                        --graphics spice,port=5901,tlsport=5902
                        --graphics none
                        --graphics vnc,password=foobar,port=5910,keymap=ja
  --controller CONTROLLER
                        配置虚拟机控制程序设备。例如:
                        --controller type=usb,model=ich9-ehci1
  --input INPUT         配置虚拟机输入设备。例如:
                        --input tablet
                        --input keyboard,bus=usb
  --serial SERIAL       配置虚拟机串口设备
  --parallel PARALLEL   配置虚拟机并口设备
  --channel CHANNEL     配置虚拟机沟通频道
  --console CONSOLE     配置虚拟机与主机之间的文本控制台连接
  --hostdev HOSTDEV     将物理 USB/PCI/etc
                        主机设备配置为与虚拟机共享
  --filesystem FILESYSTEM
                        将主机目录传递给虚拟机。例如:
                        --filesystem /my/source/dir,/dir/in/guest
                        --filesystem template_name,/,type=template
  --sound [SOUND]       配置虚拟机声音设备模拟
  --watchdog WATCHDOG   配置虚拟机 watchdog 设备
  --video VIDEO         配置虚拟机视频硬件。
  --smartcard SMARTCARD
                        配置虚拟机智能卡设备。例如:
                        --smartcard mode=passthrough
  --redirdev REDIRDEV   配置虚拟机重定向设备。例如:
                        --redirdev usb,type=tcp,server=192.168.1.1:4000
  --memballoon MEMBALLOON
                        配置虚拟机 memballoon 设备。例如:
                        --memballoon model=virtio
  --tpm TPM             配置虚拟机 TPM 设备。例如:
                        --tpm /dev/tpm
  --rng RNG             配置虚拟机 RNG 设备。例如:
                        --rng /dev/random
  --panic PANIC         配置虚拟机 panic 设备。例如:
                        --panic default

虚拟机配置选项:
  --security SECURITY   设定域安全驱动器配置。
  --numatune NUMATUNE   为域进程调整 NUMA 策略。
  --memtune MEMTUNE     为域进程调整内粗策略。
  --blkiotune BLKIOTUNE
                        为域进程调整 blkio 策略。
  --memorybacking MEMORYBACKING
                        为域进程设置内存后备策略。例如:
                        --memorybacking hugepages=on
  --features FEATURES   设置域 <features> XML。例如:
                        --features acpi=off
                        --features apic=on,eoi=on
  --clock CLOCK         设置域 <clock> XML。例如:
                        --clock offset=localtime,rtc_tickpolicy=catchup
  --pm PM               配置 VM 电源管理功能
  --events EVENTS       配置 VM 生命周期管理策略
  --resource RESOURCE   配置 VM 资源分区(cgroups)

虚拟化平台选项:
  -v, --hvm             客户端应该是一个全虚拟客户端
  -p, --paravirt        这个客户端一个是一个半虚拟客户端
  --container           这台虚拟机需要一个容器客户端
  --virt-type HV_TYPE   要使用的管理程序名称(kvm、qemu、xen
                        等等)
  --arch ARCH           模拟的 CPU 构架
  --machine MACHINE     要模拟的机器类型

其它选项:
  --autostart           引导主机时自动启动域。
  --wait WAIT           等待安装完成的分钟数。
  --noautoconsole       不要自动尝试连接到客户端控制台
  --noreboot            完成安装后不要引导虚拟机。
  --print-xml [XMLONLY]
                        输出所生成域 XML,而不是创建虚拟机。
  --dry-run             完成安装步骤,但不要创建设备或者定义
                        虚拟机。
  --check CHECK         启用或禁用验证检查。例如:
                        --check path_in_use=off
                        --check all=off
  -q, --quiet           禁止无错误输出
  -d, --debug           输入故障排除信息

使用 ‘--option=?‘ 或者 ‘--option help‘ 查看可用子选项
有关示例及完整选项语法,请查看 man page。 

 1、创建10G磁盘

[root@centos-7~]#qemu-img create -f qcow2 /var/lib/libvirt/images/CentOS-7-x86_64.qcow2 10G    #qcow2格式的磁盘

 2、上传镜像到指定目录

[root@centos-7src]#ls
CentOS-7-x86_64-Minimal-1908.iso
[root@centos-7src]#pwd
/usr/local/src

 3、在宿主机器上创建虚拟机

virt-install --virt-type kvm --name linux    指定系统名称
--memory 1024   指定系统内存大小
--vcpus=2    指定cpu数
--autostart   宿主机开机与之自动启动
--cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1908.iso   镜像路径
--disk path=/var/lib/libvirt/images/CentOS-7-x86_64.qcow2   磁盘路径
--network network=default    使用默认网络,此时是NAT网络
--graphics vnc,listen=0.0.0.0  --noautoconsole

 4、通过VNC远程控制,IP地址输入此时本主机的IP地址和端口号5900,开始控制虚拟机,并安装Linux系统,也可以用xshell连接,需要企业版本,安装图形化工具,也能管理内置虚拟机。

[root@centos-7~]#yum  groupinstall "GNOME Desktop"   安装图形化桌面,可以远程控制,宿主机内部的虚拟机。
[root@centos-7~]#virt-manager   用此软件连接进行远程控制内置虚拟机。

  技术图片

  技术图片

 5、创建Linux磁盘分区。

  技术图片

 6、对磁盘进行分区

  技术图片

 7、重启系统。

  技术图片

8、安装完成后,开始在叠加虚拟机内部ping宿主机,可以ping通,但是由于是NAT网络,内部可以访问外部网络,外部不能访问到叠加虚拟机内部,且宿主机也无法访问到此叠加虚拟机网络,此场景不常用

  技术图片

 由于叠加虚拟机是NAT模式,此时宿主机是桥接模式,都无法访问此虚拟机的IP地址,此时NAT模式的虚拟机模式完成。

 技术图片

4、virsh命令详解:

(1)virsh命令:
虚拟机的生成需要依赖于预定义的xml格式的配置文件;其生成工具有两个:virt-manager, virt-install; 
virsh [OPTION]... COMMAND [ARG]..
子命令的分类:
    Domain Management (help keyword ‘domain‘)   域管理(帮助关键字“域”)
    Domain Monitoring (help keyword ‘monitor‘)   域监视(帮助关键字“监视器”)
    Host and Hypervisor (help keyword ‘host‘)   主机和管理程序(帮助关键字“主机”)
    Interface (help keyword ‘interface‘)   接口(帮助关键字“接口”)
    Networking (help keyword ‘network‘)   网络(帮助关键字“网络”)
    Network Filter (help keyword ‘filter‘)   网络过滤器(帮助关键字“过滤器”)
    Snapshot (help keyword ‘snapshot‘)   快照(帮助关键字“快照”)
    Storage Pool (help keyword ‘pool‘)   存储池(help关键字“池”)
    Storage Volume (help keyword ‘volume‘)   存储卷(帮助关键字“卷”)
                
(2)域管理 Domain Management (help keyword ‘domain‘)
创建虚拟机:
  create:从xml格式的配置文件创建并启动虚拟机;
  define:从xml格式的配置文件创建虚拟机;
停止:
  destroy:强行关机、拔电源;
  shutdown:关机;
start:启动
reboot:重启;
undefine:删除虚拟机;
suspend/resume:暂停于内存中,或继续运行暂停状态的虚拟机;真正实现的效果:pause/unpause
save/restore:挂起/继续;保存虚拟机的当前状态至文件中,或从指定文件恢复虚拟机;
console:连接至指定domain的控制台;
                    
(3)域的设备资源管理:
① cpu
  cpu-stats     查看cpu 信息
  vcpuinfo      查看vcpu 信息
  vcpucount     看有几个cpu
  setvcpus   可以调整cpu数(如果是调整的是动态的,在创建虚拟机时设置,静态的不行)
  vcpupin    把vcpu 绑定到真正的cpu 上
② memcache                        
  setmaxmem   修改最大内存(创建虚拟机时设置的是否可以修改)
  setmem   修改内存大小(没超过上限时)
③ 设备                       
  attach-disk/detach-disk:磁盘设备的热插拔;
  domblklist:查询虚拟机的磁盘设备
  attach-interface/detach-interface:网络接口设备的热插拔;
  domiflist:查询虚拟机的网卡设备

虚拟机管理命令示例:

yum install acpid  -y  安装此包才能使用virsh命令对虚拟机进行管理

 virsh管理虚拟机常见用法:

[root@s1 src]# virsh list        #列出当前开机的
[root@s1 src]# virsh list --all  #列出所有
[root@s1 src]# virsh shutdown CentOS-7-x86_64     #正常关机
[root@s1 src]# virsh start CentOS-7-x86_64        #正常开机
[root@s1 src]# virsh destroy centos7         #强制停止/关机
[root@s1 src]# virsh undefine Win_2008_r2-x86_64  #强制删除
[root@s1 src]# virsh autostart centos7      #设置开机自启动

5、qemu-kvm命令语法

qemu-kvm  [options]  [disk_image]

选项有很多类别:标准选项、块设备相关选项、显示选项、网络选项、..

(1)标准选项:
  -machine [type=]name:-machine help来获取列表,用于指定模拟的主机类型; 
  -cpu cpu:-cpu help来获取列表;用于指定要模拟的CPU型号;
  -smp n[,maxcpus=cpus][,cores=cores][,threads=threads]多少线程[,sockets=sockets]多少核:指明虚拟机上vcpu的数量及拓扑;
  -boot [order=drives][,once=drives]只用一次(如按照系统时只用一次光盘引导)[,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
  order:各设备的引导次序:c表示第一块硬盘,d表示第一个光驱设备;-boot order=dc,once=d
  -m megs:虚拟机的内存大小;
  -name NAME:当前虚拟机的名称,要惟一;

(2)块设备相关的选项:
  -hda/-hdb file:指明IDE总线类型的磁盘映像文件路径;第0和第1个;
  -hdc/-hdd file:第2和第3个;
  -cdrom file:指定要使用光盘映像文件; 
  -drive [file=file路径][,if=type接口][,media=d接口对应的设备类型][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:
    ① file=/PATH/TO/SOME_IMAGE_FILE:映像文件路径;
    ② if=TYPE:块设备总线类型,ide, scsi, sd, floppy, virtio,...
    ③ media=TYPE:介质类型,cdrom和disk;
    ④ index=i:设定同一类型设备多个设备的编号;
    ⑤ cache=writethrough|writeback|none|directsync|unsafe:缓存方式;
    ⑥ format=f:磁盘映像文件的格式;
  CentOS磁盘镜像文件下载: https://cloud.centos.org/centos/7/images/

(3)显示选项:
  -display type:显示的类型,sdl, curses, none和vnc;
  -nographic:不使用图形接口; 显卡型号
  -vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号;
  -vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口; 让qemu进程监听一个vnc接口; 
    display:
      ① HOST:N
        在HOST主机的第N个桌面号输出vnc;
      ② unix:/PATH/TO/SOCK_FILE
      ③ none
    options:
      password:连接此服务所需要的密码;
  -monitor stdio:在标准输出上显示monitor界面;
    Ctrl-a, c:在console和monitor之间切换;
    Ctrl-a, h
                        
(4)网络选项:
  -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
    为虚拟机创建一个网络接口,并将其添加至指定的VLAN;
    model=type:指明模拟出的网卡的型号,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio;
      net nic,model=?
    macaddr=mac:指明mac地址;52:54:00:
                            
  -net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:
    通过物理的TAP网络接口连接至vlan;
    script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup
    downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown
    ifname=NAME:自定义接口名称;
其它选项:
  -daemonize:以守护进程运行;

 实战二、实现桥接与仅主机模式,并构建叠加虚拟机的隧道虚拟通道

架构图:

  技术图片

  1、选择两个虚拟机,每个虚拟机有两个仅主机模式和两个桥接模式,宿主机一安装叠加虚拟机参考以上安装方式:

    技术图片

     技术图片

 yum install bridge-utils   -y   #centos7.5以上版本就自带此软件,需要进行桥接绑定使用。

 配置宿主机一的桥接模式和仅主机模式

  现在一般的企业都会使用双网卡接入,这样既能添加网络带宽,同时又能做相应的冗余,可以说是好处多多。而一般企业都会使用linux操作系统下自带的网卡绑定模式,当然现在网卡产商也会出一些针对windows操作系统网卡管理软件来做网卡绑定(windows操作系统没有网卡绑定功能 需要第三方支持),一共有其中方式,其中比较长用的是0/1/6:

  网卡绑定案例,先做绑定,然后再把绑定后的网卡配置成桥接:

  1、第一组配置,将ens33和ens37绑定为bond0:

  (1)先创建bond0配置那文件步骤及内容如下:

[root@centos-7network-scripts]#pwd
/etc/sysconfig/network-scripts
[root@centos-7network-scripts]#cat ifcfg-bond0
BOOTPROTO=static
NAME=bond0
DEVICE=bond0
ONBOOT=yes
BONDING_MASTER=yes
BONDING_OPTS="mode=1 miimon=100" #指定绑定类型为1及链路状态监测间隔时间
BRIDGE=br0  #桥接到br0

 (2)配置br0的IP地址,将bond0绑定在br0上。

[root@centos-7network-scripts]#cat ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1

(3)配置ens33

[root@centos-7network-scripts]#cat ifcfg-ens33
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
USERCTL=no
SLAVE=yes

 (4)配置ens37

[root@centos-7network-scripts]#cat ifcfg-ens37
BOOTPROTO=static
NAME=ens37
DEVICE=ens37
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
USERCTL=no
SLAVE=yes

2、将第二组仅主机模式的ens38和ens39绑定在bond1上  

 (1)先配置bond1的配置文件

[root@centos-7network-scripts]#cat ifcfg-bond1
BOOTPROTO=static
NAME=bond1
DEVICE=bond1
ONBOOT=yes
BONDING_MASTER=yes
BONDING_OPTS="mode=1 miimon=100"
BRIDGE=br1

(2)配置br1的IP地址,并将bond1绑定在br1上

[root@centos-7network-scripts]#cat ifcfg-br1
TYPE=Bridge
BOOTPROTO=static
NAME=br1
DEVICE=br1
ONBOOT=yes
IPADDR=10.20.200.100
NETMASK=255.255.255.0

(3)将ens38绑定在bond1上

[root@centos-7network-scripts]#cat ifcfg-ens38
BOOTPROTO=static
NAME=ens38
DEVICE=ens38
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond1
USERCTL=no
SLAVE=yes

(4)将ens39绑定在bond1上

[root@centos-7network-scripts]#cat ifcfg-ens39
BOOTPROTO=static
NAME=ens39
DEVICE=ens39
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond1
USERCTL=no
SLAVE=yes

(5)修改完配置文件之后先将NetworkManager网卡关闭,否则会存在无法远程连接的风险。

[root@rs1~]#systemctl  stop  NetworkManager
[root@rs1~]#systemctl disable  NetworkManager

3、在vm1虚拟机上配置

(1)将vm1虚拟机的网卡设置为桥接的br0上,(vm1虚拟机安装过程见上面)

  virt-manager工具打开远程连接进行设置,选择到br0桥接,并点击右下角的apply应用。

    技术图片

    技术图片

 (2)在内网添加一个网络设备,然后将此网络设备绑定在br1(仅主机模式)模式下,并选择virtio模式(半虚拟化)

    技术图片

    技术图片

(3)配置eth0的IP地址,将其配置为外网地址

[root@localhost network-scripts]# cat ifcfg-eth0
BOOTPROTO=static
DEVICE="eth0"
ONBOOT="yes"
IPADDR=192.168.1.200
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.1

 配置eth1的IP地址,配置为内网地址

[root@localhost network-scripts]# cat ifcfg-eth1
BOOTPROTO=static
DEVICE="eth1"
ONBOOT="yes"
IPADDR=10.20.200.200
PREFIX=24

 安装完成之后需要安装连接网络的包

yum install net-tools  -y

3、安装vm2虚拟机

 1、配置vm2之前先要安装vm2虚拟机系统,将安装好的vm1虚拟机关闭,然后将安装好的vm1虚拟机镜像复制一份,再开始安装,在安装界面只需要强制关机,然后重新启动,此时镜像就会进行引导,将系统自动安装上。

[root@centos-7images]#cp CentOS-7-x86_64.qcow2  CentOS.qcow2

 开始安装系统,只需要将系统名称修改一下,磁盘路径修改一下即可。

virt-install --virt-type kvm --name linux777    修改系统名称
--memory 1024 --vcpus=2 --autostart --cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1908.iso --disk path=/var/lib/libvirt/images/CentOS.qcow2   磁盘路径修改一下即可
--network bridge=br0 --graphics vnc,listen=0.0.0.0  --noautoconsole

然后用virt-manager命令打开界面,强制关机,重启之后就会自动安装上系统。

   技术图片

安装完成之后需要安装连接网络的包

yum install net-tools  -y

在vm2虚拟机上配置(作为内网后端服务,外网无法直接访问,保证安全性)

1、开始配置vm2的网卡及IP地址,先将网卡改为桥接模式,为了安装httpd服务

   技术图片

2、配置IP地址,先改为自动获取,可以连接外网,安装httpd服务

[root@localhost network-scripts]# cat ifcfg-eth0
BOOTPROTO=dhcp
DEVICE="eth0"
ONBOOT="yes"
#IPADDR=10.20.200.201
#PREFIX=24

3、然后启动vm2虚拟机,安装httpd服务,创建一个显示页面

[root@centos-7~]#yum install httpd  -y
[root@centos-7~]#echo 10.20.200.201 > /var/www/html/index.html
[root@centos-7~]#systemctl start httpd

4、配置完httpd服务之后再将IP地址改为静态内网IP地址,并将网卡绑定在br1上,设置为仅主机模式。

  技术图片

[root@localhost network-scripts]# cat ifcfg-eth0
BOOTPROTO=none
DEVICE="eth0"
ONBOOT="yes"
IPADDR=10.20.200.201
PREFIX=24

  技术图片

配置宿主机二的桥接模式和仅主机模式  

 1、第一组配置,将ens33和ens37绑定为bond0:

只需要将宿主机一的bond0/1、br0/1、ens33/37/38/39配置文件都复制到本主机一份,只需要修改br0和br1的IP地址即可。

[root@centos-7network-scripts]#scp ifcfg-ens* ifcfg-b* 192.168.1.201:/etc/sysconfig/network-scripts/

(1)先创建bond0配置那文件步骤及内容如下:

[root@centos-7network-scripts]#pwd
/etc/sysconfig/network-scripts
[root@centos-7network-scripts]#cat ifcfg-bond0
BOOTPROTO=static
NAME=bond0
DEVICE=bond0
ONBOOT=yes
BONDING_MASTER=yes
BONDING_OPTS="mode=1 miimon=100" #指定绑定类型为1及链路状态监测间隔时间
BRIDGE=br0  #桥接到br0

 (2)配置br0的IP地址,将bond0绑定在br0上。

[root@centos-7network-scripts]#cat ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.1.101
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1

(3)配置ens33

[root@centos-7network-scripts]#cat ifcfg-ens33
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
USERCTL=no
SLAVE=yes

 (4)配置ens37

[root@centos-7network-scripts]#cat ifcfg-ens37
BOOTPROTO=static
NAME=ens37
DEVICE=ens37
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
USERCTL=no
SLAVE=yes

2、将第二组仅主机模式的ens38和ens39绑定在bond1上  

 (1)先配置bond1的配置文件

[root@centos-7network-scripts]#cat ifcfg-bond1
BOOTPROTO=static
NAME=bond1
DEVICE=bond1
ONBOOT=yes
BONDING_MASTER=yes
BONDING_OPTS="mode=1 miimon=100"
BRIDGE=br1

(2)配置br1的IP地址,并将bond1绑定在br1上

[root@centos-7network-scripts]#cat ifcfg-br1
TYPE=Bridge
BOOTPROTO=static
NAME=br1
DEVICE=br1
ONBOOT=yes
IPADDR=10.20.200.101
NETMASK=255.255.255.0

(3)将ens38绑定在bond1上

[root@centos-7network-scripts]#cat ifcfg-ens38
BOOTPROTO=static
NAME=ens38
DEVICE=ens38
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond1
USERCTL=no
SLAVE=yes

(4)将ens39绑定在bond1上

[root@centos-7network-scripts]#cat ifcfg-ens39
BOOTPROTO=static
NAME=ens39
DEVICE=ens39
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond1
USERCTL=no
SLAVE=yes

(5)修改完配置文件之后先将NetworkManager网卡关闭,否则会存在无法远程连接到主机的风险。

[root@rs1~]#systemctl  stop  NetworkManager
[root@rs1~]#systemctl disable  NetworkManager

(6)配置完IP地址之后在宿主机二上ping宿主机一仅主机模式的IP地址,如果能ping通,则网卡绑定搭建完成。

   技术图片

4、开始在宿主机二上安装vm3虚拟机

1、安装前先安装工具包

yum install qemu-kvm qemu-kvm-tools libvirt virt-manager  virt-install -y

2、启动libvirtd服务,并设置为开机启动

[root@rs1src]#systemctl start libvirtd
[root@rs1src]#systemctl enable libvirtd

3、在将宿主机一的镜像文件复制到宿主机二上,并开始安装虚拟机:

[root@centos-7~]#scp  /usr/local/src/CentOS-7-x86_64-Minimal-1908.iso  192.168.1.201:/usr/local/src/

 开始安装系统:

virt-install --virt-type kvm --name linux77 --memory 1024 --vcpus=2 --autostart --cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1908.iso --disk path=/var/lib/libvirt/images/CentOS-7-x86_64.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0  --noautoconsole

 4、在图形界面上执行命令,进行安装linux叠加虚拟机系统

[root@rs1src]#yum groupinstall "GNOME Desktop"  -y
[root@rs1src]#virt-manager

5、安装完系统之后,设置网卡类型,一个绑定在br0(桥接模式),一个选择br1(仅主机模式),并都选择virtio(半虚拟化模式)

   技术图片

5、在vm3虚拟机配置

  1、virt-manager工具打开远程连接进行设置,选择到br0桥接,并点击右下角的apply应用。

    技术图片

    技术图片

 2、在内网添加一个网络设备,然后将此网络设备绑定在br1模式下,并选择virtio模式(半虚拟化)

    技术图片

    技术图片

 3、配置eth0的IP地址,将其配置为外网地址

[root@localhost network-scripts]# cat ifcfg-eth0
BOOTPROTO=static
DEVICE="eth0"
ONBOOT="yes"
IPADDR=192.168.1.202
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.1

 配置eth1的IP地址,配置为内网地址(仅主机模式)

[root@localhost network-scripts]# cat ifcfg-eth1
BOOTPROTO=static
DEVICE="eth1"
ONBOOT="yes"
IPADDR=10.20.200.202
PREFIX=24

设置完网卡,并配置完IP地址之后,安装net-tools网络包

[root@localhost network-scripts]# yum install net-tools -y

6、安装vm4虚拟机 

将安装好的vm3虚拟镜像关机,然后将安装好的叠加虚拟机镜像复制一份,再开始安装,在安装界面只需要强制关机,然后重新启动就会将系统自动安装上。

[root@centos-7images]#cp CentOS-7-x86_64.qcow2  CentOS.qcow2

 开始安装系统,只需要将系统名称修改一下,磁盘路径修改一下即可。

virt-install --virt-type kvm --name linux37    修改系统名称
--memory 1024 --vcpus=2 --autostart --cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1908.iso --disk path=/var/lib/libvirt/images/CentOS.qcow2   磁盘路径修改一下即可
--network bridge=br0 --graphics vnc,listen=0.0.0.0  --noautoconsole

然后用virt-manager命令打开界面,强制关机,重启之后就会自动安装上系统。

   技术图片

在vm4虚拟机上配置(作为内网后端服务,外网无法直接访问,保证安全性)

1、开始配置vm4的网卡及IP地址,先将网卡改为桥接模式,为了安装httpd服务

   技术图片

2、配置IP地址,先改为自动获取,可以连接外网,安装httpd服务

[root@localhost network-scripts]# cat ifcfg-eth0
BOOTPROTO=dhcp
DEVICE="eth0"
ONBOOT="yes"
#IPADDR=10.20.200.203
#PREFIX=24

3、然后启动vm2虚拟机,安装httpd服务,创建一个显示页面

[root@centos-7~]#yum install httpd  -y
[root@centos-7~]#echo 10.20.200.201 > /var/www/html/index.html
[root@centos-7~]#systemctl start httpd

配置完成之后需要安装连接网络的包

yum install net-tools  -y

4、配置完httpd服务之后再将IP地址改为静态内网IP地址,并将网卡绑定在br1上,使用仅主机模式,配置完成ip地址重启network 。

  技术图片

[root@localhost network-scripts]# cat ifcfg-eth0
BOOTPROTO=none
DEVICE="eth0"
ONBOOT="yes"
IPADDR=10.20.200.203
PREFIX=24

注意:此时所有的基本架构搭建完,下来我们在vm1和vm3上安装haproxy和keepalived,来实现高可用和调度到后端内网服务器上。

在vm1上安装Haproxy和keepalived,并配置

1、安装haproxy和keepalived包

[root@localhost network-scripts]# yum install haproxy keepalived -y

2、开始配置keepalived文件,设置为主节点:vi  /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.248 dev eth0 label eth0:0   绑定vip地址
    }
}

 3、配置haproxy文件:vi  /etc/haproxy/haproxy.cfg

global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

listen web
   bind 192.168.1.248:80  绑定vip地址
   server 10.20.200.201 10.20.200.201:80 check  监听后端的vm2虚拟机
   server 10.20.200.203 10.20.200.203:80 check   监听后端的vm4虚拟机

4、配置路由转发功能

[root@localhost network-scripts]# vi  /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
[root@localhost network-scripts]# sysctl -p  让路由转发参数生效
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1

配置完成后启动haproxy和keepalived服务,并查看监听端口是否打开

[root@localhost network-scripts]# systemctl start haproxy keepalived

  技术图片

在vm3上安装haproxy和keepalived包,并配置

1、安装haproxy和keepalived包

[root@localhost network-scripts]# yum install haproxy  keepalived  -y

2、将vm1虚拟机的keepalived配置文件复制过来,然后修改优先级,改为BACKUP即可。

[root@localhost network-scripts]# scp /etc/keepalived/keepalived.conf   192.168.1.202:/etc/keepalived/

  修改haproxy配置文件

[root@localhost network-scripts]# vi /etc/keepalived/keepalived.conf 
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_iptables
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP   从节点
    interface eth0
    virtual_router_id 51
    priority 80  优先级改为80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.248 dev eth0 label eth0:0
    }
}

3、将vm1上的haproxy配置文件复制过来即可。

[root@localhost network-scripts]# scp /etc/haproxy/haproxy.cfg  192.168.1.202:/etc/haproxy/

查看haproxy配置文件:vi  /etc/haproxy/haproxy.cfg

global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

listen web
   bind 192.168.1.248:80  绑定vip地址
   server 10.20.200.201 10.20.200.201:80 check  监听后端的vm2虚拟机
   server 10.20.200.203 10.20.200.203:80 check   监听后端的vm4虚拟机

配置完成后启动haproxy和keepalived服务,并查看监听端口是否打开

[root@localhost network-scripts]# systemctl start haproxy keepalived

   技术图片

4、配置路由转发功能

[root@localhost network-scripts]# vi  /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
[root@localhost network-scripts]# sysctl -p  让路由转发参数生效
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1

测试效果 

1、此时vm1和vm3主机的haproxy和keepalived服务都启动;

外部只能通过访问VIP地址才能调度到后端仅主机模式的vm2机器上,外部无法直接访问内部IP地址的网络,提高企业网络安全。

  技术图片

2、将vm1的keepalived及后端vm2的httpd服务宕机,此时就会访问到vm4主机的web网站上,起到了备用及高可用效果。

[root@localhost network-scripts]# systemctl stop keepalived
[root@localhost network-scripts]# systemctl stop httpd

  技术图片

如果vm2和vm4想要上外网,只需要再绑定一个桥接网卡,即可,仅主机模式只让其提供覆盖物即可,到此,双网卡绑定桥接模式和仅主机模式已搭建完成。

如果我们只需要在宿主机绑定一个网卡时,只需要将一个网卡绑定在br0上做桥接即可。

以上是关于企业级虚拟化Virtualization - KVM技术的主要内容,如果未能解决你的问题,请参考以下文章

[WPF]WPF Data Virtualization和UI Virtualization

ovirt(open Virtualization)

KVM硬件辅助虚拟化之 EPT in Nested Virtualization

Windows Server 2016 Hyper-v Nested Virtualization

Virtualization and Performance: Understanding VM Exits

I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtualizaiton Para-virtualization]