虚拟化之KVM(案例)

KVM案例:

案例背景:

某公司刚创立起步,为节省经费,准备使用KVM跑公司业务网站,特购两台高性能服务器(多核心,大内存,多网卡或双网卡,多硬盘-做raid5或raid10),在每个服务器上安装linux系统架设KVM服务,后在每个KVM上跑多台虚拟机,提供对外业务网站。

架构解说:

防火墙后使用HAProxy+Keepalived做高可用调度,HAProxy+Keepalived分别跑在不同的宿主机上,以免当其中一台宿主机宕机后,公司业务网站单点失败,无法访问。后端架设nginx+php,mariadb主从或读写分离或galary cluster三主架构,同理也跑在不同的宿主机,以免单点失败。双网卡起步,配置内外网,内网跑服务,与外网隔离。对带宽要求很高的话,双网卡绑定增加带宽方式(需交换机支持,做端口绑定)

简单配置:

实验前提:两台宿主机BIOS中,开启了虚拟化功能。因手里有一个配置好centos7最小化安装的qcow2文件,故拷贝即可模拟出多台虚拟机。

CentOS 7 64 位 KVM-1

[root@kvm-1 ~]# yum install qemu-kvm qemu-kvm-tools libvirt virt-manager virt-install acpid -y
[root@kvm-1 ~]# systemctl start libvirtd
[root@kvm-1 ~]# systemctl enable libvirtd

#提前上传镜像
[root@kvm-1 src]# ll /usr/local/src/CentOS-7-x86_64-Minimal-1810.iso
-rw-r--r-- 1 root root 962592768 Jun 15 23:47 /usr/local/src/CentOS-7-x86_64-Minimal-1810.iso

#由于提前已经有qcow2文件,所以这里不需要重新安装,在安装前,强制关机后重启即可
[root@kvm-1 ~]# ll /var/lib/libvirt/images/
total 3552524
-rw-r--r-- 1 qemu qemu 1818886144 Jun 16 21:03 centos7_mini_1.qcow2
-rw-r--r-- 1 qemu qemu 1818951680 Jun 16 21:36 centos7_mini.qcow2

#创建虚拟机vm1
[root@kvm-1 ~]# virt-install --virt-type kvm \
--name centos7 \
--memory 512 \
--vcpus 1 \
--cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1810.iso \
--disk path=/var/lib/libvirt/images/centos7_mini.qcow2 \
--network bridge=br0 \
--graphics vnc,listen=172.16.36.70 \
--noautoconsole

#创建虚拟机vm2
[root@kvm-1 ~]# virt-install --virt-type kvm \
--name centos7-1 \
--memory 512 \
--vcpus 1 \
--cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1810.iso \
--disk path=/var/lib/libvirt/images/centos7_mini_1.qcow2 \
--network bridge=br1 \
--graphics vnc,listen=172.16.36.70 \
--noautoconsole

CentOS 7 64 位 KVM-2

[root@kvm-2 ~]# yum install qemu-kvm qemu-kvm-tools libvirt virt-manager virt-install acpid -y
[root@kvm-2 ~]# systemctl start libvirtd
[root@kvm-2 ~]# systemctl enable libvirtd

#提前上传镜像
[root@kvm-2 src]# ll /usr/local/src/CentOS-7-x86_64-Minimal-1810.iso
-rw-r--r-- 1 root root 962592768 Jun 15 23:47 /usr/local/src/CentOS-7-x86_64-Minimal-1810.iso

#由于提前已经有qcow2文件,所以这里不需要重新安装,在安装前,强制关机后重启即可
[root@kvm-2 ~]# ll /var/lib/libvirt/images/
total 3552524
-rw-r--r-- 1 qemu qemu 1818886144 Jun 16 21:03 centos7_mini_1.qcow2
-rw-r--r-- 1 qemu qemu 1818951680 Jun 16 21:36 centos7_mini.qcow2

#创建虚拟机vm3
[root@kvm-2 ~]# virt-install --virt-type kvm \
--name centos7-1 \
--memory 512 \
--vcpus 1 \
--cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1810.iso \
--disk path=/var/lib/libvirt/images/centos7_mini.qcow2 \
--network bridge=br0 \
--graphics vnc,listen=172.16.36.71 \
--noautoconsole

