上一篇 下一篇 分享链接 返回 返回顶部

如何在香港服务器的Linux系统环境中通过OpenStack实现多租户环境下的资源隔离?

发布人:Minchunlin 发布时间:2025-08-30 09:26 阅读量:804


深夜,我拎着工具包进了葵涌那排恒温恒湿的机柜间,托管商按 SLA 把两条上行从不同 ToR 拉到我们机柜:一条做 Internet 叠加 BGP,一条做专线到客户的沙田 IDC。客户催的不是“能不能上线”,而是“多租户的边界能不能‘硬’到我放心”。他们说的“硬”,在我脑子里翻译成了三件事:算力不串台、网络不串线、存储不串卷;其次是可审计、可追责、可限速。于是就有了下面这一套。

场景与目标

场景:香港托管机房(Tier III),2 个机柜位,双上联,要求多租户环境(多个业务部门/多个外部团队),实现强隔离与可配额,并能做QoS 限速、专线/公网并存、按租户计费(后续)。

目标:

  • 身份与权限:项目级(Project)隔离、精细 RBAC;
  • 计算:租户/工作负载可绑定宿主集合(Host Aggregate),可做独占核(CPU pinning)、NUMA 隔离、HugePages;
  • 网络:每租户独立二层/三层,VXLAN/GENEVE 叠加;必要时 Provider VLAN 直通;L3-HA + DVR;安全组与最小/最大带宽;
  • 存储:Cinder 多后端 + Volume Type + QoS,支持加密(Barbican);
  • 可观测与审计:Keystone audit、流量与资源指标上报。
  • 读者:新手能照抄跑通,老手能按需“加料”。

硬件与网络拓扑(现场参数)

硬件清单

分类 型号/说明 数量 关键参数
控制节点 Dell R650 (或同档) 3 2×Intel Xeon Gold 6330、256GB RAM、2×480GB SSD、2×25GbE
计算节点 Dell R750 / Supermicro 1029U 6–12 2×Xeon Gold、512GB–1TB RAM、2×25GbE、1×100GbE(可选 SR-IOV)
存储 3×存储节点(Ceph) 3 2×480GB SSD(OSD-DB/WAL)、8×3.84TB NVMe(OSD)、2×25GbE
交换机 TOR ×2(冗余) 2 48×25G + 8×100G,上联双归,机柜内 LACP
带外 IPMI(独立管理口) - OOB 网络隔离

现场经验:香港带宽贵但机柜电力紧张,25G 已经是不错的甜点位;如果上了 100G,强烈建议 SR-IOV + DPDK 才真能榨干。

网络拓扑(逻辑)

bond0:25G×2 LACP,上打 TOR,承载管理、存储、隧道与虚机流量(VLAN 分割)。

VLAN 规划:

用途 VLAN 子网/掩码 MTU 备注
管理(mgmt) 110 10.10.110.0/24 1500 API/控制面
隧道(tunnel) 120 10.10.120.0/24 9000 VXLAN/Geneve 建议大 MTU
存储(storage) 130 10.10.130.0/24 9000 Ceph 复制/心跳
Provider-Internet 210 公网/29 1500 公网直连
Provider-MPLS 220 172.22.0.0/24 1500 专线直连

坑 1(必踩):VXLAN/GENEVE 叠加头开销 ~50B,虚机网口 MTU 要小于物理 MTU。我们物理设置 9000,Neutron 网络与端口 MTU 设 8900(或常见的 1500/1450)。不同机房设备对巨帧默认策略不同,一定要打通端到端。

系统与版本选择(关于 CentOS 7 的现实)

建议路径:Rocky Linux 9 / Ubuntu 22.04 + OpenStack(2024.x/2025.x),用 kolla-ansible 或 openstack-ansible 部署,生命周期健康。

遗留路径(客户历史包袱):CentOS 7 已 EOL(2024-06-30),可选 Queens/Train 等老版本或 RDO 最后支持的分支,仅 PoC/封闭网 勉强使用,务必加防火墙、内核与 OpenSSL 加固。

下面以 Rocky 9 + Kolla-Ansible 作为主线做生产部署;文末附 CentOS 7(Queens/Train) 的 PoC 单节点笔记,适合快速理解概念。

