OpenStack 2025.1 + Ceph 三节点部署手册
OpenStack 2025.1 + Ceph 三节点部署手册
openEuler 24.03 LTS SP4(最小化安装)+ Kolla-Ansible 22.2.0(容器化)+ Ceph 18.2.2(RPM 原生)
完全按本文档顺序复制粘贴即可复现当前集群。所有命令均已按"在哪台执行"标注。
安全提示:文中含明文口令,仅限内网实验环境。
0. 部署规划
0.1 虚拟机规划(VMware Workstation 17.5.2)
| 项 | 配置 |
|---|---|
| 虚机 ×3 | 6 vCPU / 12 GB 内存 / 80G 系统盘 + 2×60G OSD 盘(sdb、sdc) |
| guestOS | rhel8-64,BIOS 引导,vhv.enable = TRUE(嵌套虚拟化,compute 节点必须) |
| ISO | openEuler-24.03-LTS-SP4-x86_64-dvd.iso(ISO 存放路径不能含中文,否则 vmx 乱码) |
| 系统安装 | 最小化安装,只勾 sda,双网卡 DHCP,主机名 controller / compute1 / compute2,root 密码 **********8 |
宿主机前提:VMware 嵌套虚拟化要求宿主关闭 Hyper-V/VBS。Win11 上需依次执行:
bcdedit /set hypervisorlaunchtype off、bcdedit /set vsmlaunchtype off、导入注册表禁用 DRTM(HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\SystemGuard下 Enabled=0)后重启。三者缺一都会报 VT-x/EPT 不可用。
0.2 网络规划
| 网络 | VMware | 网段 | 节点地址 |
|---|---|---|---|
| 管理网 | VMnet1(仅主机) | 192.168.172.0/24 | controller=.11,compute1=.12,compute2=.13 |
| 内部 VIP | - | - | 192.168.172.100(keepalived+haproxy) |
| 外部网络 | VMnet8(NAT) | 192.168.182.0/24 | DHCP,网关 192.168.182.2 |
0.3 版本对应表
| 组件 | 版本 | 来源 |
|---|---|---|
| OS | openEuler 24.03 LTS SP4(内核 6.6.0) | 官方 ISO |
| Ceph | 18.2.2-13.oe2403sp4(reef) | openEuler 官方 RPM 源 |
| kolla-ansible | 22.2.0(= OpenStack 2025.1 Epoxy) | pypi |
| ansible-core | 2.18.19 | pypi(随 kolla-ansible 依赖) |
| 容器镜像 | 2025.1-rocky-10 | quay.nju.edu.cn / openstack.kolla |
| Docker | 服务端 moby-engine 25.0.3(openEuler 源)+ CLI 静态 27.3.1(NJU) | 见第 3 章 |
0.4 镜像源汇总(全部国内可用,实测)
| 用途 | 源 | 备注 |
|---|---|---|
| dnf / RPM | openEuler 官方(OS/EPOL/everything/update) | 无需改动,ceph/moby 都在里面 |
| pip | https://pypi.tuna.tsinghua.edu.cn/simple | 清华 |
| OpenStack 容器镜像 | quay.nju.edu.cn,namespace openstack.kolla | 南京大学;quay.io 直连基本不可用 |
| Docker CLI 静态包 | mirrors.nju.edu.cn/docker-ce/linux/static/stable/x86_64/docker-27.3.1.tgz | |
| ansible-galaxy | 不可用(galaxy.ansible.com artifact 302 → AWS 被墙) | 用 pip 安装 ansible 完整 bundle 替代,见 4.3 |
| 测试用虚机镜像 | repo.openeuler.org/openEuler-24.03-LTS-SP4/virtual_machine_img/x86_64/openEuler-24.03-LTS-SP4-x86_64-qcow2.xz 或 cirros 官方 download.cirros-cloud.net |
1. 操作系统基础配置(三节点都执行)
1.1 主机名与 hosts
# 各节点分别设置主机名(示例为 controller)
hostnamectl set-hostname controller
# 三节点追加 hosts 映射
grep -q "^192.168.172.11 controller" /etc/hosts || printf "192.168.172.11 controller\n192.168.172.12 compute1\n192.168.172.13 compute2\n" >> /etc/hosts
1.2 网卡静态化(NetworkManager)
openEuler 最小安装双网卡名默认为 enp0s17(VMnet1 管理网)与 enp0s18(VMnet8 NAT)。每台节点把 .11/.12/.13 替换成自己的地址:
# 管理网:静态(每台替换地址;不给 gateway,默认路由走 NAT 口)
nmcli con add type ethernet con-name mgmt0 ifname enp0s17 \
ipv4.method manual ipv4.addresses 192.168.172.11/24
# NAT 口:DHCP,默认路由与 DNS 从这里拿
nmcli con add type ethernet con-name nat0 ifname enp0s18 ipv4.method auto
nmcli con up mgmt0 && nmcli con up nat0
ip -br a # 确认 enp0s17 静态 IP、enp0s18 拿到 192.168.182.x
1.3 SSH 三节点互信
# 每台生成密钥(一路回车)
[ -f /root/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519 -q
# 每台把三台的公钥都写进 authorized_keys(可用 ssh-copy-id 逐台做,或手动汇总)
ssh-copy-id -o StrictHostKeyChecking=no root@controller
ssh-copy-id -o StrictHostKeyChecking=no root@compute1
ssh-copy-id -o StrictHostKeyChecking=no root@compute2
ssh-keyscan -H controller compute1 compute2 >> /root/.ssh/known_hosts 2>/dev/null
# 验证 9/9 通
for h in controller compute1 compute2; do ssh -o BatchMode=yes $h hostname; done
1.4 SELinux、防火墙、时间同步
# SELinux 设为 Permissive(strict 模式未验证)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
getenforce # Permissive
# 实验环境直接关防火墙(openEuler ceph-mon 会因 firewalld 拦 3300/6789 卡在 probing)
systemctl stop firewalld && systemctl disable firewalld
# 时间同步(openEuler 自带 chrony,保持默认即可)
systemctl enable --now chronyd && chronyc tracking | head -2
1.5 pip 源与基础包
# pip 源 → 清华
mkdir -p /etc
printf "[global]\nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple\ntrusted-host = pypi.tuna.tsinghua.edu.cn\n" > /etc/pip.conf
# 基础包
dnf install -y python3-pip python3-libselinux lvm2 chrony uuid
python3 -c "import selinux; print('selinux-ok')" # ansible 必需
dnf 源不用改:openEuler 24.03 SP4 自带的 OS/EPOL/everything/update 源包含 ceph 全套和 moby-engine,直接可用。此前尝试的 cephadm 容器化路线(需拉 quay.io 镜像)在当前网络不可行,直接用 RPM 原生部署 Ceph。
2. Ceph 部署(RPM 原生,三节点手工集群)
2.1 安装 Ceph RPM(三节点)
dnf install -y ceph-mon ceph-osd ceph-mds ceph-common ceph-volume
rpm -q ceph-mon ceph-osd ceph-mds ceph-common ceph-volume
# ceph-mon-18.2.2-13.oe2403sp4.x86_64
2.2 在 controller 初始化集群配置
# 生成 ceph.conf(fsid 用 uuidgen 生成后固定下来,下文以实际 FSID 为例)
FSID=$(uuidgen); echo "FSID=$FSID" # 记下它,后面 monmap 要用
mkdir -p /etc/ceph /var/lib/ceph/tmp /var/lib/ceph/bootstrap-osd
cat > /etc/ceph/ceph.conf <<EOF
[global]
fsid = $FSID
mon initial members = controller compute1 compute2
mon host = 192.168.172.11,192.168.172.12,192.168.172.13
public network = 192.168.172.0/24
cluster network = 192.168.172.0/24
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 64
osd pool default pgp num = 64
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
EOF
# 密钥三件套
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring \
--gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring \
--gen-key -n client.bootstrap-osd --cap mon 'allow profile bootstrap-osd'
# **关键防坑**:openEuler 的 ceph-mon --mkfs 会自动生成默认 client.admin/bootstrap 密钥、
# 忽略 keyring 里的同名实体,导致集群内 admin 密钥不一致。先把 admin/bootstrap 密钥
# 合并进 mon.keyring,mkfs 时就会一起写入。
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
# monmap:显式登记 3 个 mon(v2+v1 双端口)
monmaptool --create --clobber \
--addv controller "[v2:192.168.172.11:3300/0,v1:192.168.172.11:6789/0]" \
--addv compute1 "[v2:192.168.172.12:3300/0,v1:192.168.172.12:6789/0]" \
--addv compute2 "[v2:192.168.172.13:3300/0,v1:192.168.172.13:6789/0]" \
--fsid $FSID /tmp/monmap-bin
chmod 644 /etc/ceph/ceph.conf
chmod 600 /etc/ceph/ceph.client.admin.keyring /tmp/ceph.mon.keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
2.3 分发到 compute1 / compute2(controller 执行)
for h in compute1 compute2; do
scp /etc/ceph/ceph.conf /etc/ceph/ceph.client.admin.keyring /tmp/ceph.mon.keyring $h:/etc/ceph/
scp /tmp/monmap-bin $h:/tmp/monmap-bin
ssh $h "mkdir -p /var/lib/ceph/bootstrap-osd"
scp /var/lib/ceph/bootstrap-osd/ceph.keyring $h:/var/lib/ceph/bootstrap-osd/
done
2.4 各节点启动 mon(三节点都执行)
H=$(hostname -s)
mkdir -p /var/lib/ceph/mon/ceph-$H
chown -R ceph:ceph /var/lib/ceph/mon/ceph-$H /etc/ceph /var/lib/ceph/bootstrap-osd
restorecon -R /etc/ceph /var/lib/ceph 2>/dev/null || true
sudo -u ceph ceph-mon --cluster ceph --mkfs -i $H --monmap /tmp/monmap-bin --keyring /tmp/ceph.mon.keyring
touch /var/lib/ceph/mon/ceph-$H/done
systemctl enable --now ceph-mon@$H
sleep 6 && systemctl is-active ceph-mon@$H
三台 mon 都起来后
ceph -s应显示 3 mon quorum。若 mgr 启动失败过,先systemctl reset-failed ceph-mgr@$H。
2.5 注册 mgr keyring 并启动 mgr(三节点都执行)
openEuler 的 ceph-mgr@.service 要求密钥文件预先存在于 /var/lib/ceph/mgr/ceph-$H/keyring:
H=$(hostname -s)
mkdir -p /var/lib/ceph/mgr/ceph-$H
# controller 上执行(mon quorum 就绪后);compute 节点从 controller scp 过去即可
ceph auth get-or-create mgr.$H mon 'allow profile mgr' osd 'allow *' mds 'allow *' \
-o /var/lib/ceph/mgr/ceph-$H/keyring
chown -R ceph:ceph /var/lib/ceph/mgr
systemctl enable --now ceph-mgr@$H
2.6 创建 OSD(三节点,各 2 块盘)
ceph-volume lvm create --data /dev/sdb
ceph-volume lvm create --data /dev/sdc
ls /var/lib/ceph/osd/ | wc -l # 全集群共 6 个
2.7 创建 RBD 池(controller)
for p in images volumes vms; do
ceph osd pool create $p 64
rbd pool init $p
done
ceph health # 期望 HEALTH_OK
2.8 生成 OpenStack 对接凭据与配置(controller)
mkdir -p /etc/kolla/config/glance /etc/kolla/config/cinder/cinder-volume /etc/kolla/config/nova
ceph auth get-or-create client.glance mon 'profile rbd' osd 'profile rbd pool=images' \
mgr 'profile rbd pool=images' -o /etc/kolla/config/glance/ceph.client.glance.keyring
ceph auth get-or-create client.cinder mon 'profile rbd' \
osd 'profile rbd pool=volumes, profile rbd pool=vms' \
mgr 'profile rbd pool=volumes, profile rbd pool=vms' \
-o /etc/kolla/config/cinder/cinder-volume/ceph.client.cinder.keyring
ceph auth get-or-create client.nova mon 'profile rbd' \
osd 'profile rbd pool=vms, profile rbd pool=volumes' \
mgr 'profile rbd pool=vms, profile rbd pool=volumes' \
-o /etc/kolla/config/nova/ceph.client.nova.keyring
for d in glance cinder/cinder-volume nova; do cp /etc/ceph/ceph.conf /etc/kolla/config/$d/ceph.conf; done
3. Docker 安装(三节点)
openEuler 的 moby-engine 只有服务端没有 CLI,且其 /etc/sysconfig/docker 默认参数与 kolla 生成的 daemon.json 冲突,必须按以下顺序处理:
# 1) 服务端(openEuler 源)
dnf install -y moby-engine
# 2) CLI:NJU 静态二进制补齐(kolla 由 systemd 以 /usr/bin/docker start -a 管理容器,没有 CLI 一切免谈)
curl -sL --max-time 120 -o /tmp/docker.tgz \
"https://mirrors.nju.edu.cn/docker-ce/linux/static/stable/x86_64/docker-27.3.1.tgz"
tar xzf /tmp/docker.tgz -C /tmp docker/docker --strip-components=1
install -m 755 /tmp/docker /usr/local/bin/docker
ln -sf /usr/local/bin/docker /usr/bin/docker # **必须**,否则 kolla-* unit 全部 203/EXEC
docker --version
# 3) 移除 sysconfig 里与 daemon.json 冲突的 --log-driver=journald
sed -i "s/--log-driver=journald//g" /etc/sysconfig/docker
# 4) daemon.json:桥与 iptables 全关(容器网络由 kolla/neutron 接管),限制日志
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
"bridge": "none",
"ip-forward": false,
"iptables": false,
"log-driver": "json-file",
"log-opts": {"max-file": "5", "max-size": "50m"}
}
EOF
# 5) docker SDK(ansible docker 模块依赖)
pip3 install docker
systemctl enable --now docker && systemctl is-active docker
4. kolla-ansible 安装与配置(仅 controller)
4.1 Python 虚拟环境
python3 -m venv /opt/kolla-venv
/opt/kolla-venv/bin/pip install -U pip
/opt/kolla-venv/bin/pip install "kolla-ansible==2025.1"
/opt/kolla-venv/bin/kolla-ansible --version # 22.2.0
4.2 ansible 依赖:用完整 bundle 替代 galaxy
galaxy.ansible.com 的 artifact 下载被墙(302 → AWS),不要跑 ansible-galaxy 拉取,直接用 pip 的 ansible 大包(内含 kolla 需要的全部 collections):
/opt/kolla-venv/bin/pip install ansible
# 验证 collections 齐全
/opt/kolla-venv/bin/ansible-galaxy collection list | \
grep -E "community.general|community.docker|ansible.posix|community.crypto|ansible.netcommon|ansible.utils"
/opt/kolla-venv/bin/kolla-ansible install-deps
4.3 复制配置模板与 inventory
mkdir -p /etc/kolla
cp -r /opt/kolla-venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla/
cp /opt/kolla-venv/share/kolla-ansible/ansible/inventory/multinode /root/multinode
4.4 编写 /root/multinode(全文替换)
[control]
controller ansible_host=192.168.172.11
[network]
controller ansible_host=192.168.172.11
[compute]
compute1 ansible_host=192.168.172.12
compute2 ansible_host=192.168.172.13
[monitoring]
controller ansible_host=192.168.172.11
[storage]
controller ansible_host=192.168.172.11
[loadbalancer]
controller ansible_host=192.168.172.11
[deployment]
localhost ansible_connection=local
inventory 必须保留完整 multinode 模板结构(各服务组是
[control]的 children)。只留[control]/[compute]会导致大量服务无处部署。也不要去 sed 模板里的注释行(曾把#compute01 api_interface=em1弄成未注释行,污染 compute 节点配置)。
4.5 编写 /etc/kolla/globals.yml(全文替换)
---
kolla_base_distro: "rocky"
openstack_release: "2025.1"
docker_registry: "quay.nju.edu.cn"
docker_namespace: "openstack.kolla"
kolla_internal_vip_address: "192.168.172.100"
network_interface: "enp0s17"
neutron_external_interface: "enp0s18"
enable_haproxy: "yes"
enable_cinder: "yes"
enable_cinder_backend_lvm: "no"
enable_heat: "no"
enable_neutron_provider_networks: "yes"
enable_opensearch: no
openstack_service_workers: "3"
# —— openEuler 适配 ——
redhat_pkg_install:
- git
- iputils
- sudo
enable_docker_repo: false # 不加 docker-ce 源(openEuler 上装不上且失败会残留 /etc/yum.repos.d/docker.repo)
docker_packages:
- moby-engine
skip_cinder_backend_check: yes # 外部 Ceph 场景必须,否则 prechecks 因无 lvm 后端报错
4.6 生成密码
/opt/kolla-venv/bin/kolla-genpwd -p /etc/kolla/passwords.yml
grep keystone_admin_password /etc/kolla/passwords.yml # 记下 admin 密码
4.7 两个必打补丁(openEuler + 22.2.0 特有)
补丁一:prechecks 兼容 openEuler 24.03 / ansible 2.18。
编辑 /opt/kolla-venv/share/kolla-ansible/ansible/roles/prechecks/vars/main.yml:
# ① 版本门槛行改为(原始为 ansible_version_min: '2.19')
docker_version_min: '18.09'
docker_py_version_min: '3.4.1'
ansible_version_min: '2.18'
ansible_version_max: '2.20'
# ② distribution_version 匹配列表中,openEuler 段改为:
openEuler:
- "24.03"
- "sp4"
补丁二:proxysql 规则模板 KeyError。
22.2.0 的 /opt/kolla-venv/share/kolla-ansible/ansible/roles/proxysql-config/templates/rules.yaml.j2 生成的第二条规则只有 username 无 schemaname,镜像内 kolla_proxysql_config_sync 会 KeyError(2025.1 中 MariaDB 的 VIP 负载均衡必须走 proxysql,不能绕过)。编辑该模板,删除其中 username-only 的规则分支,只保留带 schemaname 的分支(改后第 15 行附近应只有 schemaname: "{{ rule['schema'] }}" 形式)。改前先 cp rules.yaml.j2 rules.yaml.j2.bak。
5. 部署执行(controller,/opt/kolla-venv/bin 加入 PATH)
export PATH=/opt/kolla-venv/bin:$PATH
export ANSIBLE_HOST_KEY_CHECKING=False
cd /root
# ① bootstrap-servers:给三节点装基础包/内核参数/创建 kolla 用户
kolla-ansible bootstrap-servers -i /root/multinode
# 若中途 docker-ce 源安装失败:rm -f /etc/yum.repos.d/docker.repo 后重跑
# ② prechecks:部署前体检(补丁 4.7 生效后应 RC=0)
kolla-ansible prechecks -i /root/multinode
# ③ pull:预拉全部容器镜像(NJU 源,约 40 个镜像,耗时较长,建议 nohup)
nohup kolla-ansible pull -i /root/multinode > /root/kolla_pull.log 2>&1 &
tail -f /root/kolla_pull.log
# ④ deploy:正式部署(1~2 小时,建议 nohup)
nohup kolla-ansible deploy -i /root/multinode > /root/kolla_deploy.log 2>&1 &
tail -f /root/kolla_deploy.log
# ⑤ post-deploy:生成凭据
kolla-ansible post-deploy -i /root/multinode
cp /etc/kolla/admin-openrc.sh /root/ # 若文件生成在 /etc/kolla/ 下
deploy 收尾后必须立刻做两件事(NJU 镜像缺件导致):
- toolbox 补装 ansible-runner(否则 OVS 端口配置下发失败):
docker exec -u root kolla_toolbox /opt/ansible/bin/pip install ansible-runner
(容器被重建后会丢,需重装)- 验证
/usr/bin/docker软链存在(compute 节点也要),否则 kolla-*-container.service 全部 203/EXEC:
ls -l /usr/bin/docker && systemctl restart kolla-haproxy-container.service
6. 部署后必做:Ceph 对接补全(三步,否则虚机起不来)
kolla 22.2 对外部 Ceph 的 keyring 不会自动注入 openEuler 场景的容器配置,必须手工补:
6.1 把 ceph 配置/keyring 声明进容器(compute ×2 与 controller)
对 compute 节点的 /etc/kolla/nova-compute/(owner 用 nova):
D=/etc/kolla/nova-compute
cp /etc/ceph/ceph.conf $D/ceph.conf
ceph auth get client.nova -o $D/ceph.client.nova.keyring
chmod 644 $D/ceph.conf && chmod 640 $D/ceph.client.nova.keyring
python3 - <<'EOF'
import json
p='/etc/kolla/nova-compute/config.json'
c=json.load(open(p))
files=[f['source'] for f in c['config_files']]
want=[('/var/lib/kolla/config_files/ceph.conf','/etc/ceph/ceph.conf','nova','0644'),
('/var/lib/kolla/config_files/ceph.client.nova.keyring','/etc/ceph/ceph.client.nova.keyring','nova','0600')]
for src,dst,owner,perm in want:
if src not in files:
c['config_files'].append({'source':src,'dest':dst,'owner':owner,'perm':perm})
json.dump(c,open(p,'w'),indent=4)
print('updated')
EOF
docker restart nova_compute
controller 的 /etc/kolla/cinder-volume/ 与 /etc/kolla/cinder-backup/ 同理(keyring 用 client.cinder,owner 用 cinder),改完 docker restart cinder_volume cinder_backup。
6.2 libvirt 注册 RBD secret(compute ×2)
# UUID 必须与 cinder-volume.conf / nova-compute.conf 里的 rbd_secret_uuid 一致
UUID=3d3b0f3e-1a2b-4c5d-8e9f-0a1b2c3d4e5f
KEY=$(ceph auth get-key client.nova)
cat > /tmp/rbd-secret.xml <<EOF
<secret ephemeral='no' private='no'>
<uuid>$UUID</uuid>
<usage type='ceph'><name>client.nova secret</name></usage>
</secret>
EOF
docker cp /tmp/rbd-secret.xml nova_libvirt:/tmp/rbd-secret.xml
docker exec nova_libvirt virsh secret-define --file /tmp/rbd-secret.xml
docker exec nova_libvirt virsh secret-set-value --secret $UUID --base64 "$KEY"
# 备份
mkdir -p /etc/kolla/nova-libvirt/secrets
cp /tmp/rbd-secret.xml /etc/kolla/nova-libvirt/secrets/
echo "$KEY" > /etc/kolla/nova-libvirt/secrets/client.nova.key
6.3 br-ex 改为 standalone(三节点)
docker exec openvswitch_vswitchd ovs-vsctl set bridge br-ex fail_mode=standalone
7. 部署后初始化与验证(controller,kolla_toolbox 内)
docker exec -it kolla_toolbox bash
export OS_AUTH_URL=http://192.168.172.100:5000/v3 OS_USERNAME=admin \
OS_PASSWORD='<keystone_admin_password>' OS_PROJECT_NAME=admin \
OS_USER_DOMAIN_NAME=Default OS_PROJECT_DOMAIN_NAME=Default OS_IDENTITY_API_VERSION=3
# 外部网络(flat physnet1 = br-ex 上的 192.168.182.0/24)
openstack network create --external --provider-physical-network physnet1 \
--provider-network-type flat --share ext-net
openstack subnet create --network ext-net --subnet-range 192.168.182.0/24 \
--no-dhcp --gateway 192.168.182.2 \
--allocation-pool start=192.168.182.100,end=192.168.182.200 ext-subnet
# 内部网络(VXLAN)
openstack network create demo-net
openstack subnet create --network demo-net --subnet-range 10.0.0.0/24 --gateway 10.0.0.1 \
--allocation-pool start=10.0.0.10,end=10.0.0.200 \
--dns-nameserver 114.114.114.114 demo-subnet
# 路由器(注意:先建子网再设外网网关,否则网关口拿不到 IP)
openstack router create demo-router
openstack router add subnet demo-router demo-subnet
openstack router set --external-gateway ext-net demo-router
openstack router show demo-router | grep external_gateway_info # 应有 fixed_ip
# 规格 / 镜像 / 安全组 / 密钥对
openstack flavor create --vcpus 1 --ram 512 --disk 1 --public m1.tiny
openstack flavor create --vcpus 1 --ram 1024 --disk 10 --public m1.small
openstack security group rule create --proto icmp default
openstack security group rule create --proto tcp --dst-port 22 default
openstack keypair create demo-key > /root/demo-key.pem && chmod 600 /root/demo-key.pem
# cirros 镜像:ctl 无 DNS,需在本机下载后 SFTP 到 /root/ 再 docker cp 进 toolbox
openstack image create --public --disk-format qcow2 --container-format bare \
--file /tmp/cirros.img cirros-0.6.2
# 起测试虚机
openstack server create --flavor m1.tiny --image cirros-0.6.2 \
--network demo-net --key-name demo-key test-vm1
openstack floating ip create ext-net
openstack server add floating ip test-vm1 <浮动IP>
# 端到端验证
openstack server list # ACTIVE + 内网 IP
openstack console log show --lines 5 test-vm1 # cirros login 提示
# 本机 ssh cirros@<浮动IP>,密码 gocubsgo
8. 常见故障速查(部署阶段)
| 报错/现象 | 根因 | 处理 |
|---|---|---|
| kolla-*-container.service 状态 203/EXEC | /usr/bin/docker 不存在(moby-engine 无 CLI) | 静态 CLI + ln -sf /usr/local/bin/docker /usr/bin/docker(三节点) |
| bootstrap-servers 在 docker 角色失败 | enable_docker_repo 默认尝试装 docker-ce | globals 里 enable_docker_repo: false + docker_packages: [moby-engine];失败后 rm -f /etc/yum.repos.d/docker.repo 重跑 |
| prechecks 报 distribution/version 不支持 | vars 未含 openEuler 24.03 | 打补丁 4.7-补丁一 |
| prechecks 报 ansible 版本 | ansible-core 2.18 被 2.19 门槛卡 | 同上(ansible_version_min: '2.18') |
| prechecks 报无 cinder 后端 | 外部 Ceph 场景无 lvm | skip_cinder_backend_check: yes |
| deploy 期间 proxysql 容器日志 KeyError | rules.yaml.j2 模板 bug | 打补丁 4.7-补丁二 |
| OVS 端口配置下发失败 | kolla_toolbox 缺 ansible-runner | docker exec -u root kolla_toolbox /opt/ansible/bin/pip install ansible-runner |
| ceph-mon 停在 probing | firewalld 拦 3300/6789 | 关闭 firewalld |
| ceph mon/mgr 起不来、密钥不匹配 | openEuler mkfs 自动生成默认密钥 | 按 2.2 合并 keyring 后 mkfs;mgr 按 2.5 预置 keyring |
| 虚机 NoValidHost(StorageError) | ceph.conf/keyring 没进 nova_compute 容器 | 按 6.1 补 config.json |
| 虚机 ERROR: Secret not found | libvirt 缺 RBD secret | 按 6.2 注册 |
| 浮动 IP ping 不通 | br-ex fail_mode=secure | 按 6.3 改 standalone |
附录 A:本次实际安装的软件清单
| 层 | 包/软件 | 版本 | 安装方式 |
|---|---|---|---|
| OS 基础 | python3-pip / python3-libselinux / lvm2 / chrony / uuid / podman* | openEuler 源 | dnf |
| Ceph | ceph-mon / ceph-osd / ceph-mds / ceph-common / ceph-volume | 18.2.2-13.oe2403sp4 | dnf |
| Docker | moby-engine 25.0.3(服务端) | openEuler 源 | dnf |
| Docker | docker CLI 27.3.1(静态二进制) | NJU | tar 解压到 /usr/local/bin |
| Docker | docker SDK(python docker 包) | pypi | pip3 |
| Kolla | kolla-ansible 22.2.0 / ansible(含 collections) | pypi | /opt/kolla-venv 内 pip |
| 镜像 | 2025.1-rocky-10 全家桶(约 49 个) | quay.nju.edu.cn | kolla-ansible pull |
* podman 仅在最初尝试 cephadm 时安装,RPM 原生 Ceph 方案下非必需。
附录 B:目录与文件速查
| 路径 | 内容 |
|---|---|
/etc/kolla/globals.yml / passwords.yml / admin-openrc.sh | kolla 全局配置 / 密码 / admin 凭据 |
/root/multinode | ansible inventory |
/etc/kolla/config/{glance,cinder,nova}/ | 外部 Ceph 对接 conf + keyring(deploy 前放置) |
/etc/kolla/<服务>/config.json | 各服务容器的文件挂载声明(改后需 restart 容器) |
/opt/kolla-venv/ | kolla-ansible 虚拟环境(含两个补丁文件) |
/etc/ceph/ | Ceph 全局配置与 admin keyring |
/var/lib/ceph/{mon,mgr,osd,bootstrap-osd}/ | Ceph 数据目录 |
/etc/kolla/nova-libvirt/secrets/ | RBD secret 备份 |
/root/demo-key.pem / /root/cirros-0.6.2-x86_64-disk.img | 密钥对私钥 / 测试镜像 |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)