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)

项配置
虚机 ×36 vCPU / 12 GB 内存 / 80G 系统盘 + 2×60G OSD 盘(sdb、sdc)
guestOSrhel8-64,BIOS 引导,vhv.enable = TRUE(嵌套虚拟化,compute 节点必须)
ISOopenEuler-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/24controller=.11,compute1=.12,compute2=.13
内部 VIP--192.168.172.100(keepalived+haproxy)
外部网络VMnet8(NAT)192.168.182.0/24DHCP,网关 192.168.182.2

0.3 版本对应表

组件版本来源
OSopenEuler 24.03 LTS SP4(内核 6.6.0)官方 ISO
Ceph18.2.2-13.oe2403sp4(reef)openEuler 官方 RPM 源
kolla-ansible22.2.0(= OpenStack 2025.1 Epoxy)pypi
ansible-core2.18.19pypi(随 kolla-ansible 依赖)
容器镜像2025.1-rocky-10quay.nju.edu.cn / openstack.kolla
Docker服务端 moby-engine 25.0.3(openEuler 源)+ CLI 静态 27.3.1(NJU)见第 3 章

0.4 镜像源汇总(全部国内可用,实测)

用途源备注
dnf / RPMopenEuler 官方(OS/EPOL/everything/update)无需改动,ceph/moby 都在里面
piphttps://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 镜像缺件导致):

  1. toolbox 补装 ansible-runner(否则 OVS 端口配置下发失败):
    docker exec -u root kolla_toolbox /opt/ansible/bin/pip install ansible-runner
    (容器被重建后会丢,需重装)
  2. 验证 /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-ceglobals 里 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 场景无 lvmskip_cinder_backend_check: yes
deploy 期间 proxysql 容器日志 KeyErrorrules.yaml.j2 模板 bug打补丁 4.7-补丁二
OVS 端口配置下发失败kolla_toolbox 缺 ansible-runnerdocker exec -u root kolla_toolbox /opt/ansible/bin/pip install ansible-runner
ceph-mon 停在 probingfirewalld 拦 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 foundlibvirt 缺 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
Cephceph-mon / ceph-osd / ceph-mds / ceph-common / ceph-volume18.2.2-13.oe2403sp4dnf
Dockermoby-engine 25.0.3(服务端)openEuler 源dnf
Dockerdocker CLI 27.3.1(静态二进制)NJUtar 解压到 /usr/local/bin
Dockerdocker SDK(python docker 包)pypipip3
Kollakolla-ansible 22.2.0 / ansible(含 collections)pypi/opt/kolla-venv 内 pip
镜像2025.1-rocky-10 全家桶(约 49 个)quay.nju.edu.cnkolla-ansible pull

* podman 仅在最初尝试 cephadm 时安装,RPM 原生 Ceph 方案下非必需。

附录 B:目录与文件速查

路径内容
/etc/kolla/globals.yml / passwords.yml / admin-openrc.shkolla 全局配置 / 密码 / admin 凭据
/root/multinodeansible 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密钥对私钥 / 测试镜像
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