部署前操作系统与 BIOS 固化

BIOS:开 VT-x/VT-d、SR-IOV、NUMA 显示;关闭超线程(若做强隔离)或保留(追求吞吐),统一策略。

磁盘:RAID1 系统盘,剩余给容器/镜像缓存;计算节点尽量无 RAID,交给上层。

网卡 Bond(示例):

nmcli con add type bond ifname bond0 mode 802.3ad
nmcli con add type ethernet ifname ens3f0 master bond0
nmcli con add type ethernet ifname ens3f1 master bond0
nmcli con add type vlan ifname bond0.110 dev bond0 id 110
nmcli con add type vlan ifname bond0.120 dev bond0 id 120
nmcli con add type vlan ifname bond0.130 dev bond0 id 130

内核参数(计算节点示例):

cat >/etc/sysctl.d/99-cloud.conf <<'EOF'
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.netfilter.nf_conntrack_max=262144
vm.swappiness=10
kernel.numa_balancing=0
EOF
sysctl --system

时间同步:chrony 指向同一对 PTP/Stratum 源,Ceph/控制面尤为重要。

容器运行时:Docker/Moby 或 Podman;Kolla 默认 Docker,版本锁定。

用 Kolla-Ansible 拉起控制平面(生产主线)

控制面 3 节点高可用,计算节点 N 台,Ceph 3 节点。这里精简为关键参数与多租户隔离相关组件。

1)准备与初始化

# 控制节点
dnf install -y epel-release python3-pip
pip3 install -U pip kolla-ansible==16.*  # 对应当期 OpenStack 版本
kolla-ansible install-deps

