云计算与虚拟化KVM深度实践

徐亮伟, 江湖人称标杆徐。多年互联网运维工做经验,曾负责过大规模集群架构自动化运维管理工做。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工做。
我的博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:55240892五、572891887
架构师群:471443208html

该博客文章同步视频在51cto上线了,想详细了解的朋友能够点击下方视频连接地址
[51cto视频地址传送门](http://edu.51cto.com/course/13208.html)node

云计算基本概述

云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用程序,服务),这些资源可以被快速提供,只需投入不多的管理工做,或与服务供应商进行不多的交互。python

在使用云计算以前的模式和技术linux

一、IDC托管
二、IDC租用
三、虚拟主机(卖空间)
四、VPS:虚拟专用主机 openvz(经过超卖技术坑人) xen(不支持超卖)nginx

云计算以前,传统数据中心面临的问题git

一、资源利用率低
二、资源分配不合理
三、自动化能力差
四、初始成本高github

云计算是什么web

一、云计算是一个概念, 不是任何技术(指的是资源使用和交付模式)
二、云计算使用方法必须经过网络来访问
三、云计算的优点(弹性付费、按需付费、快速扩展)
四、云计算不用关系底层基础设施架构shell

云计算优点vim

一、海量动态资源池,灵活的调配和绑定
二、无处不在的网络访问
三、随需应变的自助服务
四、服务应用的可用性
五、快速的弹性伸缩

云计算服务模型

云计算分层

IDC 全部都得自行管理
IAAS 基础设施及服务
PAAS 平台及服务
SAAS 软件及服务

云计算部署模型

![-w300](http://cdn.xuliangwei.com/15235988962356.jpg)

公有云(阿里云、腾讯云)只有使用权,按需付费(技术层面:数据不安全 道德层面)
私有云(自建机房,本身搭建,全部自行管理 (局限:资源固定))
混合云(主要业务放私有云、当有临时需求的时候使用公有云,使用结束不用)

虚拟化技术概述


什么是KVM, 内核级虚拟化技术Kernel-based Virtual Machine
虚拟化是一种具体的技术,将物理机虚拟成多个相互独立的虚拟机。
在一台计算机上同时运行多个逻辑计算机,每一个逻辑计算机可运行不一样的操做系统,而且应用程序均可以在相互独立的空间内运行而互不影响,能够实现资源的动态分配、灵活调度、跨域共享,提升资源利用率,服务于各行各业中灵活多变的应用需求。从而显著提升服务器的工做效率。

虚拟化的分类

全虚拟化
半虚拟化(qemu模拟网络以及硬盘)
硬件虚拟化(Inter vt-x/EPT) (AMD AMD-v /RVI)
桌面虚拟化 (银行,操做层面控制-没法复制、没法使用usb、最多手机拍照))
应用虚拟化 (将应用经过浏览器进行交付,只须要安装插件便可实现"贵")

虚拟化使用场景

1.虚拟化能够虚拟出来多个操做系统,它们之间是相互独立的,因此每一个操做系统上所跑的应用程序是相互不影响的。
2.支持异构,linux系统能够虚拟化windows系统,方便不一样场景系统的使用。
3.支持快照、克隆、迁移、等功能。

企业案例一
公司有一台服务器, 在盘点资产时, 你并不清楚该虚拟机是否能中止, 也不清楚上面运行了什么, 问技术部门没有一我的清楚, 只会告诉你, 有可能有用你放着把。
若是这是一台物理机你看怎么办,真的很无奈、想改个啥你都不敢该,只能让他跑在那里。

企业案例二
公司这台物理机有没有用,全部人告诉你,没事删把确定没有用,而后到店庆的时候,产品经理过来了:咱们去年店庆作了一个积分抽奖的活动,我花钱买的,个人代码哪去了,个人服务器呢?服务器早都格式化多少遍了,产品经理说那没办法,那么赶忙联系提供商把,提供商倒闭了。怎么办,从新作呗。
若是有虚拟机就好办了,我把虚拟机关了放在那,只要不删除,是否是永远都在,哪天用在起来就好了。无非就占点硬盘,分配的时候,可使用多少分配多少。

