云计算与虚拟化KVM深度实践
徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:552408925、572891887
架构师群:471443208
该博客文章同步视频在51cto上线了,想详细了解的朋友可以点击下方视频链接地址
[51cto视频地址传送门](http://edu.51cto.com/course/13208.html)
云计算基本概述
云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用程序,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。
在使用云计算之前的模式和技术
1、IDC托管
2、IDC租用
3、虚拟主机(卖空间)
4、VPS:虚拟专用主机 openvz(通过超卖技术坑人) xen(不支持超卖)
云计算之前,传统数据中心面临的问题
1、资源利用率低
2、资源分配不合理
3、自动化能力差
4、初始成本高
云计算是什么
1、云计算是一个概念, 不是任何技术(指的是资源使用和交付模式)
2、云计算使用方法必须通过网络来访问
3、云计算的优势(弹性付费、按需付费、快速扩展)
4、云计算不用关系底层基础设施架构
云计算优势
1、海量动态资源池,灵活的调配和绑定
2、无处不在的网络访问
3、随需应变的自助服务
4、服务应用的可用性
5、快速的弹性伸缩
云计算服务模型
云计算分层
IDC 所有都得自行管理
IAAS 基础设施及服务
PAAS 平台及服务
SAAS 软件及服务
云计算部署模型
公有云(阿里云、腾讯云)只有使用权,按需付费(技术层面:数据不安全 道德层面)
私有云(自建机房,自己搭建,所有自行管理 (局限:资源固定))
混合云(主要业务放私有云、当有临时需求的时候使用公有云,使用结束不用)
虚拟化技术概述
什么是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.安装 WebVirtMgr
WebVirtMgr官方参考手册
[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.安装要求和安装Python
的Django
环境
[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