zoukankan      html  css  js  c++  java
  • 云计算概述和KVM虚拟化

    前言:

    近些年一直听着 虚拟化、云计算、公有云、私有云、混合云这些个概念,一直想着....这些概念要用什么技术实现?

    一、云计算的概念

    1.传统IDC机房面都会临什么问题?

    任何新事物都是由需求催生的,之前网站上线基本上会有以下几种选择:

    IDC托管:买台服务托管到IDC机房---》安装系统----》部署应用---》域名备案------》上线

    IDC租用:租用IDC机房提供的服务器

    VPS:虚拟专用主机

    以上传统的网站上线的模式有什么重大缺陷呢?

    A.成本高 (IDC托管、租用费用费用很高)

    B.自动化能力差 事多、麻烦(买了/租了服务器还要装系统、部署代码,是否会被网络攻击)

    2.云计算是什么?

    把总多服务器的资源通过虚拟化的技术手段熔化成一个资源池 (云)

    用户以网络的方式 按需获取资源池中的服务器资源,服务商按用户使用量公平收费;  (计算)

    是一种资源整合、按需消费、按需收费的商业模式;  让企业使用服务器资源就像 居民平时用水、用电一样简单;

    3.云计算的层次

    根据云提供的服务分为以下几个层次

    Infrastructure as a service        iaas
    Platforn as a service              paas
    Software as a service              saas

     PS:也许你会听说过vaas(Video-as-a-service) 是建立在这3层之上的典型代表有乐视云;

    4.云计算的分类

    根据云面向的人群分为以下几类:

    公有云:面向公众提供虚拟机、开发环境、服务(阿里云)       优点:技术安全可靠      缺陷:数据不安全

    私有用:仅对一部分人/自己/公司内部员工使用(阿根云)    缺陷:技术问题自己解决    优点:数据安全

    混合云:既使用公有云  也有自己的私有云(我们公司的)       (综合私有云、公有云的优缺点)

    二、虚拟化的概念

    1.什么是虚拟化?

    首先声 明    云计算 != 虚拟化,云计算的实现使用到了虚拟化这种技术手段;

    虚拟化是指通过软件技术 把1个计算机的CPU、硬件 虚拟出很多虚拟机,这些虚拟机寄生在宿主机之上,功能和宿主机的功能无异, 但是彼此之间是隔离的;

    2.虚拟化类别

    三、KVM

    KVM:需要硬件支持的虚拟化技术,从硬件层面实现隔离;(openstack默认使用的虚拟化技术就是KVM)

    QEMU:QEMU和KVM一样是一种虚拟化软件;

    QUEMU和KVM的区别:由于KVM是内核级虚拟化软件(能虚拟化出CPU和内存),磁盘、网卡虚拟不出来,于是KVM就是结合了QEMU实现了用户态的虚拟化;

    1.虚拟环境准备

    [root@localhost ~]# grep -E '(vmx|svm)' /proc/cpuinfo 
    flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch arat tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec
    查看是否支持虚拟化
    [root@localhost ~]# yum list|grep kvm 
    Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
    libvirt-daemon-kvm.x86_64               2.0.0-10.el7                   @anaconda
    qemu-kvm.x86_64                         10:1.5.3-126.el7               @anaconda
    qemu-kvm-common.x86_64                  10:1.5.3-126.el7               @anaconda
    libvirt-daemon-kvm.x86_64               3.2.0-14.el7_4.5               updates  
    oci-kvm-hook.x86_64                     0.2-2.el7                      epel     
    pcp-pmda-kvm.x86_64                     3.11.8-7.el7                   base     
    qemu-kvm.x86_64                         10:1.5.3-141.el7_4.4           updates  
    qemu-kvm-common.x86_64                  10:1.5.3-141.el7_4.4           updates  
    qemu-kvm-tools.x86_64                   10:1.5.3-141.el7_4.4           updates  
    yum list|grep kvm 查看可以安装得KVM包

    2.安装KVM

    [root@localhost ~]# yum -y install qemu-kvm qemu-kvm-tools libvirt virt-install

    3.启动librbd服务

    libvirtd是管理KVM虚拟机的工具

    [root@localhost ~]# yum update librbd1
    [root@localhost ~]# systemctl start libvirtd
    [root@localhost ~]# systemctl enable libvirtd

     当libvertd服务启动之后

    系统会自动创建一个名为virbr0的桥接网卡,ip地址默认为192.168.122.1;

    virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
            ether 52:54:00:31:bf:a8  txqueuelen 1000  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    ifconfig 查看新创建的桥接网卡

    系统 自动启动dnsmasq进程该进程有DNS和DHCP的功能,给虚拟机动态分配IP地址并提供域名解析服务;

    [root@localhost zhanggen]# ps -aux | grep dnsmasq 
    nobody     1433  0.0  0.0  49532  1072 ?        S    23:12   0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
    root       1436  0.0  0.0  49504   348 ?        S    23:12   0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
    root       3727  0.0  0.0 112664   972 pts/0    R+   23:19   0:00 grep --color=auto dnsmasq
    [root@localhost zhanggen]# 
    ps -aux | grep dnsmasq

    4.创建虚拟机

    使用qemu-img给KVM虚拟机创建虚拟镜像文件

    [root@localhost kvm_img]# qemu-img create -f raw /kvm_img/Centos-7-x86.raw 10G
    Formatting '/kvm_img/Centos-7-x86.raw', fmt=raw size=10737418240 

     新建了虚拟镜像文件就可以安装虚拟机了

    virt-install --virt-type kvm --name Centos-7-x86_64 --ram 2048 --cdrom=/centos7iso/CentOS-7-x86_64-DVD-1611.iso --disk path=/kvm_img/Centos-7-x86.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

     然后使用TightVNC连接到服务器上给kvm虚拟机安装系统

    在宿主机查看当前KVM实例列表

    [root@localhost centos7iso]# virsh list --all
     Id    名称                         状态
    ----------------------------------------------------
     1     Centos-7-x86_64                running

    通过宿主机启动1个 kvm实例

    [root@localhost centos7iso]# virsh start Centos-7-x86_64 
    域 Centos-7-x86_64 已开始

    kvm虚拟机启动之后,其实就是宿主机中的一个进程

    [root@localhost zhanggen]# ps -ef | grep kvm
    root        482      2  0 3月15 ?       00:00:00 [kvm-irqfd-clean]
    qemu       8000      1  7 01:27 ?        00:01:53 /usr/libexec/qemu-kvm -name Centos-7-x86_64 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off -cpu Broadwell,-hle,-rtm -m 2048 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid fc152f09-9b09-4890-a316-3c2a5afb0e68 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-2-Centos-7-x86_64/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/kvm_img/Centos-7-x86.raw,format=raw,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive if=none,id=drive-ide0-0-0,readonly=on -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -netdev tap,fd=26,id=hostnet0,vhost=on,vhostfd=28 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:ca:24:4f,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-2-Centos-7-x86_64/org.qemu.guest_agent.0,server,nowait -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0 -device usb-tablet,id=input0,bus=usb.0,port=1 -vnc 0.0.0.0:0 -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on
    ps -ef | grep kvm

    5.管理KVM虚拟机

    在宿主机里面创建好了kvm实例,接下来就是对它们进行管理了,Red Hat引入了libvirt库作为管理平台虚拟化(hypervisor和VM)的一个API,openstack就是调用libvirt的API来管理KVM虚拟机的,

    virsh是调用libvirt的客户端。

    看到这里我有点兴奋,其实我用Python去调用libvert的API,也可以写一套类似openstack的虚拟机管理工具;

    PS:openstack挂了 kvm虚拟机也会挂吗?你的老板挂了你会挂吗?

    5.1.KVM虚拟机是通过什么定义的?

    [root@localhost qemu]# cat Centos-7-x86_64.xml 
    <!--
    WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
    OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
      virsh edit Centos-7-x86_64
    or other application using the libvirt API.
    -->
    
    <domain type='kvm'>
      <name>Centos-7-x86_64</name>
      <uuid>fc152f09-9b09-4890-a316-3c2a5afb0e68</uuid>
      <memory unit='KiB'>2097152</memory>
      <currentMemory unit='KiB'>2097152</currentMemory>
      <vcpu placement='static'>1</vcpu>
      <os>
        <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
        <boot dev='hd'/>
      </os>
      <features>
        <acpi/>
        <apic/>
      </features>
      <cpu mode='custom' match='exact' check='partial'>
        <model fallback='allow'>Broadwell-noTSX</model>
      </cpu>
      <clock offset='utc'>
        <timer name='rtc' tickpolicy='catchup'/>
        <timer name='pit' tickpolicy='delay'/>
        <timer name='hpet' present='no'/>
      </clock>
      <on_poweroff>destroy</on_poweroff>
      <on_reboot>restart</on_reboot>
      <on_crash>destroy</on_crash>
      <pm>
        <suspend-to-mem enabled='no'/>
        <suspend-to-disk enabled='no'/>
      </pm>
      <devices>
        <emulator>/usr/libexec/qemu-kvm</emulator>
        <disk type='file' device='disk'>
          <driver name='qemu' type='raw'/>
          <source file='/kvm_img/Centos-7-x86.raw'/>
          <target dev='vda' bus='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
        </disk>
        <disk type='file' device='cdrom'>
          <driver name='qemu' type='raw'/>
          <target dev='hda' bus='ide'/>
          <readonly/>
          <address type='drive' controller='0' bus='0' target='0' unit='0'/>
        </disk>
        <controller type='usb' index='0' model='ich9-ehci1'>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
        </controller>
        <controller type='usb' index='0' model='ich9-uhci1'>
          <master startport='0'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
        </controller>
        <controller type='usb' index='0' model='ich9-uhci2'>
          <master startport='2'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
        </controller>
        <controller type='usb' index='0' model='ich9-uhci3'>
          <master startport='4'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
        </controller>
        <controller type='pci' index='0' model='pci-root'/>
        <controller type='ide' index='0'>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
        </controller>
        <controller type='virtio-serial' index='0'>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
        </controller>
        <interface type='network'>
          <mac address='52:54:00:ca:24:4f'/>
          <source network='default'/>
          <model type='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </interface>
        <serial type='pty'>
          <target type='isa-serial' port='0'>
            <model name='isa-serial'/>
          </target>
        </serial>
        <console type='pty'>
          <target type='serial' port='0'/>
        </console>
        <channel type='unix'>
          <target type='virtio' name='org.qemu.guest_agent.0'/>
          <address type='virtio-serial' controller='0' bus='0' port='1'/>
        </channel>
        <input type='tablet' bus='usb'>
          <address type='usb' bus='0' port='1'/>
        </input>
        <input type='mouse' bus='ps2'/>
        <input type='keyboard' bus='ps2'/>
        <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
          <listen type='address' address='0.0.0.0'/>
        </graphics>
        <video>
          <model type='cirrus' vram='16384' heads='1' primary='yes'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
        </video>
        <memballoon model='virtio'>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
        </memballoon>
      </devices>
    </domain>
    /etc/libvirt/qemu
    所有的虚拟机都是由这个目录下的 xml文件定义的 其中包含:CPU、内存、硬盘...参数,对它的修改也就是对KVM虚拟机的动态调整

    5.2.virsh管理命令

    如上图所示 vish 是虚拟机管理服务(libvert)的客户端,那么如何使用virsh来对KVM虚拟机进行管理呢?

    virsh list        #查看虚拟机列表

     qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/xuegod63-kvm2.img /var/lib/libvirt/images/xuegod63-kvm2.qcow2 #转换格式(将raw格式转换为qcow2格式):

    virsh dumpxml Centos-7-x86_64 > back.xml  #备份虚拟机定义文件
    virsh defined back.xml #通过备份的.xml文件还原虚拟机
    virsh reboot Centos-7-x86_64             #重启虚拟机
    virsh shutdown Centos-7-x86_64 #关闭虚拟机
    virsh start Centos-7-x86_64 #开启虚拟机
    virsh suspend Centos-7-x86_64            #挂起虚拟机
    virsh resume Centos-7-x86_64             #恢复虚拟机
    virsh snapshot-list Centos-7-x86_64            #查看本虚拟机的快照
    virsh snapshot-create-as Centos-7-x86_64 mysnapshot   #创建快照
    virsh snapshot-revert Centos-7-x86_64 mysnapshot #恢复快照
    virsh snapshot-delete Centos-7-x86_64 mysnapshot #删除快照

    5.3.virsh edit命令

    该命名可以对 /etc/libvirt/qemu下的xml虚拟机定义文件进行修改,进而对虚拟机的硬件参数进行在线调整;

    调整CPU个数

     <vcpu placement='auto' current='1'>4</vcpu>
    virsh edit Centos-7-x86_64

    virsh setvcpus Centos-7-x86_64 2 --live #在线修改为2个CPU

    调整内存大小

    virsh qemu-monitor-command Centos-7-x86_64 --hmp --cmd balloon 1024     #设置内存大小

      virsh qemu-monitor-command Centos-7-x86_64 --hmp --cmd info balloon     #查看内存大小

    硬盘相关

    QUME使用的镜像文件分为:qcow2和raw格式

    qcow2格式:支持快照功能、性能慢、动态占用

    raw格式:不支持快照功能、性能快、指定多多空间占用多大,可以转换成其他格式

    qemu-img info Centos-7-x86.raw                       #查看KVM镜像文件格式
    qemu-img convert -f raw -O qcow2 Centos-7-x86.raw test.qcow2 #转换镜像文件的格式

    KVM网络架构调整(把所有KVM虚假 桥接到虚拟网桥br0上)

    KVM虚假默认是通过NAT转换的方式上网的,但是NAT转换有网络平静,所有我可在宿主机上创建 一些虚拟网桥,让一堆堆的虚拟机桥接到宿主机的各个网桥上,达到网络负载均衡的效果;

    brctl show       #查看网桥:通过virbr0网桥做NAT IP地址转换 分配给虚拟机

    stepA:宿主机新增虚拟网桥(以免增加网桥的操作过程中宿主机网络中断,所以一定通过脚本的形式进行操作。) 

    #!/usr/bin/bash
    ip addr del dev ens33  192.168.226.151/24    #剥夺、删除ens33的IP地址
    brctl addbr br0                              #添加虚拟机网桥 br0
    ifconfig br0 192.168.226.151/24 up         #给网桥设置IP地址
    brctl addif br0 ens33                      #将br0桥接到ens22物理网卡
    route add default gw 192.168.226.2         #添加网关出口
    宿主机新增虚拟网桥脚本

    stepB:设置KVM.xml 让虚拟机连接到宿主机新增的网桥上

    <interface type='bridge'>
          <mac address='52:54:00:ca:24:4f'/>
          <source bridge='br0'/>
          <model type='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </interface>
    修改KVM定义文件(/etc/libvirt/qemu/Centos-7-x86_64.xml )

    stepC:KVM虚拟机桥接到宿主机之后,重启KVM(重启不能用reboot否则不生效!), 然后登陆KVM给KVM配置静态IP、网关、DNS

    KVM网卡配置 (/etc/sysconfig/network-scripts/ifcfg-eth0)
    
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=192.168.226.18
    NETMASK=255.255.255.0
    GATEWAY=192.168.226.2
    
    KVMDNS配置
    /etc/resolv.conf 
    nameserver 192.168.226.2
    KVM配置静态IP地址

     

    6.KVM性能优化

    6.1:减少CachMiss

    每个kvm虚拟机都对应宿主机中的一个进程,为了减少CachMiss,可以把某些运行重要业务的kvm绑定到一颗CPU上;

    [root@localhost zhanggen]# taskset -cp 0 8000        #0:CPU 800:进程ID
    pid 8000's current affinity list: 0
    pid 8000's new affinity list: 0

    6.2.使用大页内存,减少内存碎片,加速内存寻址(默认已开启);

    [root@localhost zhanggen]# cat /sys/kernel/mm/transparent_hugepage/enabled 
    [always] madvise never

    6.3.Linux的IO调度算法

    四、python3调用libvirtd API

    如果你想通过python3调用宿主机的libvirtd API 管理KVM虚拟机,必须要   pip 安装libvirt-python模块 然后在libvirtd 宿主机端开启API 端口,就可以了;

    1.libvert-python模块安装

    yum install -y libvirt-devel
    yum install python-devel
    pip3 install psutil
    pip3 install ioctl_opt
    下载python-libvirt包#https://pypi.org/project/libvirt-python/3.7.0/
    
    python setup.py build
    python setup.py install
    
    
    效果
    [root@cmdb libvirt-python-3.7.0]# python
    Python 3.6.1 (default, Feb 22 2019, 15:18:59) 
    [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import libvirt
    >>> 
    python3安装libvirt模块

    2.设置LIBVIRTD_PATH环境变量

    export LIBVIRTD_PATH=/usr/sbin/
    /etc/profile

    以上是python端的准备工作,如果python想要连接到KVM宿主机的libverd API  就需要配置 libvirtd的开放端口;

    3.配置libvirtd API 端口

    LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
    LIBVIRTD_ARGS="--listen"
    vim /etc/sysconfig/libvirtd
    listen_tls = 0
     
    listen_tcp = 1
     
    tcp_port = "16509"
     
    listen_addr = "0.0.0.0"
     
    auth_tcp = "none"
    vim /etc/libvirt/libvirtd.conf
    LISTEN      0      128             *:16509                       *:*  

      

    4、代码

    用了半天时间 搭建libvirtd API 环境 、pip libvert-python模块 ,要运维干嘛?............终于可以用python连进来写会儿代码了。

    [root@localhost libvirt]# python
    Python 2.7.5 (default, Nov  6 2016, 00:28:07) 
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import libvirt
    >>> conn = libvirt.open("qemu+tcp://192.168.226.151/system")
    >>> 

    参考:

    python3安装libvirt模块

    python的libvirt模块使用

    https://www.cnblogs.com/psv-fuyang/articles/8598240.html

    配置16509连接端口

  • 相关阅读:
    SVN服务的配置与管理
    SVN配置多仓库与权限控制
    SVN使用详解
    这个问题他又来了,如何学编程!
    乘风破浪的程序员们
    Java 学习路线(史上最全 2020 版 ~ 持续更新中)
    P4782 【模板】2-SAT 问题
    HDU
    2020.8.3
    Interesting Computer Game
  • 原文地址:https://www.cnblogs.com/sss4/p/10524269.html
Copyright © 2011-2022 走看看