1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

实例⽆法访问

要是发现创建好的虚拟机实例没法分配浮动IP地址,那八成是网络配置没搞定。要是路由器没被设置成外部网络的网关,那肯定就没办法把浮动IP地址分配给实例了。

不过,就算路由器还没连上外部网络,你也能先创建浮动IP地址。但当你想把浮动IP地址关联到实例的时候,就会弹出个错误提示了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(overcloud) [stack@director ~]$ openstack server add floating ip finance-web1 172.25.250.N
Error: External network 7aaf57c1-3c34-45df-94d3-dbc12754b22e is not reachable from subnet cfc7ddfa-4403-41a7-878f-e8679596eafd.

(overcloud) [stack@director ~]$ openstack router show finance-router1
+--------------------------------------------------------------+
| Field | Value |
+--------------------------------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | nova |
| created_at | 2017-06-15T09:39:07Z |
| description | |
| external_gateway_info | null |
| flavor_id | None |

设置路由器网关

要是你想把路由器设置成外部网络的网关,可以用这个命令:

1
openstack router set --external-gateway external_network router

给实例分配浮动IP地址

分配浮动IP地址也很简单,用这个命令:

1
openstack server add floating ip finance-web1 172.25.250.N

SSH登录失败问题

如果用SSH登录实例的时候提示超时,比如:

1
2
(overcloud) [stack@director ~]$ ssh cloud-user@172.25.250.N
ssh: connect to host 172.25.250.N port 22: Connection timed out

那得先检查一下实例的安全组规则,是不是允许了SSH流量。默认情况下,SSH是不允许的。

那也有可能是实例没有分配密钥对,如果创建实例的时候没有分配密钥对,SSH登录也会失败。这种情况下,只能删除实例,然后重新创建一个,并且记得分配密钥对。

物理网络问题

如果OpenStack网络组件的配置都没问题,但计算节点之间或者与外部系统的通信还是失败,那可能是底层物理网络有问题,就需要协调网络工程师一起调试,比如看看ovs网络?geneve网络等等?

镜像服务问题

镜像服务是用来存储镜像和元数据的。用户可以创建镜像并上传到镜像服务中。镜像服务有一个RESTful API,用户可以通过它查询镜像的元数据,也可以获取实际的镜像文件。

服务日志

镜像服务的日志配置在 /var/lib/config-data/puppet-generated/glance_api/etc/glance/glance-api.conf 文件里。你可以在这个文件里配置日志级别、日志文件的存放位置,以及是否使用syslog或者journald来记录日志。

还可以用 image_size_cap 选项限制镜像的最大大小,用 user_storage_quota 选项为每个用户配置存储限额。

管理镜像

如果你想保护一个镜像,防止它被删除,可以用 --protected 选项。如果你想允许删除镜像,就用 --unprotected 选项。

比如:

1
(overcloud) [stack@director ~]$ openstack image set --unprotected rhel8-web

管理卷

OpenStack块存储服务可以用Ceph作为后端存储。在块存储服务中创建的每个卷,在Ceph中都有一个对应的RBD镜像,RBD镜像的名字就是块存储卷的ID。

Ceph存储

OpenStack块存储服务需要在Ceph中配置一个用户和一个存储池才能使用。这个用户是 openstack,和使用Ceph作为后端的其他服务(比如OpenStack镜像服务)配置的用户是同一个。底层云还会为块存储服务创建一个专用的Ceph存储池,名字叫 volumes。这个存储池包含了所有与卷关联的RBD镜像。这些设置都包含在 /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf 配置文件里。

比如:

1
(overcloud) [stack@director ~]$ grep ^rbd_ /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf

在Ceph中,权限被称为能力,是按守护进程类型(比如MON或者OSD)授予的。Ceph中有三种能力:读(r)用于查看,写(w)用于修改,执行(x)用于执行扩展对象类。所有守护进程类型都支持这三种能力。对于OSD守护进程类型,权限可以限制在一个或多个存储池上。比如:

osd 'allow rwx pool=rbd, allow rx pool=mydata'