#创建虚拟机vm4
[root@kvm-1 ~]# virt-install --virt-type kvm \
--name centos7-2 \
--memory 512 \
--vcpus 1 \
--cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1810.iso \
--disk path=/var/lib/libvirt/images/centos7_mini_1.qcow2 \
--network bridge=br1 \
--graphics vnc,listen=172.16.36.71 \
--noautoconsole

通过virt-manager管理虚拟机:

执行virt-manager通常会报错:
(virt-manager:23111): Gtk-WARNING **: 15:48:20.549: cannot open display:
此处介绍securCRT+Xmanager启动virt-manager:

1.启动xmanager的passive

2.在secureCRT中执行以下的命令
export DISPLAY=172.16.36.1:0.0 ip地址是本机(真实主机,你摸得到)的客户端地址

3.写一个.sh文件,放到/etc/profile.d/,例如:
[root@kvm-1 images]# vim /etc/profile.d/display.sh
export DISPLAY=172.16.36.1:0.0
[root@kvm-1 images]# source /etc/profile.d/display.sh   #读取生效
[root@kvm-1 images]# virt-manager   #启动virt-manager

中间部分过程省略:如配置KVM里跑的虚拟机网卡增加、桥接选项、IP地址配置等操作。

各虚拟机服务配置:

[root@vm1 ~]# yum install haproxy keepalived -y
[root@vm1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   vrrp_iptables    #禁止VIP移走后,生成iptables防护规则
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.43.248 dev eth0 label eth0:0    #VIP绑定
    }
}

[root@vm1 ~]# vim /etc/haproxy/haproxy.cfg
listen stats
    bind :9999          #监听在所有地址。
    stats enable        #开启状态页
    #stats hide-version         #隐藏haproxy版本信息
    stats uri /haproxy-status       #自定义管理URI
    stats realm HAPorxy\Stats\Page      #登陆时提醒消息
    stats auth haadmin:123456       #用户认证信息,可写多个
    stats refresh 5s    #5S自动刷新页面内容
    stats admin if TRUE   #登陆成功即启用管理功能

listen  web_port
    bind 192.168.43.248:80
    mode http
    log global
    option forwardfor
    server Web1 172.16.36.75:80 check inter 3000 fall 3 rise 5
    server Web2 172.16.36.76:80 check inter 3000 fall 3 rise 5

[root@vm1 ~]# systemctl start haproxy.service keepalived.service

[root@vm1 ~]# ss -tnl
State       Recv-Q Send-Q              Local Address:Port                             Peer Address:Port              
LISTEN      0      128                             *:9999                                        *:*                  
LISTEN      0      128                192.168.43.248:80                                          *:*  
[root@vm1 ~]# systemctl enable haproxy.service keepalived.service

===========================================================

[root@vm3 ~]# yum install haproxy keepalived -y
[root@vm3 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.43.248 dev eth0 label eth0:0
    }
}

[root@vm3 ~]# vim /etc/haproxy/haproxy.cfg
listen  web_port
    bind 192.168.43.248:80
    mode http
    log global
    option forwardfor
    server Web1 172.16.36.75:80 check inter 3000 fall 3 rise 5
    server Web2 172.16.36.76:80 check inter 3000 fall 3 rise 5

[root@vm3 ~]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1   #开启监听本机不存在的IP地址。

[root@vm3 ~]# sysctl -p     #使自定义项生效
net.ipv4.ip_nonlocal_bind = 1

[root@vm3 ~]# systemctl start haproxy.service keepalived.service

[root@vm3 ~]# ss -tnl
State       Recv-Q Send-Q              Local Address:Port                             Peer Address:Port              
LISTEN      0      128                192.168.43.248:80                                          *:*  
[root@vm1 ~]# systemctl enable haproxy.service keepalived.service

===========================================================

[root@vm2 ~]# yum install httpd
[root@vm2 ~]# echo "web 172.16.36.75" > /var/www/html/index.html
[root@vm2 ~]# systemctl start httpd
[root@vm2 ~]# systemctl enable httpd

===========================================================

[root@vm4 ~]# yum install httpd
[root@vm2 ~]# echo "web 172.16.36.75" > /var/www/html/index.html
[root@vm4 ~]# systemctl start httpd
[root@vm4 ~]# systemctl enable httpd

测试访问: