身为那么一位,在IDC机房历经十多年摸爬滚打过来的运维老兵,时至今日便想着和大伙聊一聊,云计算环境情形时的服务器虚拟化技术的落地实战方面话题有哪些。
对于众多才开始接触云计算的读者而言,常常会将“虚拟化”单纯解读成“安装几个虚拟机”,然而实际上在生产环境当中,这是关联到从硬件底层一直到业务上线的全链路设计的。
接下来,我要依据真实业务场景,一步一步带着你于虚拟化环境里去部署一组具备高可用性的Web服务。
场景:从物理机到云主机的业务迁移
有一家创业公司,原本运用一台物理服务器来运行LNMP环境,后来,随着流量不断增长,单点故障所存在的风险,以及资源不够充足的问题,一天比一天明显地突显出来。
在虚拟化平台之上,得构建成多台虚拟机,此虚拟平台包含像VMware vSphere或者KVM这样的类型,然后还要去部署一整个完整的Web环境。
就本次实战而言,是以 KVM 作为例子的,这是由于它属于Linux内核原生所支持的虚拟化技术,此项技术性能损耗较小,所以适合企业级生产环境。
准备:环境与基础配置
设定存在一台物理服务器,其上安装了 CentOS Stream 9,其IP地址是 192.168.1.10。
于这台宿主机之上,我们会开展KVM的安装操作,且创建两台虚拟机,其中有一台充当着 Web服务器,在这两台的基础上,还有一台作为 数据库服务器。
1. 检查硬件虚拟化支持
egrep -c '(vmx|svm)' /proc/cpuinfo
> 返回结果大于0,说明CPU支持硬件虚拟化。
如果为0,请检查BIOS中是否启用了VT-x/AMD-V。
2. 安装KVM及相关工具
yum install -y qemu-kvm libvirt virt-install virt-manager bridge-utils
systemctl enable --now libvirtd
提醒,libvirtd,这个用于管理虚拟化的守护进程,一定要保证它在开机的时候能够自动启动。
分步实操:虚拟机创建与网络配置
第一步:配置桥接网络
要使得虚拟机具备和宿主机处于同一网段的独立IP,那我们就得去配置桥接网络。
编辑网络脚本(以ens33为例):
cat > /etc/sysconfig/network-scripts/ifcfg-br0 < /etc/sysconfig/network-scripts/ifcfg-ens33 <<EOF
TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
EOF
systemctl restart network
重启网络之后,要是宿主机出现失联的情况,那么很大概率是网卡配置存在错误,这就是排错思路。
能够借助带外管理手段(像是IPMI这种方式)来登录实施修复操作,或者去对ovs进行配置,从而形成备用方案的做法。
此处用bridge-utils方案最直观。
第二步:安装虚拟机
第一台虚拟机(Web01),是用virt-install命令来进行安装的。
virt-install
name web01
memory 2048
vcpus 2
disk path=/var/lib/libvirt/images/web01.qcow2,size=50,bus=virtio
network bridge=br0,model=virtio
os-variant centos-stream9
location /path/to/CentOS-Stream-9-latest-x86_64-dvd1.iso
extra-args "console=tty0 console=ttyS0,115200"
> 参数详解:
--disk:对指定磁盘路径以及大小予以明确,bus=virtio这种情况能够极大程度地让磁盘I/O性能得以提升。
将--network进行桥接,使其连接到br0,并且网卡类型选择为virtio。
`--extra-args`,这个选项用于开启串行控制台,其目的在于方便进行排错。
第二台,用于数据库的虚拟机,也就是db01,其安装的过程呢,和其他情况类似,需要分配2GB的内存,这样才行。
配置:LNMP环境搭建与域名解析
虚拟机创建完毕后,登录web01,配置LNMP环境。
在此处,我们运用 宝塔面板 来进行快速部署,然而,于生产环境里,我提议手动展开编译操作,或者运用RPM包,以此来精准把控版本以及参数。
1. 安装宝塔面板(可选)
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
留意,宝塔面板极大地简化了LNMP的安装事宜,不过会对部分系统配置作出修改。
要是对于安全性方面有着极其高的要求,那么建议逐个进行手动安装Nginx,建议逐个进行手动的安装MySQL了,还建议逐个进行手动来安装PHP。
2. 手动安装Nginx(以官方源为例)
cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
yum install -y nginx
systemctl enable --now nginx
3. 配置域名解析
若假定我们存在一个域名,此域名是 www.example.com,那么需要将其解析至 web01 的公网 IP。
在DNS服务商处添加A记录:
www.example.com. 600 IN A 192.168.1.11

需注意的关键之处在于,于此情形下的IP,势必要是虚拟机web01的IP地址才行,绝不是宿主机的IP。
如果是云环境,请绑定弹性公网IP。
高级配置:SSL/HTTPS与CDN加速
1. 申请与配置SSL证书
采用 Let's Encrypt 免费的证书,借助Certbot自动去获取。
yum install -y certbot python3-certbot-nginx
certbot --nginx -d www.example.com
Certbot会自动去修改Nginx配置,将其开启HTTPS,还会设置自动续期任务。
2. 接入CDN
把Cloudflare作为例子,把域名的NS记录朝着Cloudflare去指向,此后在Cloudflare的后台把SSL/TLS的“完全(严格)”模式给开启。
此刻,用户所产生的访问流量,先是经由CDN节点,而后再返回到我们的名为web01的服务器,如此一来,既能够实现访问速度的加快,又能够将真实的IP予以隐匿。
安全加固:虚拟机与系统防护
虚拟机层面的安全同样不容忽视:
1. 宿主机安全
SELinux:保持 enforcing 状态。
要是虚拟机网络出现异常状况,那就去检查audit.log,经由该项检查后再运用audit2allow以生成相应策略。
具备防护功能的墙:在宿主机那里,仅仅是针对管理IP才将ssh端口予以开放,而其他的端口,全部都采取DROP的策略。
2. 虚拟机安全
禁用以Root身份通过SSH进行登录:对“/etc/ssh/sshd_config”这份配置文件展开编辑操作,将“PermitRootLogin”这一参数设置为“no”。
配置fail2ban:防止暴力破解。
yum install -y epel-release fail2ban
cat > /etc/fail2ban/jail.local <<EOF
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
EOF
systemctl enable --now fail2ban
故障排查:一次虚拟化环境典型故障
问题:web01服务正常,但外网无法访问。
排查流程:
1. 在宿主机层面,去执行brctl show,以此来确认br0桥接处于正常状态;运用iptables -L -n去检查FORWARD链是不是允许流量能够通过。
KVM默认需要开启IP转发:
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
2. 处于虚拟机层面:进到web01里面,去查看nginx服务的状态,借助ss -tlnp | grep 443来确认端口监听情况;利用curl -I https://www.example.com实施本地回环测试。
3. 网络层面:于宿主机之上,借助tcpdump -i br0 host 192.168.1.11 展开抓包操作,以此查看是否存在源自于CDN节点的SYN包抵达。
如果没有,可能是域名解析或防火墙策略问题。
备份恢复:虚拟化环境的救命稻草
生产环境必须制定备份策略。
KVM虚拟机备份核心是 磁盘文件 和 配置文件。
1. 手动备份脚本
#!/bin/bash
# backup_kvm.sh
BACKUP_DIR="/backup/kvm"
DATE=$(date +%Y%m%d)
VM_LIST="web01 db01"
for VM in $VM_LIST; do
virsh dumpxml $VM > $BACKUP_DIR/$VM-$DATE.xml
cp /var/lib/libvirt/images/$VM.qcow2 $BACKUP_DIR/$VM-$DATE.qcow2
done
# 保留最近7天备份
find $BACKUP_DIR -type f -mtime +7 -delete
2. 恢复演练
# 恢复虚拟机定义
virsh define /backup/kvm/web01-20260304.xml
# 恢复磁盘文件(假设原磁盘损坏)
cp /backup/kvm/web01-20260304.qcow2 /var/lib/libvirt/images/web01.qcow2
# 启动虚拟机
virsh start web01
重要的是,在进行恢复之前,务必要保证新磁盘文件的SELinux上下文是正确无误的,或者在临时的情况下,借助chcon来加以调整。
总结
一路走来,从物理服务器迈向虚拟化环境,我们不但提高了资源的利用效率,而且凭借虚拟机隔离以及动态迁移等特性,为业务的高可用性奠定了基础。
文本历经桥接网络配置,接着是虚拟机安装,随后进行 LNMP 环境搭建,再开展安全加固,最后实施备份恢复,就此完整展现出一个生产环境项目的落地全部过程。
时至今日,云计算盛行,然而要知道,把控底层的服务器虚拟化技术,始终是每个投身运维工作的工程师得以立足的根本所在。
盼望着,这一实战教程,能够给你于企业里的虚拟化实施,送去具备价值的参考。
记着,于每一步开展操作之前,要多多进行思考,在每次排除错误之后,要多多予以总结,如此这般,技术才能够稳步地实现提升。

Comments NOTHING