虚拟化与云计算总结

云计算不等于虚拟化,二者并不能相互比较。
云计算是一种资源和使用交互的方式。
虚拟化是一种具体的技术。
云计算要依赖虚拟化技术来实现的一种经过网络访问获取资源,流量,交付的使用模式。(例如:弹性计算)。
虚拟化至关于实干家,而云计算是思想家。

安装KVM虚拟化

KVM须要硬件支持, 因此须要开启虚拟化支持

1.硬件设备直接在BIOS设置开启CPU虚拟化
2.我的电脑一样进入BIOS开启虚拟化支持
3.VM须要找到对应虚拟机开启对应的VT-EPT虚拟化技术

//没有任何内容则表示服务器没有启用虚拟化
[root@kvm-node1 ~]# egrep '(vmx|svm)' /proc/cpuinfo

1.服务器环境规划

系统 主机名 IP 内存 磁盘
CentOS7 kvm-node1 192.168.56.11 4G 80G
CentOS7 kvm-node2 192.168.56.12 4G 80G

2.基础环境配置

//查看当前系统版本
[root@kvm-node1 ~]# hostnamectl 
   Static hostname: kvm-node1
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 6878674c84644fd381a5e3a82d80cf18
           Boot ID: fd8e37aca7e4421fa5674fc0fff147e9
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-693.el7.x86_64
      Architecture: x86-64

//设定主机名
[root@kvm-node1 ~]# hostnamectl set-hostname kvm-node1

//关闭防火墙
[root@kvm-node1 ~]# systemctl stop firewalld
[root@kvm-node1 ~]# systemctl disable firewalld

//关闭Selinux
[root@kvm-node1 ~]# sed -i '/SELINUX=/cSELINUX=disabled' /etc/selinux/config
[root@kvm-node1 ~]# setenforce 0

//配置hosts解析
[root@kvm-node1 ~]# echo "192.168.56.11 kvm-node1" >> /etc/hosts

3.安装KVM虚拟化工具

//qeum 虚拟化软件,能够虚拟不一样的CPU,以及模拟网卡、声卡、PCI设备等
//libvirt 用于管理KVM的工具
//virt-install 命令行安装虚拟机工具
//virt-manager 图形化管理虚拟机工具
//openssh-askpass 远程链接KVM主机

[root@kvm-node1 ~]# yum install qemu-kvm qemu-kvm-tools \
libvirt virt-manager virt-install  \
openssh-askpass –y

//KVM是linux内核的一个模块,模块不须要安装只须要加载,经过用户态程序来管理便可
[root@kvm-node1 ~]# lsmod|grep kvm
kvm_intel             148081  0
kvm                   461126  1 kvm_intel

4.启动libvirt管理KVM工具

[root@kvm-node1 ~]# systemctl enable libvirtd.service
[root@kvm-node1 ~]# systemctl start libvirtd.service
#注意: 启动后会新增一块virbr0网络

5.KVM会给虚拟机分配NAT模式网络,可是在生产状况,强烈推荐使用网桥模式

//配置KVM虚拟机使用的桥接网络, 添加br0网卡
[root@kvm-node1 ~]# brctl addbr br0

//将eth0加入网桥,使用桥接模式,给br设置ip,添加路由网关,关闭防火墙
[root@kvm-node1 ~]# brctl addif br0 eth0 && \
ip addr del dev eth0 192.168.56.11/24 && \
ifconfig br0 192.168.56.11/24 up && \
route add default gw 192.168.56.2

