客户云环境一台虚拟机,反馈重启不成功。经了解,客户环境使用的后端为ceph,故障虚拟机挂载一块云硬盘。
收集客户的nova-compute日志,发现报错如下:
libvirtError:internal error:process exited while connecting to monitor
如上图,日志显示云硬盘无法连接到ceph-mon,排查虚拟机所在的计算节点到ceph-mon的网络连接,从该计算节点telnet 10.20.4.5-7三个ceph-mon IP的6789端口,发现都是通的;排查计算节点到全部osd节点的ceph-public网络,发现链路也是通的。
另外日志信息里,file=rbd:SATA_APP_POOL/volume-xxxxx:id=volume:key=xxxx:auth_support=cephx,像是云硬盘无法连接ceph-mon.
排查网络连接正常下,通过上面的auth_support=cephx信息,怀疑是qemu-kvm到ceph-mon的cephx认证出现问题,有可能key信息不对.
于是到虚拟机所在的计算节点,用virsh secret-list 和virsh secret-get-value检查key值信息
对比nova-compute日志里面的key信息,对比secret-get-value输出,发现key值是对的,但是对应的ceph认证用户名对不上。在nova-compute错误日志里面,cephx的认证用户名是id=volumes,而secret-list输出,3f0xxx的UUID,所使用对应的cephx认证用户名像是compute。
找另一台同样故障的虚拟机,用virsh dumpxml
如上图,xml输出,3f00xx的secret UUID,auth username=“volumes”,定位问题确实在cephx认证不通过,authname和key值无法对应,导致权限出错。
问题原因调查:
因客户环境不能远程,找了个测试环境复现问题,最后定位原因在于客户环境对接了第二套ceph集群,对接完成后,云硬盘的authname由原来的默认的compute变成了volumes,进而导致连接第一套ceph集群出现authx认证问题。验证分析如下:
1,查看cinder.conf配置文件中对接第一套ceph部分配置如下
如上图,cinder对接第一套ceph,使用pool为volumes,authx的认证用户rbd_user 为volumes。
2. 查看计算节点nova.conf配置部分与rbd有关设置
如上图,nova.conf中,使用的rbd_user为compute。
rbd_secret_uuid和cinde.conf配置文件中的对应。
rbd_secret对应的key值为ceph的client.compute用户的。
如上图,可以看出,libvirt中的secret 相应的value值对应cephx的用户为client.compute,而对应不上cephx的client.volumes
如上图,通过ceph auth get命令,我们可以看出,ceph authx的compute用户名,对应的key值,对compute pool,volumes pool都是拥有读写权限的。
3.创建虚拟机,挂载第一套ceph集群2个云硬盘
如上图,某虚拟机挂载2个云硬盘。
如上图,通过virsh dumpxml
4 .查看数据库中云硬盘的相关信息,以vdb为例
如上图,查看nova库里面的block_device_mapping表,这张表记录虚拟机挂载云硬盘信息的,可以看出,记录的vdb连接信息的connection_info字段,auth_username为volumes,用户名和cinder.conf配置文件里面的rbd_user对应。
问题原因 :
在实施对接第二套ceph后,虚拟机hard reboot或start会根据数据库中的connection_info重新生成虚机的libvirt xml, 而在实施对接第二套ceph之前就挂载的云盘,在数据库nova.block_device_mapping中connection_info中auth_username=volumes, 实施对接第二套ceph之前, nova使用的是配置的ceph auth_username=compute去连接ceph,对接第二套ceph方案实施后使用数据库中auth_username=volumes会导致ceph鉴权失败
问题解决:
修改数据库中的connection_info中的auth_username为compute。
update block_device_mapping set connection_info = replace(connection_info ,'"auth_username": "volumes"','"auth_username": "compute"')