Skip to content

Proxmox VE 运维面试手册

适用岗位: 系统管理员、运维工程师、虚拟化架构师
难度级别: 初级 → 中级 → 高级 → 专家
更新日期: 2026-08-26


目录

  1. 初级面试题 (1-2 年经验)
  2. 中级面试题 (3-5 年经验)
  3. 高级面试题 (5-8 年经验)
  4. 专家面试题 (8+ 年经验)
  5. 场景题与故障排查
  6. 实战操作题

初级面试题

Q1: 什么是 Proxmox VE?它有哪些核心组件?

答案:

Proxmox Virtual Environment (PVE) 是一个开源的企业级虚拟化管理平台,基于 Debian Linux,集成了多种虚拟化技术。

核心组件:

  1. KVM - 基于内核的虚拟机,提供全虚拟化(硬件虚拟化)
  2. LXC - Linux 容器,提供操作系统级虚拟化
  3. pmxcfs - Proxmox 集群文件系统,用于存储集群配置
  4. Corosync - 集群通信和消息传递
  5. pveproxy - Web UI 和 API 代理服务 (端口 8006)
  6. pvedaemon - 后端任务执行服务
  7. pvestatd - 状态收集守护进程

关键服务:

bash
systemctl status pveproxy      # Web UI
systemctl status pvedaemon     # 后端服务
systemctl status pvestatd      # 状态收集
systemctl status corosync      # 集群通信
systemctl status pve-ha-lrm    # HA 本地资源管理
systemctl status pve-ha-crm    # HA 集群资源管理

Q2: PVE 与 VMware vSphere、Hyper-V 有什么区别?

答案:

特性PVEVMware vSphereHyper-V
开源✅ 完全开源❌ 商业软件❌ 微软产品
成本免费高昂 (按 CPU 授权)中等 (Windows 授权)
集群✅ 内置✅ 需 vCenter✅ 需 SCVMM
容器支持✅ LXC 原生❌ 不支持⚠️ 有限支持
存储集成✅ Ceph/ZFS 原生✅ vSAN (额外购买)✅ Storage Spaces
备份✅ PBS 内置❌ 需 Veeam 等❌ 需第三方
Web UI✅ 内置✅ vCenter✅ Windows Admin
API✅ REST API✅ PowerCLI✅ PowerShell
学习曲线中等中等

优势对比:

  • PVE: 开源免费、功能完整、社区活跃、适合中小企业
  • VMware: 企业级成熟、生态丰富、技术支持强、成本高
  • Hyper-V: 与 Windows 集成好、成本较低、功能有限

Q3: 如何安装 PVE?有哪些安装方式?

答案:

方式 1: ISO 安装(推荐)

bash
# 1. 下载 ISO
wget https://www.proxmox.com/en/downloads/proxmox-virtual-environment/iso/proxmox-ve-8.2-1.iso

# 2. 制作启动盘
dd if=proxmox-ve-8.2-1.iso of=/dev/sdX bs=1M status=progress

# 3. BIOS 设置
# - 启用 VT-x/AMD-V (CPU 虚拟化)
# - 启用 VT-d/IOMMU (PCI 直通)
# - UEFI 模式启动

# 4. 安装过程
# - 选择目标磁盘 (推荐 ZFS RAID1)
# - 设置时区、root 密码、邮箱
# - 配置网络 (静态 IP)
# - 完成后重启

方式 2: Debian + PVE 源

bash
# 1. 安装 Debian 12 最小化
# 2. 配置静态 IP
# 3. 添加 PVE 源
echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" \
  > /etc/apt/sources.list.d/pve-no-subscription.list

# 4. 添加 GPG key
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg \
  -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg

# 5. 安装 PVE
apt update && apt install proxmox-ve postfix open-iscsi chrony -y

# 6. 重启
reboot

安装后访问: https://<PVE-IP>:8006


Q4: 如何创建和启动虚拟机?

答案:

CLI 方式:

bash
# 1. 创建 VM
qm create 100 \
  --name "web-server" \
  --memory 4096 \
  --cores 2 \
  --sockets 1 \
  --cpu host \
  --numa 1 \
  --net0 virtio,bridge=vmbr0 \
  --scsihw virtio-scsi-pci \
  --scsi0 local-lvm:32,cache=writeback,discard=on \
  --boot order=scsi0 \
  --ostype l26 \
  --agent enabled=1

# 2. 导入 ISO
qm set 100 --ide2 local:iso/ubuntu-22.04.iso,media=cdrom

# 3. 启动
qm start 100

# 4. 查看状态
qm status 100
qm list

Web UI 方式:

  1. 登录 https://<PVE-IP>:8006
  2. 选择节点 → Create VM
  3. 填写名称、内存、CPU、磁盘、网络
  4. 选择 ISO 镜像
  5. 点击 Finish → Start

常用命令:

bash
qm start <vmid>        # 启动
qm shutdown <vmid>     # 优雅关机
qm stop <vmid>         # 强制停止
qm reboot <vmid>       # 重启
qm list                # 列出所有 VM
qm status <vmid>       # 查看状态

Q5: PVE 支持哪些存储类型?如何选择?

答案:

存储类型性能可靠性成本适用场景
Local★★★★★★★测试、临时存储
LVM-Thin★★★★★★★★★单机生产
ZFS★★★★★★★★★★★★★单机生产 (推荐)
Ceph★★★★★★★★★★★★★集群 (推荐)
NFS★★★★★★★★简单共享存储
iSCSI★★★★★★★★★★★企业 SAN

选择建议:

  • 单机生产: ZFS (镜像/RAIDZ) + 快照
  • 集群生产: Ceph (3 副本) + 高可用
  • 备份存储: NFS/iSCSI + PBS
  • 开发测试: Local + LVM-Thin

ZFS 优势:

  • 数据完整性校验
  • 压缩 (lz4)
  • 快照 (秒级)
  • 镜像/RAIDZ

Ceph 优势:

  • 分布式存储
  • 自动副本
  • 高可用
  • 在线扩容

Q6: 如何配置 PVE 网络?

答案:

基础网络配置 (/etc/network/interfaces):

bash
# Loopback
auto lo
iface lo inet loopback

# 管理网络 (PVE Web UI + SSH)
auto eth0
iface eth0 inet manual

auto vmbr0
iface vmbr0 inet static
    address 192.168.1.11/24
    gateway 192.168.1.1
    bridge-ports eth0
    bridge-stp off
    bridge-fd 0

# VM 业务网络
auto eth1
iface eth1 inet manual

auto vmbr1
iface vmbr1 inet manual
    bridge-ports eth1
    bridge-stp off
    bridge-fd 0

VLAN 配置:

bash
# Bridge VLAN-aware
auto vmbr1
iface vmbr1 inet manual
    bridge-ports eth1
    bridge-stp off
    bridge-fd 0
    bridge-vlan-aware yes
    bridge-vids 2-4094

# VM 指定 VLAN
qm set 100 --net0 virtio,bridge=vmbr1,tag=10

Bonding (链路聚合):

bash
# LACP 802.3ad
auto bond0
iface bond0 inet manual
    bond-slaves eth0 eth1
    bond-mode 802.3ad
    bond-xmit-hash-policy layer2+3

auto vmbr0
iface vmbr0 inet static
    address 192.168.1.11/24
    gateway 192.168.1.1
    bridge-ports bond0

重启网络:

bash
systemctl restart networking
# 或
ifreload -a

Q7: 如何备份和恢复虚拟机?

答案:

备份:

bash
# 1. 手动备份
vzdump 100 --mode snapshot --compress zstd --storage nas-backup