[root@kvm-node1 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29726a96       no              eth0
virbr0          8000.525400e6a3a3       yes             virbr0-nic

建立KVM虚拟机

1.在建立虚拟机以前, 咱们须要添加一块磁盘来存放咱们的虚拟机, VM->关机->设置->添加磁盘

//直接使用整块磁盘
[root@kvm-node1 ~]# mkdir -p /data 
[root@kvm-node1 ~]# mkfs.xfs /dev/sdb
[root@kvm-node1 ~]# mount /dev/sdb /data
#强烈建议加入开机自启动

2.使用virsh-install建立命令模式建立虚拟机

//挂载系统光盘, 创建ISO镜像文件
[root@kvm-node1 ~]# dd if=/dev/cdrom of=/data/centos7u4_x86_64.iso

//建立虚拟机磁盘
[root@kvm-node1 ~]# qemu-img create -f qcow2 /data/centos7u4-node1.qcow2 10G

//建立虚拟机实例
virt-install --name centos7u4-node1 \
--virt-type kvm \
--ram 1024 \
--cdrom=/data/centos7u4_x86_64.iso \
--disk path=/data/centos7u4-node1.qcow2 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole
 
//参数概述
--virt-type:指定虚拟机类型(kvm、qemu、xen)
--name:指定虚拟机名称
--raw:指定虚拟机使用内存大小
--cpu:指定cpu的核数(默认为1)
--cdrom:指定虚拟机安装的ISO镜像
--disk:指定虚拟机数据存储磁盘qcow2
--network:指定虚拟机网络类型, 默认nat,经常使用bridge
--graphics:指定虚拟机可链接方式, 好比VNC
--noautoconsole:不链接虚拟机图形界面控制台

3.使用vnc客户端链接KVM虚拟机,进行操做系统安装

4.安装CentOS7在启动前修改内核让网卡为eth0

5.安装系统步骤忽略, 但必定要记得配置好对应的地址

建立WIN7虚拟机

1.准备Win7 ISO镜像

2.建立虚拟机磁盘

[root@kvm-node1 ~]# qemu-img create -f qcow2 win7-node1.qcow2

3.virt-install命令建立Win7虚拟机, 也可使用virt-manager建立Win7虚拟机

[root@kvm-node1 ~]# virt-install --name win7-node1 \
--virt-type kvm \
--ram 2048 \
--cdrom=/data/win7.iso \
--disk path=/data/win7-node1.qcow2 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

4.Win7安装过程, 内存与磁盘不够会致使安装慢或失败




管理KVM虚拟机

//虚拟机随着系统启动
virsh autostart Name
//关闭虚拟机随系统启动
virsh autostart —disable Name

//查看正在运行的KVM虚拟机
[root@kvm-node1 ~]# virsh list
//查看全部KVM虚拟机
[root@kvm-node1 ~]# virsh list --all

//启动KVM虚拟机
[root@kvm-node1 ~]# virsh start name
//关闭KVM虚拟机
[root@kvm-node1 ~]# virsh shutdown name
//强制关闭KVM虚拟机
[root@kvm-node1 ~]# virsh destroy name

//挂起KVM虚拟机
[root@kvm-node1 ~]# virsh suspend name
//恢复挂起的虚拟机
[root@kvm-node1 ~]# virsh resume name

//编辑KVM虚拟机的xml配置文件
[root@kvm-node1 ~]# virsh edit name
//删除建立的KVM虚拟机
[root@kvm-node1 ~]# virsh undefine name

KVM虚拟机扩容

KVM虚拟机中有两种磁盘格式:

raw格式: 直接占用物理磁盘, 写入快, 性能优, 但占用空间
Qcow2格式: 使用多少占多少磁盘, 支持压缩、快照、镜像
注意:raw不支持快照, Qcow2支持快照, 但二者文件类型是能够相互间转换

不管磁盘是raw qcow2格式, 扩展思路以下

1.新添加一块磁盘加入至须要扩容的虚拟主机
2.使用lvm逻辑卷管理方式进行扩展

1.查看当前KVM虚拟机所使用的虚拟磁盘

[root@kvm-node1 ~]# virsh domblklist centos7u4-node1
Target     Source
------------------------------------------------
vda        /data/centos7u4-node1.qcow2

2.建立一块qcow2虚拟磁盘

[root@kvm-node1 ~]# qemu-img create -f qcow2 /data/centos7u4-node1-disk2.qcow2 10G

3.在线添加虚拟磁盘

//在线添加
[root@kvm-node1 ~]# virsh attach-disk centos7u4-node1 /data/centos7u4-node1-disk2.qcow2 vdb --cache=none --subdriver=qcow2
Disk attached successfully

//查看新增磁盘状态
[root@kvm-node1 ~]# virsh domblklist centos7u4-node1
Target     Source
------------------------------------------------
vda        /data/centos7u4-node1.qcow2
vdb        /data/centos7u4-node1-disk2.qcow2


//第二种扩容方式方式, 新增以下配置
[root@kvm-node1 ~]# virsh edit centos7u4-node1
<disk type='file' device='disk'>     
  <driver name='qemu' type='qcow2' cache='none'/>      
  <source file='/data/centos7u4-node1-disk2.qcow2'/>      
  <target dev='vdb' bus='virtio'/>      
 </disk>

4.经过vnc链接KVM虚拟机进行磁盘扩容

5.扩容步骤以下

[root@localhost ~]# pvcreate /dev/vdb
[root@localhost ~]# vgextend /dev/vdb centos
[root@localhost ~]# lvextend -l +100%FREE /dev/centos/root
[root@localhost ~]# xfs_growfs /dev/centos/root

KVM虚拟机快照

1.查看磁盘格式raw格式须要转换成qcow2

[root@kvm-node1 ~]# qemu-img info /data/centos7u4-node1.raw 
image: /data/centos7u4-node1.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.2G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

2.必须关闭虚拟机进行磁盘转换

[root@kvm-node1 ~]# virsh shutdown centos7u4-node1
[root@kvm-node1 ~]# qemu-img convert -f raw /data/centos7u4-node1.raw -O qcow2 /data/centos7u4-node1.qcow2
//convert 将磁盘文件转换为指定格式的文件
//-f 指定须要转换文件的文件格式
//-O 指定要转换的目标格式
//转换完成后,将新生产一个目标映像文件,原文件保存

3.修改KVM虚拟机配置文件配置文件

[root@kvm-node1 ~]# virsh edit centos7u4-node1
      <driver name='qemu' type='qcow2'/>
      <source file='/data/centos7u4-node1.qcow2'/>

4.对虚拟机当前进行快照拍摄

[root@kvm-node1 ~]# virsh snapshot-create centos7u4-node1    
Domain snapshot 1523494907 created

5.查看虚拟机快照

[root@kvm-node1 ~]# virsh snapshot-list  centos7u4-node1
 Name                 Creation Time             State
------------------------------------------------------------
 1523494907           2018-04-11 21:01:47 -0400 running
 
 //检查当前虚拟机最新快照版本
[root@kvm-node1 ~]# virsh snapshot-current centos7u4-node1|less

//快照xml文件存放路径
[root@kvm-node1 ~]# ls /var/lib/libvirt/qemu/snapshot/centos7u4-node1/
1523494907.xml  1523495036.xml

6.恢复快照

[root@kvm-node1 ~]# virsh snapshot-revert centos7u4-node1 1523494907

//确认恢复版本正确
[root@kvm-node1 ~]# virsh snapshot-current centos7u4-node1|grep "1523494907"
  <name>1523494907</name>
  <creationTime>1523494907</creationTime>

7.删除快照

[root@kvm-node1 ~]# qemu-img info /data/centos7u4-node1.qcow2 
image: /data/centos7u4-node1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.8G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1523494907             282M 2018-04-11 21:01:48   00:16:25.489
2         1523495036             282M 2018-04-11 21:03:56   00:18:29.210
Format specific information:
    compat: 1.1
    lazy refcounts: false

//删除最近一个快照
[root@kvm-node1 ~]# virsh snapshot-delete centos7u4-node1 1523495036
Domain snapshot 1523495036 deleted

KVM图形化管理

1.服务端安装x11图形界面工具

[root@kvm-node1 ~]# yum install -y xorg-x11-font-utils xorg-x11-server-utils xorg-x11-utils xorg-x11-xauth xorg-x11-xinit

2.服务端开启SSH隧道转发X11

[root@kvm-node1 ~]# vim /etc/ssh/sshd_config
X11Forwarding yes
[root@kvm-node1 ~]# systemctl restart sshd

3.Windows客户端使用Xshell链接KVM宿主机

第一步: 链接KVM宿主机, 修改其属性

第二步: 使用xming接受SSH X11图形转发

注意: 须要下载对应工具Xming, 而后启动

第三步:从新链接KVM宿主机, 执行virt-manager

第四步:安装中文字符,解决界面乱码问题

[root@kevin ~]# yum install -y dejavu-lgc-sans-fonts
[root@kevin ~]# yum groupinstall -y "Fonts"

//调整字体为中文
[root@kvm-node1 ~]# export LANG=zh_CN.UTF-8

注意:

1.若是使用GUI界面Linux则无需安装便可使用virt-manager
2.若是是MAC笔记本, 仅能使用Crt开启X11图形转发, 同时必须下载XQuartz支持转发

KVM虚拟机克隆



KVM虚拟机迁移

KVM可视化管理

1.安装 WebVirtMgrWebVirtMgr官方参考手册

[root@kvm-node1 ~]# yum -y install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
[root@kvm-node1 ~]# yum -y install gcc python-devel git python-pip libvirt-python libxml2-python python-websockify supervisor nginx novnc
[root@kvm-node1 ~]# pip install numpy

2.安装要求和安装PythonDjango环境

[root@kvm-node1 ~]# git clone git://github.com/retspen/webvirtmgr.git
[root@kvm-node1 ~]# cd webvirtmgr
[root@kvm-node1 webvirtmgr]# pip install -r requirements.txt
[root@kvm-node1 webvirtmgr]# ./manage.py syncdb

//用户信息,回车
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'root'):
Email address: 552408925@qq.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 6 object(s) from 1 fixture(s)