# 生成密码与样例
mkdir -p /etc/kolla
kolla-genpwd
cp -r /usr/share/kolla-ansible/etc_examples/kolla/* /etc/kolla/
cp /usr/share/kolla-ansible/ansible/inventory/multinode /etc/kolla/inventory

2)编辑 /etc/kolla/globals.yml(要点)

kolla_base_distro: "rocky"
openstack_release: "2024.2"        # 示例
network_interface: "bond0.110"     # 管理
neutron_external_interface: "bond0.210"  # 公网 provider
tunnel_interface: "bond0.120"
storage_interface: "bond0.130"

neutron_plugin_agent: "openvswitch" # 也可选 ovn,老练同学可自选
enable_neutron_provider_networks: "yes"
enable_neutron_qos: "yes"
enable_neutron_trunk: "yes"
enable_barbican: "yes"     # 卷/镜像加密
enable_cinder: "yes"
enable_cinder_backend_lvm: "no"
enable_ceph: "yes"

3)Ansible Inventory(片段)

[control]
ctrl01 ansible_host=10.10.110.11
ctrl02 ansible_host=10.10.110.12
ctrl03 ansible_host=10.10.110.13

[compute]
cmp01 ansible_host=10.10.110.21
cmp02 ansible_host=10.10.110.22
...

[monitoring]
ctrl01
ctrl02
ctrl03

[storage]
cep01 ansible_host=10.10.130.31
cep02 ansible_host=10.10.130.32
cep03 ansible_host=10.10.130.33

4)部署

kolla-ansible -i /etc/kolla/inventory bootstrap-servers
kolla-ansible -i /etc/kolla/inventory prechecks
kolla-ansible -i /etc/kolla/inventory deploy
kolla-ansible post-deploy

5)验证

. /etc/kolla/admin-openrc.sh
openstack compute service list
openstack network agent list
openstack volume service list

多租户隔离的“几把刀”

理念:身份隔离是边界、调度隔离是地基、网络与存储隔离是墙体,QoS 与审计是门锁与摄像头。

1)身份与 RBAC(Keystone)

租户用 Project 表示,按团队/环境拆分(teamA-prod、teamA-dev…)。

自定义角色并限制能见度(例如网络只读、允许建/删自有资源)。

典型命令:

# 创建项目与用户
openstack project create teamA-prod
openstack user create --project teamA-prod --password 'S3cr3t!' alice
openstack role add --project teamA-prod --user alice member

# 自定义只读网络角色(示例)
openstack role create net_viewer
# policy.json/yaml 中为 net_viewer 绑定相应规则(略)

2)计算隔离(Nova + Placement)

做法 A:Host Aggregate + 租户绑定(强隔离)

在 nova-scheduler 开启过滤器(Kolla 默认 FilterScheduler,Placement 协调):
/etc/kolla/nova-scheduler/nova.conf(片段)

[filter_scheduler]
enabled_filters=AvailabilityZoneFilter,ComputeFilter,ImagePropertiesFilter,AggregateInstanceExtraSpecsFilter,AggregateMultiTenancyIsolation

把计算节点分到聚合(Aggregate),并给聚合打元数据 filter_tenant_id=<project-id>:

# 创建聚合并加入宿主
openstack aggregate create agg-teamA --zone AZ1
openstack aggregate add host agg-teamA cmp01
openstack aggregate add host agg-teamA cmp02

# 为聚合绑定租户(注意用 project 的 ID)
PID=$(openstack project show teamA-prod -f value -c id)
openstack aggregate set --property filter_tenant_id=$PID agg-teamA

结果:teamA-prod 只能在 agg-teamA 上调度,物理隔离到宿主集合。

做法 B:Flavor + Extra Specs(中/强隔离)

通过 Flavor 控制资源与调度特征,如大页、CPU 绑核、NUMA 亲和、聚合匹配:

openstack flavor create c8m32.pinned --ram 32768 --vcpus 8 --disk 100
openstack flavor set --property hw:cpu_policy=dedicated \
                     --property hw:cpu_thread_policy=isolate \
                     --property hw:mem_page_size=1GB \
                     --property aggregate_instance_extra_specs:tenant="teamA" \
                     c8m32.pinned

dedicated + isolate:独占物理核,避免同核超线程争抢;

  • mem_page_size=1GB:HugePages;
  • aggregate_instance_extra_specs:*:要求匹配某聚合元数据(需要你在聚合上事先设置 tenant=teamA)。

配额(Quota):防止“炸服”

openstack quota set --instances 50 --cores 200 --ram 409600 teamA-prod

NUMA/Pinning 现场坑

BIOS 若开启自动 NUMA 平衡,和 Nova 的 pinning 策略可能“打架”,请按上文 sysctl 关闭。

超线程保留时,isolate 会尽量避免同核兄弟线程混跑;但核数紧张时调度会失败,不是“卡死”,是你配额/聚合太紧了。

3)网络隔离(Neutron)

叠加网络(VXLAN/GENEVE):每租户自带二层域,默认相互隔离。
Provider VLAN:给需要“接近物理”的租户,直接划 VLAN 到虚机网卡。
DVR + L3-HA:东西向走隧道,南北向就近出(DVR),路由器冗余(L3-HA)。
安全组:最小授权、状态跟踪;QoS:端口/网络级最小/最大带宽。

示例命令(团队专属网络):

# teamA 的自管网络
openstack network create --project teamA-prod --mtu 8900 netA
openstack subnet create --project teamA-prod --subnet-range 192.168.10.0/24 --gateway 192.168.10.1 --dhcp netA-subnet --network netA

# 共享公网的外部网络(Provider VLAN)
openstack network create --share --external --provider-network-type vlan \
  --provider-physical-network physnet1 --provider-segment 210 public-vlan210

# 租户路由器(启用 L3-HA)
openstack router create --project teamA-prod --ha True rA
openstack router set --external-gateway public-vlan210 rA
openstack router add subnet rA netA-subnet

端口级 QoS(限速/保底)

openstack qos policy create --project teamA-prod qosA
openstack qos rule create --type minimum-bandwidth --min-kbps 500000 qosA
openstack qos rule create --type bandwidth-limit --max-kbps 1000000 --max-burst-kbits 50000 qosA

# 应用到端口(虚机创建后)
PORT_ID=$(openstack port list --network netA -f value -c ID | head -n1)
openstack port set --qos-policy qosA $PORT_ID

RBAC 共享网络给特定项目(而非全局分享)

# teamB 可用 teamA 的一个共享网络(只读/可用)
TARGET_PID=$(openstack project show teamB-prod -f value -c id)
openstack network rbac create --target-project $TARGET_PID --action access_as_shared netA

坑 2(MTU/ICMP):VXLAN + 安全组下,常见现象是“能通 TCP,ping 不通”或反之。检查:端到端 MTU、security-group 规则(默认不放 ICMP)、以及 ToR 上的 ACL。

4)存储隔离(Cinder + Ceph)

多后端/多类型:不同租户/工作负载用不同卷类型(Volume Type),背后对应不同性能/加密策略。

QoS:限制 IOPS/带宽,避免“吵闹邻居”。

示例:

# 创建卷类型并绑定后端
openstack volume type create fast-nvme
openstack volume type set --property volume_backend_name=ceph-nvme fast-nvme

openstack volume type create capacity-hdd
openstack volume type set --property volume_backend_name=ceph-hdd capacity-hdd

# QoS
openstack volume qos create qos-fast --consumer front-end --read-iops-sec 20000 --write-iops-sec 15000
openstack volume type set --qos-spec qos-fast fast-nvme

# 加密(Barbican)
openstack volume type encryption set --provider luks --cipher aes-xts-plain64 --key-size 256 fast-nvme

坑 3(Ceph 时钟与副本):晚高峰我们遇到过 clock skew 触发 MON 报警、客户端卡顿。Chrony 对齐、OSD 核心绑定、网络 QoS 保证存储 VLAN 稳定,副本 3(同机柜多盘)是底线。

5)镜像与密钥(Glance + Barbican)

镜像可见性:私有(project 可见)、共享(指定项目)、公共(管理员控制)。

用户凭据:把云主机登录密钥放到 Barbican,避免“到处拷贝”。

可观测与审计

Keystone:开启审计日志(谁在什么时间对哪个 API 做了什么)。

流量与资源:Node Exporter、OVS/OVN 流量统计、Ceph Exporter;Grafana 看板按项目维度切片。

配额告警:Prometheus 采集 OpenStack API / Placement 指标,达到阈值告警到 On-call。

交付给租户的“菜单”(Flavor/Quota/网络套餐)

套餐 Flavor 特征 配额建议
通用型 c4m16 4 vCPU / 16GB / 100GB 100 vCPU / 400GB RAM
计算型(绑核) c8m32.pinned 8 vCPU(dedicated)/ 32GB / 100GB / 1GB 大页 200 vCPU / 800GB RAM
内存型 m16m128 16 vCPU / 128GB / 100GB 160 vCPU / 2TB RAM
高 I/O io8m64 NVMe 卷(fast-nvme)+ QoS 按需申请
网络加速 sriov4m32 SR-IOV 直通(需要白名单) 宿主容量受限

典型“坑位”与现场解法

虚机拿不到 metadata

现象:cloud-init 卡在 metadata。

排查:neutron-metadata-agent 日志、路由命名空间抓包;检查 rp_filter;若 DVR 模式,查看本地 SNAT 命名空间。

解法:如上 sysctl 关闭 rp_filter;确保 security group 放行 80/8775;metadata 代理指向正确 Nova API。

L3-HA 抢占抖动

现象:HA 路由器 VIP 在不同网络节点间“跳舞”。

解法:固定 VRRP 优先级、开启非抢占(no preempt)、为不同租户散列到不同网络节点。

MTU 错配

现象:大包丢、TCP 慢。

解法:统一:物理 9000 → 隧道 8900 → 虚机端口/网络明确设置;ToR 禁止“自动降 MTU”。

SR-IOV 启不起来

现象:PF/VF 没有,或 VF 无法绑定。

解法:BIOS 开 VT-d/SR-IOV;grub 加 intel_iommu=on iommu=pt;在 driverctl 里控驱动;Neutron sriov 代理 whitelist 正确;同一 PF 上 VLAN trunk 要求与 TOR 配置一致。

Ceph 客户端超时

现象:卷挂载慢、IO 抖。

解法:检查存储 VLAN 丢包/拥塞;OSD 线程绑核;为存储网卡单独 QoS;容器 cgroups 限制合理。

一把梭:把“强隔离”写进命令行(端到端示例)

# 0. 环境
. /etc/kolla/admin-openrc.sh

# 1. Keystone:项目/用户/角色
openstack project create teamA-prod
openstack user create --project teamA-prod --password 'S3cr3t!' alice
openstack role add --project teamA-prod --user alice member

# 2. Nova:聚合 + 调度绑定
openstack aggregate create agg-teamA --zone AZ1
openstack aggregate add host agg-teamA cmp01
openstack aggregate add host agg-teamA cmp02
PID=$(openstack project show teamA-prod -f value -c id)
openstack aggregate set --property filter_tenant_id=$PID agg-teamA

openstack flavor create c8m32.pinned --ram 32768 --vcpus 8 --disk 100
openstack flavor set --property hw:cpu_policy=dedicated \
                     --property hw:cpu_thread_policy=isolate \
                     --property hw:mem_page_size=1GB \
                     c8m32.pinned

# 3. Neutron:租户网络 + 公网 + QoS
openstack network create --project teamA-prod --mtu 8900 netA
openstack subnet create --project teamA-prod --subnet-range 192.168.10.0/24 --gateway 192.168.10.1 --dhcp netA-subnet --network netA

openstack network create --share --external --provider-network-type vlan \
  --provider-physical-network physnet1 --provider-segment 210 public-vlan210

openstack router create --project teamA-prod --ha True rA
openstack router set --external-gateway public-vlan210 rA
openstack router add subnet rA netA-subnet

openstack qos policy create --project teamA-prod qosA
openstack qos rule create --type minimum-bandwidth --min-kbps 500000 qosA
openstack qos rule create --type bandwidth-limit --max-kbps 1000000 --max-burst-kbits 50000 qosA

# 4. Cinder:卷类型 + QoS + 加密
openstack volume type create fast-nvme
openstack volume type set --property volume_backend_name=ceph-nvme fast-nvme
openstack volume qos create qos-fast --consumer front-end --read-iops-sec 20000 --write-iops-sec 15000
openstack volume type set --qos-spec qos-fast fast-nvme
openstack volume type encryption set --provider luks --cipher aes-xts-plain64 --key-size 256 fast-nvme

# 5. 配额
openstack quota set --instances 50 --cores 200 --ram 409600 teamA-prod

# 6. 首台云主机
NET_ID=$(openstack network show netA -f value -c id)
openstack server create --flavor c8m32.pinned --image "Rocky-9-Cloud" \
  --nic net-id=$NET_ID --key-name alice-key --security-group default vm-a1

运营与日常:如何“稳态”地跑

  • 容量视角:按聚合维护“宿主白名单/黑名单”,批量打补丁滚动下线;将热租户与冷租户分不同聚合;
  • 网络视角:对外的 Provider VLAN 与隧道网分开 QoS 策略;对租户启用 Port Security 与Trunk(容器化场景);
  • 存储视角:把“吵闹邻居”放进有 QoS 的卷类型;给大表/日志类应用单独池;
  • 审计视角:按项目导出 Keystone 审计日志与云资源变更,留存 180–365 天。

附:CentOS 7(Queens/Train)PoC 单节点最小化(非生产)

仅用于概念验证,不可直上生产。

# RDO/Packstack(历史版本):单节点
yum install -y centos-release-openstack-queens
yum update -y
yum install -y openstack-packstack
packstack --allinone --os-neutron-ovs-bridge-interfaces=br-ex:ens3 \
  --os-heat-install=n --os-ceilometer-install=n

注意:内核/openssl 漏洞风险高;Neutron OVS 老版本 bug 多;建议尽快迁到 Rocky/Ubuntu + Kolla。

收尾|雨停时分的维港与边界感

风停在凌晨三点,机房外的风声像被人关掉了高频通道。Grafana 的看板变成了几个平滑的曲线,租户的压测也规矩地在配额与 QoS 的轨道上跑。回酒店的路上,维港的灯还亮着,我有一种很“俗”的满足:边界感被清清楚楚写进了系统,谁能看见什么、用到多少、走哪条路,都有据可查、有门可锁。

你如果也在香港机房里值过夜班,应该能懂这种感觉。希望这份记录,能让你的下一个多租户环境,边界更硬、心更稳。

目录结构
全文