# 2. 批量备份
vzdump 100 101 102 --mode snapshot --compress zstd

# 3. 备份所有 VM
vzdump --all --mode snapshot --exclude 100,101

# 4. 定时备份 (Web UI)
# Datacenter → Backup → Add
#   Schedule: 每天 02:00
#   Mode: Snapshot
#   Compression: ZSTD
#   Retention: keep-daily=7, keep-weekly=4, keep-monthly=6

恢复:

bash
# 1. 恢复单个 VM
qmrestore /var/lib/vz/dump/vzdump-qemu-100-2026_08_26-02_00_00.vma.zst 100

# 2. 恢复到不同 VMID
qmrestore /var/lib/vz/dump/vzdump-qemu-100-2026_08_26-02_00_00.vma.zst 200

# 3. 恢复到不同存储
qmrestore /var/lib/vz/dump/vzdump-qemu-100-2026_08_26-02_00_00.vma.zst 100 --storage local-lvm

PBS (Proxmox Backup Server):

bash
# 安装 PBS
apt install proxmox-backup-server

# PVE 添加 PBS 存储
# Datacenter → Storage → Add → Proxmox Backup Server
#   Server: pbs01.example.com
#   Datastore: backup-store
#   User: admin@pbs

Q8: 如何创建和管理快照?

答案:

创建快照:

bash
qm snapshot 100 daily-backup --description "auto backup before update"

列出快照:

bash
qm listsnapshot 100

恢复快照:

bash
qm rollback 100 daily-backup

删除快照:

bash
qm delsnapshot 100 daily-backup

注意事项:

  • 快照会占用额外空间 (COW)
  • 不要保留太多快照 (影响性能)
  • 定期清理旧快照
  • 快照不是备份!

自动快照脚本:

bash
#!/bin/bash
# /usr/local/bin/auto-snapshot.sh
VMID=$1
KEEP=24  # 保留 24 个快照

# 创建快照
qm snapshot $VMID hourly-$(date +%Y%m%d%H) --description "auto"

# 清理旧快照
qm listsnapshot $VMID | grep hourly | sort | head -n -$KEEP | awk '{print $2}' | while read snap; do
  qm delsnapshot $VMID $snap
done

Q9: PVE 集群是什么?如何创建?

答案:

PVE 集群:

  • 基于 Corosync + Pacemaker
  • 共享配置文件 (/etc/pve)
  • 高可用 (HA)
  • 在线迁移
  • 最少 3 节点 (防脑裂)

创建集群:

bash
# === 在第一个节点 (pve01) ===
pvecm create mycluster \
  --link0 192.168.1.11 \
  --bindnet0_addr 192.168.1.11

# 查看状态
pvecm status
pvecm nodes

加入集群:

bash
# === 在其他节点 (pve02, pve03) ===
pvecm add 192.168.1.11 \
  --link0 <本机IP> \
  --use_ssh

# 验证
pvecm status
pvecm nodes

集群要求:

  • 所有节点时间同步 (chrony/ntp)
  • 网络延迟 < 2ms
  • 奇数节点 (3, 5, 7...)
  • 2 节点必须配 QDevice

Q10: 什么是 Quorum?为什么重要?

答案:

Quorum (法定人数):

  • 集群中需要多数节点在线才能正常运作
  • 防止脑裂 (split-brain)
  • 公式: Quorum = (N / 2) + 1

示例:

  • 3 节点集群: Quorum = 2
  • 5 节点集群: Quorum = 3
  • 7 节点集群: Quorum = 4

查看 Quorum:

bash
pvecm status
# Expected votes: 3
# Total votes: 3
# Quorum: 2

Quorum 丢失:

bash
# 紧急恢复 (单节点)
pvecm expected 1  # 危险! 仅用于恢复

# 或添加 QDevice
pvecm qdevice setup <qdevice-ip>

脑裂防护:

  • 使用奇数节点
  • 配置冗余网络 (link0 + link1)
  • 使用 QDevice (2 节点集群)
  • 配置 Fencing (watchdog)

中级面试题

Q11: 如何配置 PVE 高可用 (HA)?

答案:

HA 架构:

┌─────────────────────────────────────────────────┐
│  CRM (Cluster Resource Manager) - Master 节点   │
│  - 决策资源分配和迁移                            │
└─────────────────────────────────────────────────┘
         ↓              ↓              ↓
   ┌──────────┐   ┌──────────┐   ┌──────────┐
   │  LRM     │   │  LRM     │   │  LRM     │
   │ (pve01)  │   │ (pve02)  │   │ (pve03)  │
   │ 本地管理  │   │ 本地管理  │   │ 本地管理  │
   └──────────┘   └──────────┘   └──────────┘

配置步骤:

  1. 创建 HA 组:
bash
ha-manager groupadd prefer_pve01_02 \
  --nodes pve01:2,pve02:1,pve03:0 \
  --nofailback 0 \
  --restricted 0

# 参数说明:
# - nodes: 节点:优先级 (数字越大越优先)
# - nofailback: 1=不自动迁回高优先级节点
# - restricted: 1=只能运行在组内节点
  1. 将 VM 加入 HA:
bash
ha-manager add vm:100 \
  --group prefer_pve01_02 \
  --state started \
  --max_restart 3 \
  --max_relocate 2

# 参数说明:
# - state: started/stopped/enabled/disabled
# - max_restart: 节点内最大重启次数
# - max_relocate: 最大迁移次数
  1. 查看 HA 状态:
bash
ha-manager status
ha-manager status vm:100
  1. 手动迁移:
bash
ha-manager migrate vm:100 pve02
  1. 临时禁用 HA (维护时):
bash
ha-manager set vm:100 --state disabled

HA 工作流程:

  1. 节点故障 → CRM 检测到
  2. 等待 shutdown_timeout (默认 60s)
  3. 标记为 fenced
  4. 资源迁移到其他节点
  5. fenced 节点触发 watchdog 重启

Q12: 什么是 Fencing?PVE 如何实现 Fencing?

答案:

Fencing:

  • 隔离故障节点,防止数据损坏
  • 确保集群数据一致性
  • 避免脑裂场景

PVE Fencing 机制: PVE 使用 Watchdog Fencing:

  1. 配置 Watchdog:
bash
echo "softdog" >> /etc/modules
update-initramfs -u
systemctl restart watchdog-mux
  1. 工作流程:
节点失联 

CRM 等待 shutdown_timeout (60s)

标记为 fenced

资源迁移到其他节点

fenced 节点触发 watchdog 重启

节点重启后重新加入集群
  1. 手动 Fencing:
bash
# 危险! 会重启节点
ha-manager crm-command node-fence pve02 1
  1. 查看 Fencing 状态:
bash
journalctl -u pve-ha-crm -f
ha-manager status

其他 Fencing 方式 (不常用):

  • IPMI Fencing: 通过 IPMI 强制关机
  • PDU Fencing: 通过智能 PDU 断电

Q13: 如何配置 Ceph 存储?

答案:

Ceph 架构:

┌─────────────────────────────────────────────────┐
│              Ceph Cluster                        │
│                                                  │
│  ┌──────────┐   ┌──────────┐   ┌──────────┐    │
│  │  MON     │   │  MON     │   │  MON     │    │
│  │ (pve01)  │   │ (pve02)  │   │ (pve03)  │    │
│  └──────────┘   └──────────┘   └──────────┘    │
│                                                  │
│  ┌──────────┐   ┌──────────┐   ┌──────────┐    │
│  │  OSD     │   │  OSD     │   │  OSD     │    │
│  │ (pve01)  │   │ (pve02)  │   │ (pve03)  │    │
│  │ /dev/sdb │   │ /dev/sdb │   │ /dev/sdb │    │
│  └──────────┘   └──────────┘   └──────────┘    │
└─────────────────────────────────────────────────┘

配置步骤:

  1. 安装 Ceph (每个节点):
bash
pveceph install
  1. 创建 Ceph 集群 (pve01):
bash
pveceph create \
  --network 10.0.1.0/24 \
  --cluster-network 10.0.2.0/24

# 参数说明:
# - network: Public 网络 (客户端访问)
# - cluster-network: Cluster 网络 (OSD 复制)
  1. 添加 OSD (每个节点):
bash
pveceph osd create /dev/sdb
pveceph osd create /dev/sdc
  1. 创建 Pool:
bash
pveceph pool create vm-disks \
  --pg_num 128 \
  --pgp_num 128 \
  --application rbd \
  --size 3 \
  --min_size 2

# 参数说明:
# - pg_num: Placement Group 数量
# - size: 副本数 (3 推荐)
# - min_size: 最小副本数 (2, 允许降级)
  1. 创建 CephFS:
bash
pveceph fs create \
  --name cephfs \
  --pg_num 64 \
  --add-storage
  1. 查看状态:
bash
ceph -s
ceph osd tree
ceph osd status
ceph df
  1. 在 PVE 添加存储:
bash
# Web UI: Datacenter → Storage → Add → RBD/CephFS
#   ID: ceph-vm
#   Pool: vm-disks
#   Content: Disk image

Ceph 调优:

bash
# 调整 PG 数量
ceph osd pool set vm-disks pg_num 256
ceph osd pool set vm-disks pgp_num 256

# 查看健康状态
ceph health detail

Q14: 如何配置 ZFS 存储?

答案:

ZFS 优势:

  • 数据完整性校验 (checksum)
  • 压缩 (lz4, zstd)
  • 快照 (秒级)
  • 镜像/RAIDZ
  • 在线扩容

配置步骤:

  1. 创建 ZFS Pool:
bash
# 镜像 (推荐)
zpool create -f -o ashift=12 \
  rpool mirror /dev/sda /dev/sdb

# RAIDZ1 (类似 RAID5)
zpool create -f -o ashift=12 \
  rpool raidz /dev/sda /dev/sdb /dev/sdc

# RAIDZ2 (类似 RAID6)
zpool create -f -o ashift=12 \
  rpool raidz2 /dev/sda /dev/sdb /dev/sdc /dev/sdd
  1. 创建数据集:
bash
zfs create rpool/data
zfs set compression=lz4 rpool/data
zfs set atime=off rpool/data
  1. 创建 VM 存储:
bash
# Zvol (块设备, VM 磁盘)
zfs create -V 100G rpool/vm-disks

# 文件系统 (ISO/模板)
zfs create rpool/vm-data
  1. 在 PVE 添加存储:
bash
# Web UI: Datacenter → Storage → Add → ZFS (Thin Provisioning)
#   ID: zfs-local
#   ZFS Pool: rpool/data
#   Content: Disk image, Container
#   Thin provision: Yes
  1. ZFS 优化:
bash
# 限制 ARC 缓存
cat >> /etc/modprobe.d/zfs.conf << 'EOF'
options zfs zfs_arc_max=8589934592  # 8GB
options zfs zfs_prefetch_disable=1  # SSD 禁用预读
EOF

update-initramfs -u
  1. 常用命令:
bash
zpool status              # 查看 Pool 状态
zpool list                # 列出所有 Pool
zpool scrub rpool         # 数据校验
zpool iostat -v 1         # IO 统计

zfs list                  # 列出数据集
zfs snapshot rpool/data@daily  # 创建快照
zfs rollback rpool/data@daily  # 恢复快照
zfs destroy rpool/data@daily   # 删除快照

zfs set compression=lz4 rpool/data  # 启用压缩
zfs get compression rpool/data      # 查看压缩

Q15: 如何进行虚拟机在线迁移?

答案:

前提条件:

  • 共享存储 (Ceph/NFS/iSCSI) 或 全量迁移
  • 网络连通 (迁移网络)
  • CPU 兼容 (相同或兼容型号)

迁移方式:

  1. 在线迁移 (共享存储):
bash
qm migrate 100 pve02 --online
  1. 离线迁移:
bash
qm migrate 100 pve02
  1. 全量迁移 (包括磁盘):
bash
qm migrate 100 pve02 --full
  1. 查看迁移状态:
bash
qm status 100
qm monitor 100
> info migrate

配置迁移网络:

bash
# /etc/pve/datacenter.cfg:
migration: type=insecure,network=10.0.0.0/24

# 或 CLI:
pvenode config set --migration-network 10.0.0.0/24 --migration-type insecure

# type:
# - secure: 加密 (慢)
# - insecure: 不加密 (快)

迁移优化:

bash
# 1. 使用专用迁移网络 (万兆)
# 2. 使用 insecure 模式 (不加密)
# 3. 调整迁移带宽
qm set 100 --migrate-bandwidth 1000  # 1 Gbps

HA 自动迁移:

bash
# HA 会自动迁移故障节点的资源
ha-manager status
ha-manager migrate vm:100 pve02  # 手动触发

Q16: 如何配置 GPU 直通 (PCI Passthrough)?

答案:

前提条件:

  • CPU 支持 VT-d (Intel) / IOMMU (AMD)
  • BIOS 启用 VT-d/IOMMU
  • GPU 支持直通

配置步骤:

  1. 启用 IOMMU:
bash
# 编辑 GRUB
nano /etc/default/grub

# Intel:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

# AMD:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"

# 更新
update-grub
  1. 加载 VFIO 模块:
bash
# /etc/modules:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
  1. 绑定 GPU 到 VFIO:
bash
# 查看 GPU PCI ID
lspci | grep -i nvidia
# 01:00.0 VGA compatible controller: NVIDIA Corporation...

# 查看 GPU 设备 ID
lspci -nn -s 01:00.0
# 01:00.0 0300: 10de:1b80 (rev a1)

# 绑定到 VFIO
echo "10de 1b80" > /sys/bus/pci/drivers/vfio-pci/new_id
  1. 配置 VM:
bash
# 添加 GPU
qm set 100 --hostpci0 01:00.0,pcie=1,x-vga=1

# 参数说明:
# - pcie=1: 使用 PCIe 总线
# - x-vga=1: 启用 VGA 直通 (可选)
  1. 更新 initramfs:
bash
update-initramfs -u -k all
reboot
  1. 验证:
bash
# 检查 IOMMU
dmesg | grep -i iommu

# 检查 VFIO
dmesg | grep -i vfio

# 查看 GPU 状态
lspci -v -s 01:00.0

注意事项:

  • 直通后 GPU 只能被该 VM 使用
  • 需要安装 GPU 驱动 (NVIDIA/AMD)
  • 多 GPU 可以直通给不同 VM
  • 某些 GPU 不支持直通 (消费级 NVIDIA)

Q17: LXC 容器和 KVM 虚拟机有什么区别?如何选择?

答案:

特性LXC 容器KVM 虚拟机
虚拟化类型操作系统级硬件级
内核共享宿主机内核独立内核
性能开销极低 (<5%)低 (5-15%)
启动时间秒级分钟级
内存占用极低中等
隔离性较弱
OS 支持仅 Linux任意 OS
内核修改不支持支持
适用场景微服务、Web、数据库完整 OS、Windows、GPU

选择建议:

使用 LXC:

  • Web 服务器 (Nginx/Apache)
  • 数据库 (MySQL/PostgreSQL)
  • 微服务
  • 开发测试环境
  • 资源敏感场景

使用 KVM:

  • Windows 应用
  • 需要完整 OS
  • GPU 直通
  • 高隔离性要求
  • 内核定制

性能对比:

bash
# LXC 启动时间
pct start 200
# 约 2-5 秒

# KVM 启动时间
qm start 100
# 约 30-60 秒

# 内存占用
# LXC: 约 50-100 MB (基础)
# KVM: 约 512 MB-1 GB (基础)

混合使用:

┌─────────────────────────────────────────┐
│          PVE Node                        │
│                                          │
│  ┌──────────┐  ┌──────────┐             │
│  │ LXC: Web │  │ LXC: DB  │  轻量应用  │
│  └──────────┘  └──────────┘             │
│                                          │
│  ┌──────────────────┐                   │
│  │ KVM: Windows DC  │  完整 OS         │
│  └──────────────────┘                   │
│                                          │
│  ┌──────────────────┐                   │
│  │ KVM: GPU 训练    │  GPU 直通        │
│  └──────────────────┘                   │
└─────────────────────────────────────────┘

Q18: 如何配置 RBAC (基于角色的访问控制)?

答案:

RBAC 概念:

用户 (User) → 组 (Group) → 角色 (Role) → 权限 (Privilege)

配置步骤:

  1. 创建角色:
bash
# VM 管理员角色
pveum roleadd VMAdmin -privs "VM.Allocate,VM.Audit,VM.Backup,VM.Clone,VM.Config.CDROM,VM.Config.CPU,VM.Config.Disk,VM.Config.Memory,VM.Config.Network,VM.Config.Options,VM.Console,VM.Migrate,VM.Monitor,VM.PowerMgmt,VM.Snapshot"

# VM 用户角色 (只读 + 控制台)
pveum roleadd VMUser -privs "VM.Audit,VM.Console,VM.PowerMgmt"

# 存储管理员
pveum roleadd StorageAdmin -privs "Datastore.Allocate,Datastore.AllocateSpace,Datastore.Audit"
  1. 创建用户组:
bash
pveum groupadd admins
pveum groupadd vm-admins
pveum groupadd vm-users
pveum groupadd storage-admins
  1. 创建用户:
bash
pveum useradd admin@pve --groups admins
pveum useradd vmadmin@pve --groups vm-admins
pveum useradd vmuser@pve --groups vm-users
pveum useradd storageadmin@pve --groups storage-admins
  1. 分配权限:
bash
# 全局管理员
pveum aclmod / -group admins -role Administrator

# VM 管理员 (所有 VM)
pveum aclmod /vms -group vm-admins -role VMAdmin

# VM 用户 (特定 VM)
pveum aclmod /vms/100 -user vmuser@pve -role VMUser

# 存储管理员
pveum aclmod /storage -group storage-admins -role StorageAdmin
  1. 查看权限:
bash
pveum role list
pveum group list
pveum user list
pveum acl list

权限路径:

  • / - 全局
  • /vms - 所有 VM
  • /vms/100 - VM 100
  • /storage/local - local 存储
  • /nodes/pve01 - pve01 节点

内置角色:

  • Administrator - 完全控制
  • PVEAdmin - PVE 管理员
  • PVEAuditor - 只读
  • PVEVMAdmin - VM 管理员
  • PVEDatastoreAdmin - 存储管理员

Q19: 如何配置 PVE 防火墙?

答案:

防火墙架构:

┌─────────────────────────────────────────┐
│      Cluster Firewall (集群级)          │
│      /etc/pve/firewall/cluster.fw       │
└─────────────────────────────────────────┘
         ↓              ↓              ↓
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Node FW      │ │ Node FW      │ │ VM FW        │
│ (pve01)      │ │ (pve02)      │ │ (vm:100)     │
│ local.fw     │ │ local.fw     │ │ 100.fw       │
└──────────────┘ └──────────────┘ └──────────────┘

配置步骤:

  1. 启用防火墙:
bash
# Web UI: Datacenter → Firewall → Options → Firewall: Yes
# 或编辑:
# /etc/pve/datacenter.cfg:
firewall: 1
  1. 集群防火墙规则:
bash
# /etc/pve/firewall/cluster.fw:
[OPTIONS]
enable: 1
log_level_in: nolog
log_level_out: nolog
policy_in: DROP
policy_out: ACCEPT

[RULES]
# 允许 SSH (管理网络)
IN ACCEPT -p tcp -dport 22 -source 192.168.1.0/24

# 允许 Web UI
IN ACCEPT -p tcp -dport 8006 -source 192.168.1.0/24

# 允许 Corosync
IN ACCEPT -p udp -dport 5404:5405

# 允许 Ceph
IN ACCEPT -p tcp -dport 6800:7300
  1. 节点防火墙规则:
bash
# /etc/pve/firewall/pve01.fw:
[OPTIONS]
enable: 1

[RULES]
# 允许额外端口
IN ACCEPT -p tcp -dport 80 -source 0.0.0.0/0
IN ACCEPT -p tcp -dport 443 -source 0.0.0.0/0
  1. VM 防火墙规则:
bash
# /etc/pve/firewall/100.fw:
[OPTIONS]
enable: 1

[RULES]
# 允许 HTTP/HTTPS
IN ACCEPT -p tcp -dport 80
IN ACCEPT -p tcp -dport 443

# 允许 SSH (管理网络)
IN ACCEPT -p tcp -dport 22 -source 192.168.1.0/24

# 允许 MySQL
IN ACCEPT -p tcp -dport 3306 -source 192.168.10.0/24
  1. IP Set (IP 集合):
bash
# /etc/pve/firewall/cluster.fw:
[IPSET management]
192.168.1.0/24
10.0.0.0/8

[RULES]
IN ACCEPT -p tcp -dport 22 -source +management
  1. 查看规则:
bash
pve-firewall status
pve-firewall simulate
iptables -L -n -v

注意事项:

  • 默认 DROP 所有入站
  • 允许所有出站
  • 规则从上到下匹配
  • 集群规则优先于节点规则

Q20: 如何监控 PVE 集群?

答案:

内置监控:

bash
# 1. 节点状态
pvestatd

# 2. VM 状态
qm list
qm status 100

# 3. 存储使用率
pvesm status
df -h
zpool list

# 4. Ceph 状态
ceph -s
ceph osd status
ceph df

# 5. 集群状态
pvecm status
ha-manager status

Prometheus + Grafana:

  1. 安装 PVE Exporter:
bash
apt install prometheus-pve-exporter

# 配置 /etc/prometheus/pve.yml:
modules:
  default:
    verify_ssl: false

# 启动
systemctl enable --now prometheus-pve-exporter
  1. Prometheus 配置:
yaml
# /etc/prometheus/prometheus.yml:
scrape_configs:
  - job_name: 'pve'
    static_configs:
      - targets:
        - pve01:9221
        - pve02:9221
        - pve03:9221
  1. Grafana Dashboard:
bash
# 导入 PVE Dashboard ID: 10048
# https://grafana.com/grafana/dashboards/10048

告警配置:

bash
# 1. 邮件告警
# /etc/pve/datacenter.cfg:
email_from: pve-alert@example.com

# 2. 配置 SMTP
# /etc/pve/smtp.cf:
smtp_host = smtp.example.com
smtp_port = 587
smtp_user = pve-alert@example.com
smtp_password = xxx

# 3. 自定义告警脚本
# /usr/local/bin/alert.sh:
#!/bin/bash
NODE=$1
LEVEL=$2
MESSAGE=$3

curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx" \
  -H "Content-Type: application/json" \
  -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"PVE Alert: $NODE - $LEVEL - $MESSAGE\"}}"

chmod +x /usr/local/bin/alert.sh

监控指标:

  • CPU 使用率
  • 内存使用率
  • 存储使用率
  • 网络流量
  • VM 状态
  • 集群健康
  • 备份状态
  • Ceph 健康

高级面试题

Q21: PVE 集群节点故障时,完整的 HA 故障转移流程是什么?

答案:

完整流程:

1. 节点故障检测
   ↓ (10-30 秒)
   Corosync 检测心跳丢失

2. Quorum 重新计算
   ↓ (即时)
   如果剩余节点 > Quorum,集群继续运行

3. CRM 决策
   ↓ (30-60 秒)
   - 等待 shutdown_timeout
   - 确认节点真正故障

4. Fencing
   ↓ (60 秒)
   - 标记故障节点为 fenced
   - 触发 watchdog 重启

5. 资源迁移
   ↓ (1-5 分钟)
   - CRM 选择目标节点
   - LRM 在目标节点启动资源
   - 更新 HA 状态

6. 故障节点恢复
   ↓ (2-5 分钟)
   - Watchdog 重启节点
   - 节点重新加入集群
   - 根据 HA 策略决定是否迁回

时间线:

  • T+0: 节点故障
  • T+10s: Corosync 检测到心跳丢失
  • T+30s: Quorum 重新计算
  • T+60s: Fencing 触发
  • T+90s: 资源开始迁移
  • T+2min: 资源在新节点运行
  • T+5min: 故障节点重启 (如硬件正常)

优化策略:

bash
# 缩短检测时间
# /etc/pve/datacenter.cfg:
ha: shutdown_policy=fence

# 配置快速迁移网络
migration: type=insecure,network=10.0.0.0/24

# 设置优先级
ha-manager groupadd fast_failover \
  --nodes pve01:3,pve02:2,pve03:1

Q22: Ceph 集群出现 degraded 状态,如何排查和修复?

答案:

排查步骤:

  1. 查看状态:
bash
ceph -s
# cluster:
#   id:     xxx
#   health: HEALTH_WARN
#           1 osds down
#           1 pgs degraded

ceph health detail
# HEALTH_WARN 1 osds down; 1 pgs degraded
# osd.5 is down
# pg 1.23 is degraded

ceph osd tree
# ID  CLASS  WEIGHT   TYPE NAME       STATUS  REWEIGHT
#  0    ssd  0.90999      osd.0          up   1.00000
#  5    ssd  0.90999      osd.5        down   1.00000
  1. 检查 OSD 日志:
bash
journalctl -u ceph-osd@5 -f
# 或
tail -f /var/log/ceph/ceph-osd.5.log
  1. 检查硬件:
bash
# 检查磁盘
smartctl -a /dev/sdb
# 检查 SMART 状态

# 检查文件系统
fsck /dev/sdb

# 检查 I/O 错误
dmesg | grep -i error
dmesg | grep -i sdb
  1. 重启 OSD:
bash
# 尝试重启
systemctl restart ceph-osd@5

# 或手动启动
ceph-osd -i 5
  1. 如果 OSD 无法恢复:
bash
# 标记为 out
ceph osd out 5

# 删除 OSD
ceph osd crush remove osd.5
ceph auth del osd.5
ceph osd rm 5

# 重新创建 OSD
pveceph osd create /dev/sdb
  1. 修复 PG:
bash
# 查看 PG 状态
ceph pg 1.23 query

# 手动修复
ceph pg repair 1.23

# 强制恢复
ceph pg force_recovery 1.23
  1. 验证恢复:
bash
ceph -s
# 应该显示 HEALTH_OK

ceph osd tree
# 所有 OSD 应该 up

ceph pg stat
# 所有 PG 应该 active+clean

预防措施:

  • 监控 OSD 状态
  • 配置告警
  • 定期检查 SMART
  • 保留备用磁盘

Q23: 如何优化 PVE 性能?有哪些最佳实践?

答案:

CPU 优化:

bash
# 1. 使用 host CPU 型号
qm set 100 --cpu host

# 2. 启用 NUMA
qm set 100 --numa 1
qm set 100 --numa0 memory=4096,cpus=0-1

# 3. CPU pinning
numactl --hardware  # 查看 NUMA 拓扑
taskset -c 0-3 qm start 100  # 绑定 CPU

# 4. 大页内存
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
qm set 100 --hugepages 1024

内存优化:

bash
# 1. 内存 ballooning
qm set 100 --balloon 2048  # 最小 2GB

# 2. KSM (Kernel Same-page Merging)
echo 1 > /sys/kernel/mm/ksm/run
echo 100 > /sys/kernel/mm/ksm/sleep_millisecs

# 3. 调整 swappiness
echo 10 > /proc/sys/vm/swappiness

存储优化:

bash
# 1. VirtIO-SCSI 多队列
qm set 100 --scsihw virtio-scsi-single
qm set 100 --scsi0 local-lvm:vm-100-disk-0,iothread=1,queues=4

# 2. 缓存策略
# - none: 无缓存 (最安全, SSD)
# - writeback: 写回 (最快, 需要 UPS)
# - writethrough: 写穿 (平衡)
qm set 100 --scsi0 local-lvm:vm-100-disk-0,cache=writeback

# 3. Discard/TRIM
qm set 100 --scsi0 local-lvm:vm-100-disk-0,discard=on

# 4. ZFS 优化
zfs set compression=lz4 rpool/data
zfs set primarycache=metadata rpool/data  # SSD
zfs set recordsize=8k rpool/data          # 数据库

网络优化:

bash
# 1. VirtIO 多队列
qm set 100 --net0 virtio,bridge=vmbr0,queues=4

# 2. MTU 优化
qm set 100 --net0 virtio,bridge=vmbr0,mtu=9000

# 3. 网络参数
# /etc/sysctl.conf:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

内核优化:

bash
# /etc/sysctl.conf:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288

Q24: 如何设计 PVE 备份策略?

答案:

3-2-1 备份规则:

  • 3 份数据副本
  • 2 种存储介质
  • 1 份异地备份

备份层次:

Level 1: 快照 (秒级恢复)
└─ ZFS/Ceph 快照 (存储级)
└─ VM 快照 (应用级)

Level 2: 备份 (分钟级恢复)
└─ vzdump (VM/CT 备份)
└─ PBS (增量去重)

Level 3: 异地备份 (小时级恢复)
└─ PBS 远程同步
└─ rsync/rclone

Level 4: 冷备份 (天级恢复)
└─ 磁带/对象存储

推荐备份计划:

bash
# 1. 快照 (每小时)
# 保留 24 个快照
qm snapshot 100 hourly-$(date +%Y%m%d%H)

# 2. 备份 (每天凌晨)
# 保留 7 天
vzdump 100 --mode snapshot --compress zstd --storage nas-backup

# 3. 周备份 (每周日)
# 保留 4 周
vzdump 100 --mode snapshot --compress zstd --storage weekly-backup

# 4. 月备份 (每月 1 日)
# 保留 12 个月
vzdump 100 --mode snapshot --compress zstd --storage monthly-backup

# 5. 异地同步 (每天)
proxmox-backup-client sync --remote pbs-remote --source backup-store --target remote-backup

PBS 配置:

bash
# 安装 PBS
apt install proxmox-backup-server

# 创建 datastore
proxmox-backup-manager datastore create backup-store /data/backup

# 保留策略
proxmox-backup-manager datastore update backup-store \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 6 \
  --keep-yearly 2

# 启用验证
proxmox-backup-manager datastore update backup-store \
  --verify-schedule "daily" \
  --gc-schedule "weekly"

恢复测试:

bash
# 定期测试恢复 (每月)
qmrestore /backup/vzdump-qemu-100-2026_08_26-02_00_00.vma.zst 999

# 验证
qm start 999
qm guest cmd 999 ping
qm shutdown 999
qm destroy 999

备份监控:

bash
# 查看备份状态
vzdump --list

# 查看 PBS 状态
proxmox-backup-manager datastore status backup-store

# 配置告警
# 备份失败时发送邮件/企微通知

Q25: PVE API 如何使用?如何实现自动化?

答案:

API 认证:

bash
# 1. 获取 Ticket
curl -k -X POST https://pve01:8006/api2/json/access/ticket \
  -d "username=xxx"

# 返回:
{
  "data": {
    "ticket": "PVE:root@pam:xxx::yyy",
    "CSRFPreventionToken": "xxx"
  }
}

# 2. 创建 API Token
pveum user token add root@pam mytoken --privsep 0
# 返回: API Token: xxx

API 调用示例:

bash
# 使用 Ticket
TICKET="PVE:root@pam:xxx::yyy"
CSRF="xxx"

curl -k -X GET https://pve01:8006/api2/json/nodes \
  -H "Cookie: PVEAuthCookie=$TICKET" \
  -H "CSRFPreventionToken: $CSRF"

# 使用 API Token (推荐)
TOKEN="xxx"

curl -k -X GET https://pve01:8006/api2/json/nodes \
  -H "Authorization: PVEAPIToken=$TOKEN"

Python 自动化:

python
#!/usr/bin/env python3
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

class PVEAPI:
    def __init__(self, host, user, token):
        self.base_url = f"https://{host}:8006/api2/json"
        self.headers = {"Authorization": f"PVEAPIToken={user}!{token}"}
    
    def get_vms(self, node):
        url = f"{self.base_url}/nodes/{node}/qemu"
        response = requests.get(url, headers=self.headers, verify=False)
        return response.json()["data"]
    
    def start_vm(self, node, vmid):
        url = f"{self.base_url}/nodes/{node}/qemu/{vmid}/status/start"
        response = requests.post(url, headers=self.headers, verify=False)
        return response.json()
    
    def create_vm(self, node, vmid, config):
        url = f"{self.base_url}/nodes/{node}/qemu"
        data = {"vmid": vmid, **config}
        response = requests.post(url, headers=self.headers, data=data, verify=False)
        return response.json()

# 使用
pve = PVEAPI("pve01", "root@pam", "mytoken=xxxx")

# 列出 VM
vms = pve.get_vms("pve01")
for vm in vms:
    print(f"{vm['vmid']}: {vm['name']}")

# 启动 VM
pve.start_vm("pve01", 100)

Ansible 自动化:

yaml
# inventory.yml:
all:
  hosts:
    pve01:
      ansible_host: 192.168.1.11
      ansible_user: root
  vars:
    pve_api_user: root@pam
    pve_api_token_id: mytoken
    pve_api_token_secret: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

# playbook.yml:
- name: Create VM
  hosts: pve01
  tasks:
    - name: Create VM
      community.general.proxmox_kvm:
        api_host: pve01
        api_user: "{{ pve_api_user }}"
        api_token_id: "{{ pve_api_token_id }}"
        api_token_secret: "{{ pve_api_token_secret }}"
        vmid: 100
        name: web-server
        memory: 4096
        cores: 2
        sockets: 1
        cpu: host
        net:
          net0: 'virtio,bridge=vmbr0'
        scsi:
          scsi0: 'local-lvm:32,cache=writeback,discard=on'
        state: present
    
    - name: Start VM
      community.general.proxmox_kvm:
        api_host: pve01
        api_user: "{{ pve_api_user }}"
        api_token_id: "{{ pve_api_token_id }}"
        api_token_secret: "{{ pve_api_token_secret }}"
        vmid: 100
        state: started

Terraform 自动化:

hcl
# main.tf:
provider "proxmox" {
  pm_api_url          = "https://pve01:8006/api2/json"
  pm_api_token_id     = "root@pam!mytoken"
  pm_api_token_secret = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  pm_tls_insecure     = true
}

resource "proxmox_vm_qemu" "web_server" {
  name        = "web-server"
  target_node = "pve01"
  vmid        = 100
  
  memory  = 4096
  cores   = 2
  sockets = 1
  cpu     = "host"
  
  network {
    model  = "virtio"
    bridge = "vmbr0"
  }
  
  disks {
    scsi {
      scsi0 {
        disk {
          storage = "local-lvm"
          size    = "32G"
          cache   = "writeback"
          discard = true
        }
      }
    }
  }
}

专家面试题

Q26: 如何设计一个大规模 PVE 集群架构(50+ 节点)?

答案:

架构设计:

┌─────────────────────────────────────────────────────────────┐
│                    数据中心 A                                │
│  ┌──────────────────────────────────────────────────────┐  │
│  │           PVE Cluster (25 nodes)                      │  │
│  │  ┌──────┐ ┌──────┐ ┌──────┐ ... ┌──────┐            │  │
│  │  │pve01 │ │pve02 │ │pve03 │     │pve25 │            │  │
│  │  └──────┘ └──────┘ └──────┘     └──────┘            │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                             │
│  ┌──────────────────────────────────────────────────────┐  │
│  │           Ceph Cluster (25 MON/OSD)                   │  │
│  │  Public: 10.0.1.0/24                                  │  │
│  │  Cluster: 10.0.2.0/24                                 │  │
│  └──────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                    数据中心 B                                │
│  ┌──────────────────────────────────────────────────────┐  │
│  │           PVE Cluster (25 nodes)                      │  │
│  │  ┌──────┐ ┌──────┐ ┌──────┐ ... ┌──────┐            │  │
│  │  │pve26 │ │pve27 │ │pve28 │     │pve50 │            │  │
│  │  └──────┘ └──────┘ └──────┘     └──────┘            │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                             │
│  ┌──────────────────────────────────────────────────────┐  │
│  │           Ceph Cluster (25 MON/OSD)                   │  │
│  └──────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

                    ↕ PBS 异地同步

┌─────────────────────────────────────────────────────────────┐
│              灾备中心 (PBS + 冷备)                           │
└─────────────────────────────────────────────────────────────┘

设计原则:

  1. 集群规模限制:

    • PVE 集群最大 32 节点 (Corosync 限制)
    • 超过 32 节点需要多个集群
    • 推荐: 每个集群 15-25 节点
  2. 网络设计:

bash
# 管理网络: 192.168.0.0/24
# Corosync: 10.0.0.0/24 (link0) + 10.0.1.0/24 (link1)
# Ceph Public: 10.0.2.0/24
# Ceph Cluster: 10.0.3.0/24
# VM 业务: 10.0.10.0/24 (VLAN 10-50)
# 迁移网络: 10.0.4.0/24
  1. 存储设计:
bash
# Ceph 集群
# - 每节点 4 OSD (2TB NVMe)
# - 3 副本 = 有效容量 50TB/集群
# - PG 数量: 100 * OSD数 / 副本数

# 计算:
# 25 节点 * 4 OSD = 100 OSD
# PG = 100 * 100 / 3 = 3333 ≈ 4096

ceph osd pool create vm-disks \
  --pg_num 4096 \
  --size 3 \
  --min_size 2
  1. HA 设计:
bash
# 故障域: rack (机架级)
ceph osd crush rule create-replicated rack-rule default rack

# HA 组: 每个机架一个组
ha-manager groupadd rack1 \
  --nodes pve01:3,pve02:2,pve03:1 \
  --restricted 1

ha-manager groupadd rack2 \
  --nodes pve04:3,pve05:2,pve06:1 \
  --restricted 1
  1. 监控设计:
bash
# Prometheus + Grafana
# - 每集群一个 Prometheus
# - 全局 Grafana
# - 告警: AlertManager → 企微/钉钉/PagerDuty

# 日志: Loki + Promtail
# - 每节点采集日志
# - 集中存储和查询
  1. 自动化设计:
bash
# Terraform: 基础设施即代码
# Ansible: 配置管理
# Custom API: 业务集成

# CI/CD:
# Git → Terraform Plan → Review → Apply

容量规划:

每节点:
- CPU: 64 核 (2x AMD EPYC 7543)
- 内存: 512 GB DDR4 ECC
- 存储: 4x 2TB NVMe (Ceph OSD)
- 网络: 2x 25GbE

集群总容量:
- CPU: 1600 核 (过量使用 4:1 = 6400 vCPU)
- 内存: 12.5 TB (预留 20% = 10 TB 可用)
- 存储: 200 TB 原始 / 66 TB 有效 (3 副本)
- VM: 约 500-1000 个 (取决于规格)

Q27: 如何实现 PVE 多租户隔离?

答案:

多租户架构:

┌─────────────────────────────────────────────────┐
│                  PVE Cluster                     │
│                                                  │
│  ┌──────────────┐  ┌──────────────┐             │
│  │ Tenant A     │  │ Tenant B     │             │
│  │ Pool: A      │  │ Pool: B      │             │
│  │ VLAN: 10     │  │ VLAN: 20     │             │
│  │ Storage: A   │  │ Storage: B   │             │
│  │ RBAC: A      │  │ RBAC: B      │             │
│  └──────────────┘  └──────────────┘             │
│                                                  │
│  ┌──────────────┐  ┌──────────────┐             │
│  │ Tenant C     │  │ Tenant D     │             │
│  │ Pool: C      │  │ Pool: D      │             │
│  │ VLAN: 30     │  │ VLAN: 40     │             │
│  │ Storage: C   │  │ Storage: D   │             │
│  │ RBAC: C      │  │ RBAC: D      │             │
│  └──────────────┘  └──────────────┘             │
└─────────────────────────────────────────────────┘

实现步骤:

  1. 资源池隔离:
bash
# 创建资源池
pveum pooladd tenant-a --comment "Tenant A Resources"
pveum pooladd tenant-b --comment "Tenant B Resources"

# 分配 VM 到池
pveum set pool/tenant-a --vms 100,101,102
pveum set pool/tenant-b --vms 200,201,202

# 分配存储到池
pveum set pool/tenant-a --storage storage-a
pveum set pool/tenant-b --storage storage-b
  1. 网络隔离:
bash
# VLAN 隔离
# /etc/network/interfaces:
auto vmbr1
iface vmbr1 inet manual
    bridge-ports eth2
    bridge-stp off
    bridge-fd 0
    bridge-vlan-aware yes
    bridge-vids 2-4094

# Tenant A: VLAN 10
qm set 100 --net0 virtio,bridge=vmbr1,tag=10
qm set 101 --net0 virtio,bridge=vmbr1,tag=10

# Tenant B: VLAN 20
qm set 200 --net0 virtio,bridge=vmbr1,tag=20
qm set 201 --net0 virtio,bridge=vmbr1,tag=20

# 防火墙隔离
# /etc/pve/firewall/100.fw:
[OPTIONS]
enable: 1
ipfilter: 1

[RULES]
# 只允许 Tenant A VLAN 内部通信
IN ACCEPT -p tcp -dport 22 -source 10.0.10.0/24
IN DROP -p tcp -dport 22  # 拒绝其他
  1. 存储隔离:
bash
# 为每个租户创建独立存储
pvesm add zfs storage-a \
  --pool rpool/tenant-a \
  --content images,rootdir

pvesm add zfs storage-b \
  --pool rpool/tenant-b \
  --content images,rootdir

# 限制存储访问
pveum aclmod /storage/storage-a -user tenant-a@pve -role PVEDatastoreUser
pveum aclmod /storage/storage-b -user tenant-b@pve -role PVEDatastoreUser
  1. RBAC 隔离:
bash
# 创建租户角色
pveum roleadd TenantAdmin -privs "VM.Allocate,VM.Audit,VM.Backup,VM.Clone,VM.Config.CDROM,VM.Config.CPU,VM.Config.Disk,VM.Config.Memory,VM.Config.Network,VM.Config.Options,VM.Console,VM.Migrate,VM.Monitor,VM.PowerMgmt,VM.Snapshot,Datastore.AllocateSpace,Datastore.Audit"

# 创建租户用户
pveum useradd tenant-a@pve --groups tenant-a-group
pveum useradd tenant-b@pve --groups tenant-b-group

# 分配权限
pveum aclmod /pool/tenant-a -user tenant-a@pve -role TenantAdmin
pveum aclmod /pool/tenant-b -user tenant-b@pve -role TenantAdmin
  1. 资源配额:
bash
# CPU 限制
qm set 100 --cpulimit 4  # 最多 4 核

# 内存限制
qm set 100 --memory 8192  # 最多 8GB

# 磁盘配额
# 通过存储限制实现
pvesm set storage-a --maxfiles 100  # 最多 100 个文件

# 网络带宽限制
qm set 100 --net0 virtio,bridge=vmbr1,tag=10,rate=100  # 100 Mbps
  1. 监控隔离:
bash
# 每租户独立监控
# Prometheus 多租户配置
scrape_configs:
  - job_name: 'tenant-a'
    static_configs:
      - targets: ['pve01:9221']
        labels:
          tenant: 'tenant-a'
    metric_relabel_configs:
      - source_labels: [vmid]
        regex: '10[0-9]'
        action: keep

Q28: 如何实现 PVE 与 Kubernetes 集成?

答案:

架构设计:

┌─────────────────────────────────────────────────┐
│                  PVE Cluster                     │
│                                                  │
│  ┌────────────────────────────────────────┐    │
│  │  K8s Control Plane (3 VM)               │    │
│  │  ┌──────┐  ┌──────┐  ┌──────┐          │    │
│  │  │master│  │master│  │master│          │    │
│  │  │  01  │  │  02  │  │  03  │          │    │
│  │  └──────┘  └──────┘  └──────┘          │    │
│  └────────────────────────────────────────┘    │
│                                                  │
│  ┌────────────────────────────────────────┐    │
│  │  K8s Workers (N VM)                     │    │
│  │  ┌──────┐  ┌──────┐  ┌──────┐  ...    │    │
│  │  │worker│  │worker│  │worker│          │    │
│  │  │  01  │  │  02  │  │  03  │          │    │
│  │  └──────┘  └──────┘  └──────┘          │    │
│  └────────────────────────────────────────┘    │
│                                                  │
│  ┌────────────────────────────────────────┐    │
│  │  CSI Driver (Ceph RBD)                  │    │
│  │  CNI Plugin (Multus/Calico)             │    │
│  └────────────────────────────────────────┘    │
└─────────────────────────────────────────────────┘

集成方式:

  1. 使用 Terraform 创建 K8s 集群:
hcl
# main.tf:
provider "proxmox" {
  pm_api_url          = "https://pve01:8006/api2/json"
  pm_api_token_id     = "root@pam!terraform"
  pm_api_token_secret = "xxxxxxxx"
  pm_tls_insecure     = true
}

# 创建 Master 节点
resource "proxmox_vm_qemu" "k8s_master" {
  count       = 3
  name        = "k8s-master-${count.index + 1}"
  target_node = element(["pve01", "pve02", "pve03"], count.index)
  
  clone = "ubuntu-template"  # 预装 K8s 依赖的模板
  
  memory  = 4096
  cores   = 2
  
  network {
    model  = "virtio"
    bridge = "vmbr0"
  }
  
  disks {
    scsi {
      scsi0 {
        disk {
          storage = "ceph-pool"
          size    = "50G"
        }
      }
    }
  }
  
  # Cloud-Init
  ciuser     = "ubuntu"
  sshkeys    = file("~/.ssh/id_rsa.pub")
  ipconfig0  = "ip=dhcp"
}

# 创建 Worker 节点
resource "proxmox_vm_qemu" "k8s_worker" {
  count       = 5
  name        = "k8s-worker-${count.index + 1}"
  target_node = element(["pve01", "pve02", "pve03"], count.index % 3)
  
  clone = "ubuntu-template"
  
  memory  = 8192
  cores   = 4
  
  network {
    model  = "virtio"
    bridge = "vmbr0"
  }
  
  disks {
    scsi {
      scsi0 {
        disk {
          storage = "ceph-pool"
          size    = "100G"
        }
      }
    }
  }
  
  ciuser     = "ubuntu"
  sshkeys    = file("~/.ssh/id_rsa.pub")
  ipconfig0  = "ip=dhcp"
}

# 输出节点 IP
output "master_ips" {
  value = proxmox_vm_qemu.k8s_master[*].default_ipv4_address
}

output "worker_ips" {
  value = proxmox_vm_qemu.k8s_worker[*].default_ipv4_address
}
  1. Ceph CSI 集成:
yaml
# ceph-csi-config.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
  name: ceph-csi-config
data:
  config.json: |-
    [{
      "clusterID": "cluster-id",
      "monitors": [
        "10.0.1.11:6789",
        "10.0.1.12:6789",
        "10.0.1.13:6789"
      ]
    }]

# storage-class.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
  clusterID: cluster-id
  pool: k8s-pool
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: ceph-secret
  csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
  1. 自动化部署 K8s:
bash
#!/bin/bash
# deploy-k8s.sh

# 1. Terraform 创建 VM
terraform init
terraform apply -auto-approve

# 2. 获取节点 IP
MASTER_IPS=$(terraform output -json master_ips | jq -r '.[]')
WORKER_IPS=$(terraform output -json worker_ips | jq -r '.[]')

# 3. 使用 kubeadm 初始化集群
ssh ubuntu@$(echo $MASTER_IPS | head -1) "sudo kubeadm init --control-plane-endpoint=$(echo $MASTER_IPS | head -1):6443"

# 4. 加入其他 Master
for ip in $(echo $MASTER_IPS | tail -n +2); do
  ssh ubuntu@$ip "sudo kubeadm join --control-plane ..."
done

# 5. 加入 Worker
for ip in $WORKER_IPS; do
  ssh ubuntu@$ip "sudo kubeadm join ..."
done

# 6. 安装 Ceph CSI
kubectl apply -f ceph-csi-config.yaml
kubectl apply -f storage-class.yaml

# 7. 安装 Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
  1. PVE CSI Driver (直接挂载 PVE 磁盘):
yaml
# pve-csi.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: pve-local
provisioner: csi.proxmox.sinextra.dev
parameters:
  storage: local-lvm
  csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

场景题与故障排查

Q29: 场景 - 集群脑裂,如何恢复?

问题: 3 节点集群,pve01 和 pve02 互相认为对方故障,各自认为自己是唯一的节点。

排查步骤:

  1. 确认脑裂:
bash
# 在 pve01
pvecm status
# Expected votes: 3
# Total votes: 2
# Quorum: 2
# 只有 pve01 和 pve03

# 在 pve02
pvecm status
# Expected votes: 3
# Total votes: 2
# Quorum: 2
# 只有 pve02 和 pve03
  1. 检查网络:
bash
# 在 pve01
ping pve02  # 不通
ping pve03  # 通

# 在 pve02
ping pve01  # 不通
ping pve03  # 通
  1. 修复网络:
bash
# 检查交换机
# 检查防火墙
# 检查 Corosync 端口
nc -zv pve02 5404 5405
  1. 如果网络无法立即修复:
bash
# 在 pve01 (有更多资源)
pvecm expected 2  # 临时降低 Quorum

# 在 pve02
systemctl stop corosync  # 停止集群服务
systemctl stop pve-cluster
  1. 网络恢复后:
bash
# 在 pve02
systemctl start corosync
systemctl start pve-cluster

# 恢复 Quorum
pvecm expected 3

# 验证
pvecm status
  1. 检查数据一致性:
bash
# 检查 /etc/pve 配置
ls -la /etc/pve/

# 检查 VM 状态
qm list
ha-manager status

# 如果有冲突,手动解决
nano /etc/pve/corosync.conf
pvecm updateconfig

预防措施:

  • 配置冗余网络 (link0 + link1)
  • 使用 QDevice
  • 监控网络延迟
  • 配置告警

Q30: 场景 - Ceph 集群 HEALTH_ERR,如何紧急恢复?

问题:

bash
ceph -s
# cluster:
#   health: HEALTH_ERR
#           3 osds down
#           1 pgs stale
#           1 pgs inactive

紧急恢复步骤:

  1. 快速诊断:
bash
ceph health detail
# 查看具体错误

ceph osd tree
# 查看哪些 OSD down

ceph osd status
# 查看 OSD 状态

ceph pg stat
# 查看 PG 状态
  1. 恢复 OSD:
bash
# 尝试重启 OSD
for i in 5 6 7; do
  systemctl restart ceph-osd@$i
done

# 如果无法启动,检查日志
journalctl -u ceph-osd@5 -f

# 检查磁盘
smartctl -a /dev/sdb
dmesg | grep -i error
  1. 如果 OSD 无法恢复:
bash
# 标记为 out
ceph osd out 5 6 7

# 等待数据重新平衡
ceph -w
# 应该看到 recovery 进度

# 查看恢复状态
ceph osd pool stats
  1. 修复 stale PG:
bash
# 查看 stale PG
ceph pg dump_stuck stale

# 手动修复
ceph pg repair <pg-id>

# 如果不行,强制恢复
ceph pg force_recovery <pg-id>

# 最后手段:标记为 lost (危险!)
ceph pg <pg-id> mark_unfound_lost revert
  1. 验证恢复:
bash
ceph -s
# 应该逐渐恢复到 HEALTH_OK

ceph osd tree
# 所有 OSD 应该 up

ceph pg stat
# 所有 PG 应该 active+clean
  1. 后续处理:
bash
# 如果磁盘损坏,更换磁盘
ceph osd crush remove osd.5
ceph auth del osd.5
ceph osd rm 5

# 重新创建 OSD
pveceph osd create /dev/sdc  # 新磁盘

实战操作题

实操题 1: 从零搭建 3 节点 PVE 集群

要求:

  • 3 个 PVE 节点
  • 配置 Corosync 集群
  • 配置 Ceph 存储 (3 副本)
  • 配置 HA
  • 创建测试 VM 并验证故障转移

评分标准:

  • 集群状态正常 (20%)
  • Ceph HEALTH_OK (20%)
  • HA 配置正确 (20%)
  • 故障转移测试通过 (20%)
  • 文档完整 (20%)

实操题 2: 备份与恢复

要求:

  • 配置 PBS
  • 创建定时备份任务
  • 执行备份
  • 恢复到新 VMID
  • 验证数据完整性

实操题 3: 性能调优

要求:

  • 创建 VM
  • 执行性能测试 (fio, iperf)
  • 优化配置
  • 再次测试
  • 对比报告

文档结束

本手册涵盖 PVE 运维从初级到专家的完整面试题,适合各层级工程师准备面试和自我提升。