//添加额外的超级用户
[root@kvm-node1 webvirtmgr]# ./manage.py collectstatic

3.配置Nginx

[root@kvm-node1 webvirtmgr]# cd ..
[root@kvm-node1 ~]#  mv webvirtmgr /var/www/

//在/etc/nginx/conf.d目录中添加webvirtmgr.conf
[root@kvm-node1 ~]# vim /etc/nginx/conf.d/webvirtmgr.conf
server {
    listen 80 default_server;
    server_name $hostname;
    #access_log /var/log/nginx/webvirtmgr_access_log; 

    location /static/ {
        root /var/www/webvirtmgr/webvirtmgr;
        expires max;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        client_max_body_size 1024M;
    }
}

//注意: 注释/etc/nginx/conf/nginx.conf文件中Server段

//设定目录权限
[root@kvm-node1 ~]# chown -R nginx:nginx /var/www/webvirtmgr

//启动nginx,并将其加入开机自启
[root@kvm-node1 ~]# systemctl start nginx
[root@kvm-node1 ~]# systemctl enable nginx

4.安装配置Supervisor

//建立文件/etc/supervisord.d/webvirtmgr.ini如下内容
[root@kvm-node1 ~]# vim /etc/supervisord.d/webvirtmgr.ini
[program:webvirtmgr]
command=/usr/bin/python /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
logfile=/var/log/supervisor/webvirtmgr.log
log_stderr=true
user=nginx

[program:webvirtmgr-console]
command=/usr/bin/python /var/www/webvirtmgr/console/webvirtmgr-console
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=nginx

5.启动supervisord并加入开机自启

[root@kvm-node1 ~]# systemctl start supervisord.service 
[root@kvm-node1 ~]# systemctl enable supervisord.service

6.配置ssh认证SSH官方参考资料

[root@kvm-node1 ~]# su - nginx -s /bin/bash
-bash-4.2$ ssh-keygen 
-bash-4.2$ touch ~/.ssh/config
-bash-4.2$ echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
-bash-4.2$ chmod 0600 ~/.ssh/config
-bash-4.2$ ssh-copy-id root@localhost

-w500

-w500

-w500

相关文章
相关标签/搜索