如果没有指定存储池,权限就会授予所有现有的存储池。openstack 用户在OpenStack服务使用的存储池上都有权限。

openstack 用户需要在 volumesimages 存储池上都有读、写和执行权限,这些存储池才会被OpenStack块存储服务使用。images 存储池是专门为OpenStack镜像服务使用的。

1
(overcloud) [stack@director ~]$ podman exec -ti ceph-mgr-controller ceph auth list

卷的挂载和卸载工作流

挂载和卸载卷的操作都有三个API调用:

  1. 在数据库中更新卷的状态。

  2. 处理卷的连接操作。

  3. 最终确定卷的状态并释放资源。

要挂载一个卷,它必须处于可用状态。其他状态都会导致错误消息。有时候,卷可能会卡在卸载状态。管理员用户可以手动更改状态。

比如:

1
(overcloud) [stack@director ~]$ cinder reset-state --state available volume_id

如果你尝试删除一个卷,但失败了,可以用 –force 选项强制删除。

1
(overcloud) [stack@director ~]$ openstack volume delete --force volume_id

⽇志⽂件

服务日志路径
API 服务/var/log/containers/cinder/cinder-api.log
卷服务/var/log/containers/cinder/cinder-volume.log
调度服务/var/log/containers/cinder/cinder-scheduler.log
cinder-manage/var/log/containers/cinder/cinder-manage.log

块存储服务API日志文件对于判断错误是由于端点还是连接问题很有用。比如,如果你尝试创建一个卷,但失败了,那就先查看 /var/log/containers/cinder/cinder-api.log 文件,确认请求是否已经收到。如果没有错误,再查看 /var/log/containers/cinder/cinder-volume.log 文件,看看在卷创建过程中是否出现了错误。

cinder-manage.log 文件记录了cinder数据库迁移的条目。

为了让OpenStack块服务正常运行,它们必须配置为使用RabbitMQ消息服务。所有配置都可以在控制器节点上的 /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf 配置文件中找到。

rabbit_userid 选项的默认值是 guest。如果这个用户配置错误,并且块存储服务重启了,RabbitMQ将不会响应请求,因为认证会失败。任何状态为 ERROR 的卷都必须在块存储服务重启并正常运行后删除并重新创建。

要确定这个问题,可以查看控制器节点上的 /var/log/containers/cinder/cinder-scheduler.log 日志文件。如果问题是RabbitMQ,你会看到类似这样的内容:

1
2
3
201 (...) Failed to run task
cinder.scheduler.flows.create_volume.ScheduleCreateVolumeTask;volume:create:
No valid host was found. No weighed hosts available

检查 RabbitMQ 和配置文件

如果块存储服务出现问题,首先得确认 RabbitMQ 集群和 rabbitmq-bundle Pacemaker 资源都是可用的。要是这两个都没问题,那可能就得怀疑 /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf 配置文件里有没有写错了。

你可以按照下面的步骤来排查:

  1. 检查 RabbitMQ 集群状态

先看看 RabbitMQ 集群是不是正常运行。可以用一些命令或者查看管理界面来确认。

  1. 检查 Pacemaker 资源状态

再看看 rabbitmq-bundle 这个 Pacemaker 资源的状态。可以用类似下面的命令:

1
(overcloud) [stack@director ~]$ podman exec -ti rabbitmq-bundle-podman-0 rabbitmqctl status
1
2
3
4
5
(overcloud) [stack@director ~]$ sudo pcs resource config rabbitmq-bundle
Bundle: rabbitmq-bundle
Podman: image=cluster.common.tag/gls-dle-dev-osp16-osp16_containers-openstack-rabbitmq:pcmklatest network=host options="--user=root --log-driver=k8s-file --log-opt path=/var/log/containers/stdouts/rabbitmq-bundle.log -e KOLLA_CONFIG_STRATEGY=COPY_ALWAYS -e LANG=en_US.UTF-8 -e LC_ALL=en_US.UTF-8" replicas=1 run-command="/bin/bash /usr/local/bin/kolla_start"
Network: control-port=3122
Storage Mapping: