本文主要灵感来自老男孩架构师班-赵班长实战讲解KVM,以及speedy Cloud云公司CEO董伟(董总)云计算与虚拟化讲座,综合整理而来。--为表示感谢--特整理此文分享给大家。
1.1云计算概述
云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用程序,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。
在云计算之前的模式和技术
1
2
3
4
|
1、IDC托管
2、IDC租用
3、虚拟主机(卖空间)
4、VPS:虚拟专用主机 openvz(通过超卖技术坑人) xen(不支持超卖)
|
相对云计算,传统数据中心面临的问题
1
2
3
|
1、资源利用率低
2、资源分配不合理
3、难以实现真正的自动化运维
|
云计算特点和优势
1
2
3
|
1、云计算是一种使用模式,不是一种技术。(通过网络、弹性扩展、按需付费)
2、云计算使用方法必须通过网络来访问。
3、云计算的优势是弹性计算(按需付费)。
|
1.1.1云计算的特点
1
2
3
4
5
|
1、资源池化
2、无处不在的网络访问
3、随需应变的自助服务
4、可测量的服务
5、快速的伸缩
|
云计算五大特点,如图1-1
图1-1
1.1.2云计算服务模型
云计算服务模型如图1-2
图1-2
IaaS 基础设施即服务
1
2
3
|
消费者通过Internet 可以从完善的计算机基础设施获得服务。这类服务称为基础设施即服务。
基于Internet 的服务(如存储和数据库)是IaaS的一部分。
Internet上其他类型的服务包括平台即服务和软件即服务。
|
PaaS 平台即服务
1
2
3
4
|
把服务器平台作为一种服务提供的商业模式。
而云计算时代相应的服务器平台或者开发环境作为服务进行提供就成为了PaaS
。所谓PaaS实际上是指将软件研发的平台作为一种服务,以SaaS的模式提交给用户。因此,PaaS也是
SaaS模式的一种应用。
|
SaaS 软件即服务
1
2
3
4
|
它是一种通过Internet提供软件的模式,
厂商将应用软件统一部署在自己的服务器上,客户可以根据自己实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得厂商提供的服务。
用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需对软件进行维护,服务提供商会全权管理和维护软件,软件厂商在向客户提供互联网应用的同时,也提供软件的离线操作和本地数据存储,让用户随时随地都可以使用其定购的软件和服务。对于许多小型企业来说,
SaaS是采用先进技术的最好途径,它消除了企业购买、构建和维护基础设施和应用程序的需要。
|
1.1.3云计算部署模型
公有云(Public Cloud)
1
2
|
公有云通常指第三方提供商为用户提供的能够使用的云,公有云一般可通过internet使用,可能是免费或成本低廉,公有云的核心属性是共享资源服务。
这种云有许多实例,可在当今整个开放的共有网络中提供服务。例如:阿里云、腾讯云、青云、百度云、盛大云、迅达云、等等。
|
私有云(Private Clouds)
1
2
|
私有云是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施,并可以控制在此基础设施上部署应用程序的方式。私有云可部署在企业数据中心防火墙内,也可以将它们部署在一个安全的主句托管场所,
私有云的核心属性是专有资源。
|
混合云(Hybrid Cloud)
1
2
|
混合云融合了公有云和私有云,是近年来云计算的主要模式和发展方向。我们已经知道私企业主要是面向企业用户,处于安全考虑,企业更愿意将数据存放在私有云中,但是同时又希望可以获得公有云的计算资源,在这种情况下混合云被越来越多的采用,
它将公有云和私有云进行混合匹配,以获得最佳的效果,这种个性的解决方案,达到二既省钱又安全的目的。
|
社区云(Community Cloud)
1
2
3
|
社区云是大的公有云范畴内的一个组成部分。是指在一定的地域范围内,由云计算服务提供商统一提供计算资源、网络资源、软件和服务能力所形成的云计算形式。即
基于社区的网络互连优势和技术易于整合特点,通过区域内各种计算能力进行统一服务形式的整合,结合社区内的用户需求共性,实现面向区域用户需求的云计算服
务模式。例如:区域型和行业型。资源的高效共享。
|
1.2虚拟化概述
1
2
3
4
|
虚拟化,一种具体的技术,用来将物理机虚拟成为多个相互独立的虚拟机。在一台计算机上同时运行多个
逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,
可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业
中灵活多变的应用需求。从而显著提高计算机的工作效率。
|
1.2.1虚拟化的分类
全虚拟化
半虚拟化
平台虚拟化
软件虚拟化
硬件虚拟化(Inter vt-x/EPT) (AMD AMD-v /RVI)
桌面虚拟化
应用虚拟化
以上各种虚拟化技术,百度百科都能查阅到相关资料。
1.2.2虚拟化的优势
1)虚拟化可以虚拟出来多个操作系统,它们之间是相互独立的,所以每个操作系统上所跑的应用程序是相互不影响的。
2)支持异构,linux系统可以虚拟化windows系统,方便不同场景系统的使用。
3)支持快照、克隆、还原等功能。
企业案例一
公司虚拟机你也不知道能不能停,也不知道跑什么了,然后问产品经理他也不知道,有可能有用你放着把。如果这是一台物理机你看怎么办,真的很无奈、想改个啥你都不敢该,只能让他跑在那里。
企业案例二
公司这台物理机有没有用,所有人告诉你,没事删把肯定没有用,然后到店庆的时候,产品经理过来了:我们去年店庆做了一个积分抽奖的活动,我花钱买的,我的代码哪去了,我的服务器呢?服务器早都格式化多少遍了,产品经理说那没办法,那么赶紧联系提供商把,提供商倒闭了。怎么办,重新做呗。
如果有虚拟机就好办了,我把虚拟机关了放在那,只要不删除,是不是永远都在,哪天用在起来就行了。无非就占点硬盘,分配的时候,可以使用多少分配多少。
1.2.3虚拟化与云计算总结
云计算不等于虚拟化,两者并不能相互比较。
云计算是一种资源和使用交互的方式。
虚拟化是一种具体的技术。
云计算要依赖虚拟化技术来实现的一种通过网络访问获取资源,流量,交付的使用模式。(例如:弹性计算)。
虚拟化相当于实干家,而云计算是思想家。
虚拟化企业安装实战
KVM:内核级虚拟化技术(Kernel-based Virtual Machine)
结构简单,包含两个部分:
1)设备驱动/dev/kvm, 针对模拟PC硬件的用户空间组件
2) KVM需要CPU中虚拟化功能的支持,只可在具有虚拟化支持的CPU上运行,即具有VT功能的interCPU和具有ADM-V功能的AMD CPU
1.3.1KVM虚拟化特性
嵌入到Linux正式Kernel(提高兼容性)
代码级资源调用(提高性能)
虚拟机就是一个进程(内存易于管理)
直接支持NUMA技术(提高扩展性)
------RedHat收购KVM---------
保持开源发展模式
更好的商业支持及服务保障
安装必备条件
实验必备条件,必须开启虚拟机VT-EPT技术,在vmware虚拟机选择上即可。服务器上默认是开启状态。
[root@linux-node1~]# egrep '(vmx|svm)' /proc/cpuinfo #如果过滤没有代表不支持虚拟化
flags:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflushdts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmonpebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pnipclmulqdq vmx ssse3 fma cx16 pcid sse4_1sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrandhypervisor lahf_lm abm 3dnowprefetch ida arat epb xsaveopt pln pts dthermtpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseedadx smap
1.3.2安装KVM虚拟机
1
2
3
4
|
[root@linux-node1~]
# cat /etc/redhat-release #查看操作系统版本
CentOSLinux release 7.1.1503 (Core)
[root@linux-node1~]
# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install –y #安装KVM
|
kvm:linux内核的一个模块,模块不需要安装只需要加载,通过用户态程序来管理即可。
qeum:虚拟化软件,可以虚拟不同的CPU,支持异构(x86的架构可以虚拟化不是x86架构的)
qeum-kvm:用户态管理kvm,网卡、声卡、PCI设备等都是需要qemu来管理。
1
2
3
4
5
6
|
[root@linux-node1~]
# lsmod|grep kvm #查看kvm内核是否被加载
kvm_intel 148081 0
kvm 461126 1 kvm_intel
[root@linux-node1~]
# systemctl enable libvirtd.service #libvirtd加入开机启动
[root@linux-node1~]
# systemctl start libvirtd.service #启动libvirtd
|
1.3.3建立一台KVM虚拟机
首先学习下virsh-install创建虚拟机命令
--virt-type:指定虚拟机类型(kvm、qemu、xen)
--name:指定虚拟机的名称
--raw:指定内存大小
--cpu:指定cpu的核数(默认为1)
--cdrom:指定镜像
--disk:指定磁盘路径(即上文创建的虚拟磁盘)
--network:指定网络类
1
2
3
4
5
6
7
8
9
10
11
|
[root@linux-node1~]
# qemu-img create -f raw /opt/CentOS-7.1-x86_64.raw 10G #创建虚拟磁盘,-f指定格式,路径/opt/CentOS-7.1-x86_64.raw,大小10G
[root@linux-node1~]
# dd if=/dev/cdrom of=/opt/CentOS-7.1.iso #挂在镜像,导入至虚拟机
[root@linux-node1~]
#
virt-
install
--name CentOS-7-x86_64 --virt-
type
kvm --
ram
1024--cdrom=
/opt/CentOS-7
.1.iso --disk path=
/opt/CentOS-7
.1-x86_64.raw
--networknetwork=default --graphics vnc,listen=0.0.0.0 --noautoconsole
#创建一台KVM虚拟机
Startinginstall...
Creatingdomain... | 0 B 00:03
Domaininstallation still
in
progress. You can reconnect to
theconsole to complete the installation process.
|
1.3.4VNC连接KVM虚拟机
打开一个VNC客户端,输入192.168.56.111:5900(第一个默认5900,第二个5901,以此类推)连接虚拟机里面建立的KVM虚拟机,安装CentOS7的过程,此处不在演示如何安装。
安装CentOS7,在启动前修改内核让网卡为eth0,如图1-2
图1-2
1.4KVM日常管理
1
2
3
4
5
6
7
|
[root@linux-node1opt]
# virsh start CentOS-7-x86_64 #启动刚才创建的CentOS7KVM虚拟机
DomainCentOS-7-x86_64 started
[root@linux-node1opt]
# virsh list #查看KVM虚拟机是否启动
Id Name State
----------------------------------------------------
3 CentOS-7-x86_64 running
|
1.4.1CPU扩容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@linux-node1opt]
# virsh edit CentOS-7-x86_64 #为了实现CPU的热添加,就需要更改Cpu的最大值,当然热添加值不能超过最大值
<vcpuplacement=
'auto'
current=
"1"
>4<
/vcpu
>
#当前为1,自动扩容最大为4
[root@linux-node1opt]
# virsh shutdown CentOS-7-x86_64 #关闭KVM虚拟机
DomainCentOS-7-x86_64 is being
shutdown
[root@linux-node1opt]
# virsh start CentOS-7-x86_64 #启动KVM虚拟机
DomainCentOS-7-x86_64 started
[root@linux-node1opt]
# virsh setvcpus CentOS-7-x86_64 2 --live #热修改为2个cpu(不知减少),高版本自动激活
[root@KVM]
#grep processor /proc/cpuinfo |wc -l #通过vnc登录KVM虚拟机查看是否扩容成功
2
在创建虚拟机时指定cpu
[root@linux-node1~]
# virt-install --help|grep vcpus
--vcpus VCPUS 为虚拟机配置的 vcpus 数。例如:
--vcpus 5
--vcpus5,maxcpus=10,cpuset=1-4,6,8
--vcpussockets=2,cores=4,threads=2,
|
1.4.2内存扩容
内存的设置拥有一个气球(balloon)机制,可以增大减少,但是也要设置一个最大值,默认并没有最大值,也可以在安装时指定。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@linux-node1opt]
# virsh edit CentOS-7-x86_64 #为了实现CPU的热添加,就需要更改Cpu的最大值,当然热添加值不能超过最大值
<memoryunit=
'KiB'
>4194304<
/memory
>
#修改最大支持内存扩容为4G
<currentMemoryunit=
'KiB'
>1048576<
/currentMemory
>
#当前KVM虚拟机内存为1G
重启虚拟机
[root@linux-node1opt]
# virsh shutdown CentOS-7-x86_64 #关闭KVM虚拟机
DomainCentOS-7-x86_64 is being
shutdown
[root@linux-node1opt]
# virsh start CentOS-7-x86_64 #启动KVM虚拟机
DomainCentOS-7-x86_64 started
[root@linux-node1~]
# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd info balloon #查看当前KVM内存大小
balloon:actual=1024
[root@linux-node1~]
# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd balloon #热添加
unexpected end of expression
[root@linux-node1~]
# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd info balloon #在次查看
balloon: actual=2001
|
1.4.3硬盘管理
更改虚拟机中存储,硬盘设置(不建议生产环境使用硬盘的扩大收缩模式,很容易产生故障)
1
2
3
4
5
|
[root@linux-node1~]
# qemu-img --help |grep -i "formats:"
Supportedformats:
vvfat vpc vmdk vhdx vdi
ssh
sheepdog rbd raw host_cdrom
host_floppyhost_device
file
qed qcow2 qcow parallels nbd iscsi gluster
dmg tftp ftps ftphttps http cloop bochs blkverify blkdebug
|
硬盘格式都可以通过qeum-img管理,具体qemu-img --help
全镜像格式(代表raw):设置多大就是多大,写入速度快,方便的转换为其他格式,性能最优,但是占用空间大。
稀疏格式(代表qcow2):支持压缩,快照,镜像,更小的存储空间(即用多少占多少)
1.4.4网络管理
默认情况KVM的网络是NAT模式,但是在生产情况,用的多的都是网桥模式。
修改eth0(这里CentOS7的eth0在装机时就指定了,那如果没指定怎么办? http://www.xuliangwei.com/xubusi/102.html)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
[root@linux-node1~]
# brctl addbr br0 #添加一个网卡
[root@linux-node1~]
# brctl show #查看网卡信息
bridgename bridge
id
STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.5254009f0311
yes
virbr0-nic
[root@linux-node1~]
#
brctl addif br0 eth0 && ip addr del dev eth0
192.168.56.111
/24
&&
ifconfig
br0 192.168.56.111
/24
up &&
route add default gw192.168.56.2 && iptables -F
#把eth0加入网桥,使用桥接模式,给br设置ip,添加路由网关,关闭防火墙
[root@linux-node1~]
# ifconfig br0 #查看网桥的IP
br0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.56.111 netmask 255.255.255.0 broadcast 192.168.56.255
inet6 fe80::20c:29ff:fe5d:cc27 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:5d:cc:27 txqueuelen 0 (Ethernet)
RX packets 4813 bytes 472527 (461.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2705 bytes 510369 (498.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@linux-node1~]
# virsh edit CentOS-7-x86_64 #编辑虚拟机的网络配置使用br0网桥模式
<interface
type
=
'bridge'
>
#虚拟机网络连接方式
<mac address=
'52:54:00:22:04:0f'
/>
#为虚拟机分配MAC地址,务必唯一,如果是dhcp获得同样IP会引起冲突
<
source
bridge=
'br0'
/>
#当前主机网桥名称
重启虚拟机
[root@linux-node1opt]
# virsh shutdown CentOS-7-x86_64 #关闭KVM虚拟机
DomainCentOS-7-x86_64 is being
shutdown
[root@linux-node1opt]
# virsh start CentOS-7-x86_64 #启动KVM虚拟机
DomainCentOS-7-x86_64 started
#然后配置静态IP地址,重启网卡,即可以通过xshell连接上KVM虚拟机了。
|
1.5KVM常用管理
1
2
3
4
5
6
7
8
9
10
11
|
[root@linux-node1~]
# virt-install #建立kvm虚拟机
[root@linux-node1~]
# virsh list #查看正在运行的KVM虚拟机
[root@linux-node1~]
# virsh list --all #查看所有KVM虚拟机
[root@linux-node1~]
# virsh start name #启动KVM虚拟机
[root@linux-node1~]
# virsh shutdown name #正常关闭KVM虚拟机
[root@linux-node1~]
# virsh destroy name #强制关闭KVM虚拟机(类似于直接断电)
[root@linux-node1~]
# virsh suspend name #挂起KVM虚拟机
[root@linux-node1~]
# virsh resume name #恢复挂起的KVM虚拟机
[root@linux-node1~]
# virsh dumpxml name #查看KVM虚拟机配置文件
[root@linux-node1~]
# virsh edit name #编辑KVM虚拟机的xml配置文件
[root@linux-node1~]
# virsh undefine name #彻底删除KVM虚拟机,不可逆,如果想找回来,需要备份/etc/libvirt/qemu的xml文件)
|
1.6KVM性能优化
1.6.1CPU优化
inter的cpu的运行级别,按权限级别高低Ring3->Ring1->Ring0(Ring2和Ring1暂时用不上)Ring3为用户态,Ring0为内核态
Ring3的用户态是没有权限管理硬件的,需要切换到内核态Ring0,这样的切换(系统调用)称为上下文切换,物理机到虚拟机多次的上下文切换,势必会导致性能出现问题。对于全虚拟化,inter实现了技术VT-x,在CPU硬件上实现了加速转换,CentOS7默认是不需要开启的。
CPU缓存绑定
1
2
3
4
5
|
[root@linux-node1~]
# lscpu|grep cache #centos7自带查看cpu信息命令
L1dcache: 32K
L1icache: 32K
L2cache: 256K
L3cache: 3072K
|
L1是静态缓存,造价高。
L2,L3是动态缓存,通过脉冲的方式写入0和1,造价较低。
cache解决了cpu处理快,内存处理慢的问题,类似于memcaced和数据库。
如果cpu调度器把进程随便调度到其他cpu上,而不是当前L1,L2,L3的缓存cpu上,缓存就不生效了,就会产生miss,为了减少cache miss,需要把KVM进程绑定到固定的cpu上。
可以使用taskset把某一个进程绑定(cpu亲和力绑定,可以提高20%的性能)在某一个cpu上,例如:taskset -cp 125718(1指的是cpu1,也可以绑定到多个cpu上,25718是指的pid).
cpu绑定的优点:提高性能,20%以上
cpu绑定的缺点:不方便迁移,灵活性差
1.6.2内存优化
宿主机虚拟内存-> 宿主机物理内存
虚拟机的虚拟内存 -> 虚拟机的物理内存
VMM通过采用影子列表解决内存转换的问题,影子页表是一种比较成熟的纯软件的内存虚拟化方式,但影子页表固有的局限性,影响了VMM的性能,例如,客户机中有多个CPU,多个虚拟CPU之间同步页面数据将导致影子页表更新次数幅度增加,测试页表将带来异常严重的性能损失。如下图1-1为影子页表的原理图
图1-1
在此之际,Inter在最新的Core I7系列处理器上集成了EPT技术(对应AMD的为RVI技术),以硬件辅助的方式完成客户物理内存到机器物理内存的转换,完成内存虚拟化,并以有效的方式弥补了影子页表的缺陷,该技术默认是开启的,如下图1-2为EPT技术的原理。
图1-2
KSM内存合并
宿主机上默认会开启ksmd进程,该进程作为内核中的守护进程存在,它定期执行页面扫描,识别副本页面并合并副本,释放这些页面以供它用,CentOS7默认是开启状态
1
2
3
4
5
6
7
|
[root@linux-node1~]
# ps aux|grep ksmd|grep -v grep
root 280 0.0 0.0 0 0 ? SN 04:22 0:00 [ksmd]
大页内存,CentOS7默认开启的
[root@linux-node1~]
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always]madvise never
[root@linux-node1~]
# ps aux|grep hugepage|grep -v grep
root 281 0.0 0.0 0 0 ? SN 04:22 0:03 [khugepaged]
|
Linux默认的内存页面大小都是4K,HugePage进程会将默认的每个内存页面可以调整为2M
1.6.3磁盘IO优化
IO调度算法,也叫电梯算法,详情请看赵班长博客:http://www.unixhot.com/article/4
1、Noop Scheduler:简单的FIFO队列,最简单的调度算法,由于会产生读IO的阻塞,一般使用在SSD硬盘,此时不需要调度,IO效果非常好
2、Anticipatory IO Scheduler(asscheduler)适合大数据顺序顺序存储的文件服务器,如ftp server和web server,不适合数据库环境,DB服务器不要使用这种算法。
3、Deadline Schedler:按照截止时间的调度算法,为了防止出现读取被饿死的现象,按照截止时间进行调整,默认的是读期限短于写期限,就不会产生饿死的状况,一般应用在数据库
4、Complete Fair Queueing Schedule:完全公平的排队的IO调度算法,保证每个进程相对特别公平的使用IO
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@linux-node1~]
# dmesg|grep -i "scheduler" #查看本机Centos7默认所支持的调度算法
[ 1.332147] io scheduler noop registered
[ 1.332151] io scheduler deadline registered(default)
[ 1.332190] io scheduler cfq registered
临时更改某个磁盘的IO调度算法,将deadling模式改为cfq模式
[root@linux-node1~]
# cat /sys/block/sda/queue/scheduler
noop[deadline] cfq
[root@linux-node1~]
# echo cfq >/sys/block/sda/queue/scheduler
[root@linux-node1~]
# cat /sys/block/sda/queue/scheduler
noopdeadline [cfq]
[root@linux-node1~]
# vim /boot/grub/menu.lst #使更改的IO调度算法永久生效,需要更改内核参数
kernel
/boot/vmlinuz-3
.10.0-229.el7 ro root=LABEL=/ elevator=deadline rhgb quiet
|
1.7虚拟化镜像制作
1.在开始创建过虚拟磁盘,并命名为CentOS-7.1-x86_64.raw,这个是虚拟机镜像。
1
2
3
4
|
[root@linux-node1~]
# ll /opt/
total5203344
-rw-r--r-- 1 qemu qemu 4310695936 12月 28 04:46CentOS-7.1.iso
-rw-r--r--.1 qemu qemu 10737418240 12月 28 08:55CentOS-7.1-x86_64.raw
|
2. 分区的时候,只分一个/分区(不需要swap分区)。
3. 删除网卡里面{UUID,MAC}
4. 如果有/etc/udev/rules.d/70-persistent-ipoib.rules 则删除。
5. iptables关闭、selinux关闭
6.安装基础软件包。(net-tools lrzsz screen tree vim wget)