徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。


该博客文章同步视频在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
     
        
        
        
 

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
      
      

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"
  1523494907
  1523494907

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: [email protected]
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