OpenStack系列(二十四) 常见故障分析
1 | 作者:李晓辉 |
实例⽆法访问
要是发现创建好的虚拟机实例没法分配浮动IP地址,那八成是网络配置没搞定。要是路由器没被设置成外部网络的网关,那肯定就没办法把浮动IP地址分配给实例了。
不过,就算路由器还没连上外部网络,你也能先创建浮动IP地址。但当你想把浮动IP地址关联到实例的时候,就会弹出个错误提示了。
1 | (overcloud) [stack@director ~]$ openstack server add floating ip finance-web1 172.25.250.N |
设置路由器网关
要是你想把路由器设置成外部网络的网关,可以用这个命令:
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 | (overcloud) [stack@director ~]$ ssh cloud-user@172.25.250.N |
那得先检查一下实例的安全组规则,是不是允许了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
用户需要在 volumes
和 images
存储池上都有读、写和执行权限,这些存储池才会被OpenStack块存储服务使用。images
存储池是专门为OpenStack镜像服务使用的。
1 | (overcloud) [stack@director ~]$ podman exec -ti ceph-mgr-controller ceph auth list |
卷的挂载和卸载工作流
挂载和卸载卷的操作都有三个API调用:
在数据库中更新卷的状态。
处理卷的连接操作。
最终确定卷的状态并释放资源。
要挂载一个卷,它必须处于可用状态。其他状态都会导致错误消息。有时候,卷可能会卡在卸载状态。管理员用户可以手动更改状态。
比如:
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 | 201 (...) Failed to run task |
检查 RabbitMQ 和配置文件
如果块存储服务出现问题,首先得确认 RabbitMQ 集群和 rabbitmq-bundle
Pacemaker 资源都是可用的。要是这两个都没问题,那可能就得怀疑 /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf
配置文件里有没有写错了。
你可以按照下面的步骤来排查:
- 检查 RabbitMQ 集群状态
先看看 RabbitMQ 集群是不是正常运行。可以用一些命令或者查看管理界面来确认。
- 检查 Pacemaker 资源状态
再看看 rabbitmq-bundle
这个 Pacemaker 资源的状态。可以用类似下面的命令:
1 | (overcloud) [stack@director ~]$ podman exec -ti rabbitmq-bundle-podman-0 rabbitmqctl status |
1 | (overcloud) [stack@director ~]$ sudo pcs resource config rabbitmq-bundle |