PVE
1、简介
1.1 管理
优点:
1、多主结构,多个物理机加入集群使用同一界面进行管理不需要额外安装管理系统
2、使用独特的文件系统,将配置使用数据库持久化,同时副本保留在内存,一般轻松保持数千虚拟机
3、restfulapi 可以方便进行api调用来将其集成到第三方工具集(k8s进行pa)
4、基于角色得访问控制
5、认证方式多样,比如pam(使用goole令牌)账号密码等
1.2 存储
支持nfs,lvm,cephrbd(块设备) glusterfs等
1.3 备份
创建快照,包含数据和配置,实时备份
1.4 网络
默认使用桥接网络,pve主机内部起一个hub,将其桥接到物理网卡,所有的虚拟机再桥接到这个hub上
1.5 防火墙
灵活的防火墙策略,可以根据各种协议和端口,ip段进行过滤,配置在每一个vm或者容器上
2、安装
2.1 硬件
https://pve.proxmox.com/pve-docs/pve-admin-guide.html
CPU: Intel EMT64 or AMD64 with Intel VT/AMD-V (pcie直通技术需要cpu支持)
内存: OS和Proxmox VE服务至少需要2GB内存,外加为客户分配的内存。对于Ceph和ZFS,需要额外的内存;每TB使用的存储大约需要1GB内存。
硬盘: SSD
系统存储: 带电池保护的写缓存raid
虚拟机存储:
本地存储,支持带电支持的写缓存硬件raid,ceph等
网络存储:
2.2 下载
https://mirrors.tuna.tsinghua.edu.cn/proxmox/iso/
vt-x
虚拟化cpu性能
虚拟化iommu
2.3 性能测试
pveperf
![image-20240402194221523]()
3、主机管理
3.1 仓库管理
echo > /etc/apt/sources.list
vi /etc/apt/sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
rm -rf /etc/apt/sources.list.d/pve-enterprise.list
wget http://mirrors.ustc.edu.cn/proxmox/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
echo "deb http://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription" >/etc/apt/sources.list.d/pve-install-repo.list
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-quincy bookworm no-subscription" > /etc/apt/sources.list.d/ceph.list
sed -i.bak "s#http://download.proxmox.com/debian#https://mirrors.ustc.edu.cn/proxmox/debian#g" /usr/share/perl5/PVE/CLI/pveceph.pm
sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js && systemctl restart pveproxy.service
apt update && apt-get install -y apt-transport-https ca-certificates --fix-missing
apt update && apt dist-upgrade
3.2 网络设置
vim /etc/network/interfaces ifreload -a 加载
通过web界面
网卡
enxx
ethxx
网桥
vmbrxx
bonds
bondx
vlans
vlan号
系统命名规范
o<index>[n<phys_port_name>|d<dev_port>] 板载设备
s<slot>[f<function>][n<phys_port_name>|d<dev_port>] 按热插拔ID的设备
[P<domain>]p<bus>s<slot>[f<function>][n<phys_port_name>|d<dev_port>] 按总线ID分组设备
自定义命名将其与设备进行链接
/etc/systemd/network/<n>-<id>.link
/etc/systemd/network/10-enwan0.link
[Match]
MACAddress=aa:bb:cc:dd:ee:ff 将设备的mac地址进行链接重新命名
[Link]
Name=enwan0
修改/etc etwork/interfaces并重启节点
3.3 时间同步服务
apt install ntpdate
ntpdate cn.pool.ntp.org
vim /etc/chrony/chrony.conf
server cn.pool.ntp.org iburst
server $ip iburst
maxdistance 60000000.0
systemctl restart chronyd
3.4 底层存储检测
smartctl -a /dev/sdX
smartctl -s on /dev/sdX
3.5 证书管理
3.5.1 创建acme
![image-20240403165729449]()
3.5.2 配置阿里dns
![image-20240406125826025]()
![image-20240406125847630]()
3.5.3 配置自动获取
您必须接受 Let's Encrypt 的 ToS 才能注册帐户。
节点的端口 80 需要从互联网上访问。
端口80上必须没有其他侦听器。
请求的(子)域需要解析到节点的公共IP
4、集群管理
依赖
1、所有节点必须能够通过UDP端口5405-5412相互连接, 以便corosync工作
2、日期和时间必须同步
3、在节点之间需要一个 TCP 端口 22 上的 SSH 隧道
4、高可用最少需要三个节点
5、使用专用的网卡进行传输,如果使用共享存储
6、添加节点时需要集群节点的根密码
7、保证所有主机cpu型号一致
8、做好hosts解析
4.1 创建集群
注意集群创建可以选择多个网络作为备用,注意对延迟很敏感,有条件可以上一个专用网卡,数据流量倒是不大
![image-20240402194700357]()
4.2 加入节点
![image-20240402194840212]()
![image-20240402195248591]()
4.3 删除节点
1、将节点关机
2、移出
pvecm nodes 查看node名称
pvecm delnode $name
3、重新加入集群需要重装系统并删除 /etc/pve/nodes/$name
在新节点上执行 pvecm updatecerts 以更新key文件
4.4 集群网络配置
1、集群网络需要lan延迟低于5ms
2、可以根据要求进行多网卡多链路分开使用,发挥最大的性能
集群网络
迁移网络
vm网络
![image-20240402201134018]()
![image-20240402231217546]()
修改配置文件(集群会自动同步pve目录下的配置文件)
vi /etc/pve/corosync.conf
logging {
debug: off
to_syslog: yes
}
nodelist {
node {
name: node1
nodeid: 1
quorum_votes: 1
ring0_addr: 192.168.10.31
ring1_addr: 172.31.3.31
}
node {
name: node2
nodeid: 2
quorum_votes: 1
ring0_addr: 192.168.10.32
ring1_addr: 172.31.3.31
}
node {
name: node3
nodeid: 3
quorum_votes: 1
ring0_addr: 192.168.10.33
ring1_addr: 172.31.3.31
}
}
quorum {
provider: corosync_votequorum
}
totem {
cluster_name: gongji
config_version: 3
interface {
linknumber: 0
}
ip_version: ipv4-6
link_mode: passive
secauth: on
version: 2
}17
ansible -i hosts/pvecluster all -m copy -a "src=./corosync.conf dest=/etc/pve/corosync.conf"
ansible -i hosts/pvecluster all -m shell -a "systemctl restart corosync"
5、存储
支持块存储和文件存储,通常文件存储更为推荐
nfs
ceph
lvm
zfs
5.1 存储配置
/etc/pve/storage.cfg
node 允许那些节点访问此存储
content
images 虚拟机镜像
rootdir 允许存储容器数据
vztmpl 容器模板
backup 备份文件
iso iso镜像文件
snippets
shared 共享存储
disable 禁用存储
format 指定images存储格式raw|qcow2|vmdk
5.2 卷
使用一个特殊的符号来访问存储数据
一个卷由标识,后面跟着一个存储类型相关的卷名 比如
local:230/example-image.raw 表示使用local 属于vm230
5.3 NFS
5.3.1 添加
vim /etc/pve/storage.cfg
nfs: nfs-test
export /nexus/nfs/k8s/nginx
path /mnt/pve/nfs-test
server 172.31.3.111
content images
prune-backups keep-all=1
![image-20240404114222987]()
![image-20240404114302788]()
6、虚拟机
6.1 创建虚拟机
6.1.1 常规设置
节点: 选择在哪个物理机上创建虚拟机
资源池: 一组逻辑上的资源集合,比如可以将虚拟机进行分类管理,这里我们使用k8s环境作为分组依据
vmid: 一个数字不允许相同
名称: 自定义一个虚拟机名称用来方便用户进行识别
开机启动: 设定为物理机启动后直接启动
![image-20240404121613363]()
6.1.2 操作系统设置
存储: 指定镜像的存储位置
类型: linux
版本: 内核版本
iso镜像: 我们安装所需要的镜像,一般存储在指定存储勾选即可
![image-20240404122030666]()
6.1.3 系统
scsi控制器:
qemu代理:pve可以更智能的显示信息与操作,比如关闭和快照
bios:
OVMF 若使用pcie直通需要使用此选项
机型:
q35:提供了一个虚拟PCIe总线,使用pcie硬件需要使用此选项
![image-20240405093847623]()
6.1.4 硬盘
开启io线程,用专门线程处理io 提高性能,存储和大小自选即可
格式:
QEMU映像格式是一种写入复制格式,它允许快照和薄的磁盘映像供应。
原始磁盘映像是硬盘的位对位映像,类似于在Linux中对块设备执行dd命令时得到的结果 不支持快照但性能快10%左右
VMware格式,可以将其导入到其他虚拟机
缓存:
无:当每个块到达物理存储写队列时,将忽略主机页缓存,通知客户系统写操作完成比较均衡的模式,推荐使用
备份:若pve备份时要跳过此磁盘那么可以不勾选
ssd仿真: 在主机以ssd盘格式进行展示
![image-20240405094800986]()
6.1.5 CPU
cpu限制: 1代表100% 比如我们使用4个核心 那么当同时使用多个cpu时,每个cpu仅能允许被使用1/4=25%的cpu时间分配,但当我们使用1个核心时还是可以使用100%的时间分配
权重: 多个虚拟机使用cpu时会根据权重来划分时间
cpu绑定: 支持0-1,8-12 这种写法或 1,2,3 这种写法,将虚拟机只运行在这几个cpu上 在不超卖的情况下可以达到最佳性能
cpu类别:默认即可
numa:内存不是全局共享给所有内核,而是分布到每个插槽附近的本地内存池中。 这可以带来速度提升,如果使用NUMA选项,建议将套接字的数量设置为主机系统的节点数量
![image-20240405101026576]()
6.1.6 内存
![image-20240405102218945]()
6.1.7 网络
桥接: 指定桥接网络
模型: virtio 具备最高性能
Multiqueue: 允许客户操作系统使用多个虚拟CPU处理网络数据包,从而增加传输数据包的总数
当使用Multiqueue时,建议将其设置为等于您的客户机的vCPU数量的值
只有当VM必须处理大量的传入连接时才设置此选项,例如当VM作为路由器、反向代理或繁忙的HTTP服务器进行长时间轮询时
mac地址: 可以自定义或者使用自动分配
![image-20240405102357436]()
6.1.8 其他设置
显示: virtio-gl,通常称为VirGL,是一个虚拟3D GPU,用于VMs内部, 可以将工作负载卸载到主机GPU上,而不需要特殊(昂贵的)模型和驱动程序,也不完全绑定主机GPU,允许在多个客户和/或主机之间重用。 需要安装对应的库文件 apt install libgl1 libegl1
添加选项: 可以添加多个设备,类似向物理机加入新的硬件,可以使用直通或者虚拟化
常用的包括使用pcie直通需要添加一个uefi引导程序专用盘
![image-20240405103732106]()
开机自启动
开关机顺序:数字越小优先级越高,相反也是最后关闭
代理: 在虚拟机运行一个程序,允许物理机向其发出命令进行通信
![image-20240405104506918]()
6.2 虚拟机迁移
6.2.1 热迁移
前置条件:
没有配置本地绑定的资源
6.2.2 离线迁移
所有的磁盘都在两个主机上定义的存储上
通过网络将磁盘复制到目标主机
硬件直通配置可能需要重新配置目标主机上的设备位置
6.3 副本和克隆
6.3.1 完整克隆
相当于复制了一个新的副本,每个虚拟机都具有独立的资源
6.3.2 链接克隆
创建一个链接副本,初始内容相同,但修改会从最新位置写入copyinwrite,注意的是本方法必须保证原始副本只读,否则会引起问题
6.4 pcie直通
可以让虚拟机从主机控制PCI设备。这比使用虚拟化硬件有更多的优势,例如更低的延迟、更高的性能或更多的功能(例如卸载)
PCI passthrough对于i440fx和q35机器是可用的
PCIe passthrough只在q35机器上可用
6.4.1 前置要求
硬件需要支持 IOMMU(I/O 内存管理单元)中断重映射,这包括 CPU 和主板
具有pci设备地址
开启IOMMU
6.4.1.1 iommu功能开启
vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
update-grub
reboot
dmesg | grep -e DMAR -e IOMMU
vim /etc/modules
vfio
vfio_iommu_type1
vfio_pci
update-initramfs -u -k all
lsmod | grep vfio
dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
6.4.2 GPU直通
当通过整个GPU或vGPU并需要图形输出时,必须将显示器物理连接到卡上,或在来宾内配置远程桌面软件(例如,VNC或RDP)。若只是要cuda或者openCL则不需要
6.4.3 主机配置
硬件设备一旦设为直通,主机将不能再使用
有以下两种方法实现,均需更新initramfs文件
update-initramfs -u -k all && reboot
6.4.3.1 将设备IDs作为参数传递给vfio-pci模块
# 查看设备id
lcpci -nn
# 在/etc/modprobe.d/下使用 **.conf文件
options vfio-pci ids=1234:5678,4321:8765 # ids 后面的即为我们想要传递进去的设备id
6.4.3.2 对主机进行驱动屏蔽
blacklist DRIVERNAME
lspci -k
02:05.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
DeviceName: Ethernet1
Subsystem: VMware PRO/1000 MT Single Port Adapter
Kernel driver in use: e1000
Kernel modules: e1000
6.4.3.3 故障排除
如果这不起作用,你可能需要设置一个软依赖项来加载vfio-pci之前加载gpu模块
echo "softdep <some-module> pre: vfio-pci" >> /etc/modprobe.d/<some-module>.conf
6.4.4 虚拟机配置
6.4.4.1 GPU
1、当使用q35作为机器类型时,OVMF(UEFI for VMs)而不是SeaBIOS,PCIe而不是PCI时,可以达到最佳兼容性
2、想使用OVMF进行GPU通透,GPU需要有一个UEFI功能的ROM,否则使用SeaBIOS
参考链接: https://pve.proxmox.com/wiki/PCI_Passthrough
git clone https://github.com/awilliam/rom-parser
cd rom-parser
make
cd /sys/bus/pci/devices/0000:01:00.0/
echo 1 > rom
cat rom > /tmp/image.rom
echo 0 > rom
./rom-parser /tmp/image.rom
3、此外,使用OVMF,禁用VGA
echo "options vfio-pci ids=<vendor-id>,<device-id> disable_vga=1" > /etc/modprobe.d/vfio.conf
6.4.5 SR-IOV
硬件虚拟化功能,允许单个设备向系统提供多个VF(虚拟功能),每个VF都可以在不同的VM中使用,具有完整的硬件功能,并且比软件虚拟化设备具有更好的性能和更低的延迟
常用于网卡设备
6.4.5.1 实现方法
1、
vim /etc/modprobe.d/*.conf
max_vfs=4
2、
echo 4 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
要使这个更改持久化,您可以使用'sysfsutils` Debian 包。 安装后,通过 /etc/sysfs.conf 或 /etc/sysfs.d/ 中的 `FILE.conf` 配置它。
6.4.6 中介设备(vGPU,GVT-g)
常用于GPU 物理卡就可以创建虚拟卡,类似于SR-IOV。 区别在于,介质设备不会在主机中显示为PCI(e)设备,并且只适合在虚拟机中使用。
6.4.6.1 实现
ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types
available_instances 包含该类型的可用实例数量,VM中每个mdev的使用都会减少该实例数量
description 包含关于类型功能的简短描述。
create 是创建设备的端点,如果配置了带有 mdev 的 hostpciX 选项,Proxmox VE 会自动为您创建设备
7、网络
7.1 zone
一个区域定义了一个虚拟的分离网络,区域被限制到特定的节点和分配的权限将用户限制到特定的区域及其包含的VNet。
7.1.1 实现
Simple:隔离桥接器,一个简单的3层路由桥接器(NAT)
相当于物理机上起了一个网桥可以将本地虚拟机进行nat
VLAN:虚拟局域网是划分局域网的经典方法。
将不同物理机链接到一个三层设备并进行vlan划分
QinQ:栈式VLAN(正式名称为IEEE 802.1ad)
VXLAN: 通过UDP隧道的第二层VXLAN网络
EVPN(BGP EVPN):使用BGP建立第三层路由的VXLAN
相对于一个路由器,可以链接不同的网段
![image-20240406131053792]()
7.1.2 选项
节点:应该部署区域和相关VNet的节点
IPAM: 使用什么管理ip 默认时pve
dns dns服务器地址
![image-20240406131220241]()
7.2 vnet
id 一个最多8个字符的ID来识别VNet
别名 更具描述性的标识符。在接口上作为别名分配。可选。
zone 这个VNet的关联区域
tag 唯一的VLAN或VXLAN ID
vlan感知 在接口上启用vlan感知选项,允许在客户机中进行配置
![image-20240406132049086]()
7.3 子网
子网可以用于:
限制您在特定VNet上定义的IP地址
在VNet中分配3层区域的路由/网关
在VNet的第3层区域中启用SNAT
通过IPAM插件自动分配虚拟主机(VM或CT)上的IP地址
通过DNS插件进行DNS注册
id 一个CIDR网络地址,例如172.31.3.0/28
gateway 网络默认网关的IP地址。在第3层区域(Simple/EVPN插件),它将部署在VNet上
snat 启用源NAT,允许VNet内部的VM通过将数据包转发到节点的出站接口连接到外部网络。在EVPN区域,转发是在EVPN网关节点上完成的。 可选
dns前缀 在域名注册中添加前缀,如.prefix.
![image-20240406132232752]()
8 、防火墙
8.1 集群防火墙
8.1.1 打开
9、高可用
9.1 依赖
至少三个集群节点
VMs和容器的共享存储
硬件冗余
使用可靠的“服务器”组件(保障硬件的可用性)
硬件看门狗 或者 linux内核软件看门狗(watchdog子系统是内核为保证系统正常运行,将系统从死循环或者死锁等状态中退出并重启的一种机制)
9.2 资源(resource)
由ha管理器管理的资源,由资源类型和标识构成 例如vm:100 表示编号为100的虚拟机
一般情况 ha只管理虚拟机或者容器,其他软件服务应该集成在虚拟机或容器中
9.3 工作原理
日志:journalctl -u pve-ha-lrm
管控节点服务,读取请求状态,执行下发的命令 可以参考kubelet LRM
三种状态
wait for agent lock 等待分配锁,若不配置ha服务,那么处于空闲状态
active 活跃的 已拿到锁并配置了服务,进入活动状态后,它会读取/etc/pve/ha/manager_status文件中的管理器状态,并决定为其拥有的服务执行哪些命令。 每个命令都会启动一个worker进程,这些worker进程并行运行,默认情况下最多限制为4个。这个默认设置可以通过数据中心配置键max_worker进行更改。 当worker进程完成后,将收集它并为CRM保存结果 每个由CRM请求的命令都有一个唯一的UID。当worker完成时,它的结果将被处理并写入LRM状态文件/etc/pve odes/$nodename/lrm_status。在那里,CRM可以收集它并让其状态机(与命令输出相关)对其进行处理。
lost agent lock lrm故障,失去了锁
做出集群层面决策,向本地资源管理器下发命令,处理结果,进行故障转移
锁:
一种编程语言中的概念,可以理解为一种权限,拥有锁相当于拥有权限
在pve中锁由pmxfs提供,保证每个LRM都只激活一次并工作
当节点出问题的时候可以由crm获得其锁将其标记为隔离状态,从而恢复在其上的服务,而不受其影响
三种状态
wait for agent lock 等待锁,若无服务处于空闲状态
active 活跃的 已拿到锁并配置了服务
lost agent lock crm发生故障丢失锁
9.4 服务状态
CRM 可以记录服务状态 可以手动改变状态达到管理目的和根据反馈的状态来判断问题
stopped 服务已停止 由lrm上报确认 若检测到一个停止的服务运行,那么将再次将其停止
request_stop 服务应该停止 CRM命令已下发待lrm确认
stopping 正在停止中 CRM在等待lrm上报状态信息
started 服务已经开始并将其置于active,若服务还没运行,lrm应该将其启动并上报状态,检测不到lrm则重启该服务
starting 已经开始 等待lrm上报状态 但是CRM还没有从LRM那里得到任何服务正在运行的确认
fence 隔离状态 等待节点隔离 隔离完成后将恢复服务
recovery 正在进行故障转移 ha管理节点尝试将服务调度到一个新的节点
freeze 请勿操作,常见于重启或者重启lrm进程
ignored 使服务暂时不收ha管控但不将其剔除配置中,可以理解为临时的特权模式,方便我们对其进行完全的管控
migrate 迁移中
error 错误,常见于lrm问题服务呗禁用
queued 队列中,服务已添加但crm还未进行处理
disabled 服务禁止并被标记为禁用
9.5 ha配置
max_relocate:当服务启动失败时,尝试重定位服务的最大次数,可以理解为将其调度到其他节点的尝试次数
max_restart:调度成功后机器重启次数
nofailback 可以理解为节点绑定不允许根据集群状态动态调度到更好的节点
restricted 虚拟机绑定一个组后,只能运行在组定义的主机上若无主机在线,那么将其置于停止状态,若不开启此选项,那么可以被调度到任一允许的节点,但当组定义的节点恢复后会重新调度到定义的节点上
10、备份和恢复
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下