目录
OpenStack架构图
Cinder
VolumeDeviceNotFound
实例Hard Reboot后,出现VolumeDeviceNotFound的错误。
查看计算节点上,nova-compute的日志。
1 | nova.compute.manager [req-1c2e36df-c5ff-49aa-9893-6046cd0cbfeb b29311c34edb4f179092e81cbee10682 8e4be2cb25084defb5a9f0128afd5291 - default default] [instance: d17a8b0f-759c-4f54-b265-64fc16986710] Cannot reboot instance: Volume device not found at .: os_brick.exception.VolumeDeviceNotFound: Volume device not found at . |
解决方法
存储节点查看对应的物理设备是否被创建。
1
2
3# f870fcdb-209c-4877-8de4-1b7683b98548是volume的ID。
lsblk | grep f870fcdb--209c--4877--8de4--1b7683b98548
ls /dev/cinder-volumes/volume-f870fcdb-209c-4877-8de4-1b7683b98548在存储节点上查看iSCSI资源。
1
targetcli ls
得到下面的结果。
1
2
3
4
5
6
7
8| o- iqn.2010-10.org.openstack:volume-f870fcdb-209c-4877-8de4-1b7683b98548 ............................................. [TPGs: 1]
| | o- tpg1 .......................................................................................... [no-gen-acls, auth per-acl]
| | o- acls .......................................................................................................... [ACLs: 1]
| | | o- iqn.2020-08.org.openanolis:8a5ea81155a ................................................... [1-way auth, Mapped LUNs: 0]
| | o- luns .......................................................................................................... [LUNs: 0]
| | o- portals .................................................................................................... [Portals: 1]
| | o- 10.10.15.14:3260 ................................................................................................. [OK]从上面的结果可以看到acls是正常的,但luns中没有数据。
新建backstores
1
2
3
4targetcli \
/backstores/block create \
name=iqn.2010-10.org.openstack:volume-f870fcdb-209c-4877-8de4-1b7683b98548 \
dev=/dev/cinder-volumes/volume-f870fcdb-209c-4877-8de4-1b7683b98548新建lun
1
2
3
4targetcli \
/iscsi/iqn.2010-10.org.openstack:volume-f870fcdb-209c-4877-8de4-1b7683b98548/tpg1/luns \
create \
/backstores/block/iqn.2010-10.org.openstack:volume-f870fcdb-209c-4877-8de4-1b7683b98548- 也可以使用cinder-rtstool,更加方便。
1
cinder-rtstool create /backstores/block/iqn.2010-10.org.openstack:volume-f870fcdb-209c-4877-8de4-1b7683b98548
- 也可以使用cinder-rtstool,更加方便。
重设实例状态。
1
openstack server set --state active ce979e29-198d-498b-b2e3-c0cab6c82c98
重启实例。
1
openstack server reboot --hard ce979e29-198d-498b-b2e3-c0cab6c82c98
再次查看,已经正常。
1
2
3
4
5
6
7| o- iqn.2010-10.org.openstack:volume-f870fcdb-209c-4877-8de4-1b7683b98548 ............................................. [TPGs: 1]
| | o- tpg1 .......................................................................................... [no-gen-acls, auth per-acl]
| | o- acls .......................................................................................................... [ACLs: 1]
| | | o- iqn.2020-08.org.openanolis:8a5ea81155a ................................................... [1-way auth, Mapped LUNs: 1]
| | | o- mapped_lun0 ................. [lun0 block/iqn.2010-10.org.openstack:volume-f870fcdb-209c-4877-8de4-1b7683b98548 (rw)]
| | o- luns .......................................................................................................... [LUNs: 1]
| | | o- lun0 [block/iqn.2010-10.org.openstack:volume-f870fcdb-209c-4877-8de4-1b7683b98548 (/dev/cinder-volumes/volume-f870fcdb-209c-4877-8de4-1b7683b98548) (default_tg_pt_gp)]
其他
volume删除后,存储节点的日志里会报错。
1 | Jan 17 10:14:22 compute3 kernel: Unable to locate Target IQN: iqn.2010-10.org.openstack:volume-c6774132-65f2-47a0-a65b-9a5d06a4accb in Storage Node |
解决方法,到各个节点中执行iscsiadm命令
1 | [root@compute2 ~] iscsiadm -m session -P 3 | grep c6774132 |
Image
镜像密码修改
使用guestfish
在计算节点(运行libvirtd服务的节点)上,使用guestfish命令。
1 | # 安装依赖包 |
执行guestfish命令。
1 | guestfish --rw -a CentOS-Stream-GenericCloud-9-x86_64.qcow2 |
/etc/cloud/cloud.cfg
1 | # 打开root登录 |
/etc/ssh/sshd_config
1 | PermitRootLogin yes |
保存退出。
使用virt-customize
在计算节点(运行libvirtd服务的节点)上,安装依赖包。
1 | yum install -y libguestfs-tools |
使用virt-customize命令。
1 | sudo virt-customize -a CentOS-Stream-GenericCloud-9-x86_64.qcow2 --root-password password:123456 |
如果出现下面的错误。
1 | [ 0.0] Examining the guest ... |
执行下面的操作,修改libvirtd的权限。
1 | cat >> /etc/libvirt/qemu.conf << EOF |
使用horizon
horizon界面支持用户在创建云主机时注入密码。
修改horizon的local_settings.py文件。
1 | OPENSTACK_HYPERVISOR_FEATURES = { |
修改/etc/nova/nova.conf,kolla部署的nova修改/etc/kolla/nova-compute/nova.conf。
1 | [libvirt] |
重启horizon和nova-compute服务。
1 | systemctl restart httpd nova-compute |
查看horizon界面。
镜像上传
1 | openstack image create --disk-format qcow2 \ |
网络
DHCP
实例获取不到IP地址
- 首先排查是否是安全组的问题导致dhcp报文传递不过去,查看安全组已经打开UDP协议。
- 排查是否是由系统内部防火墙导致dhcp报文传递不出去,禁用防火墙后问题依然存在。
- 排查是否是系统内部服务导致dhcp没有发送discover报文,在系统内使用dhclient命令可以获取到IP。
- 排查dhclient没有启动的原因,发现dhclient应该由NetworkManager启动。NetworkManager之所以没有启动dhclient是因为系统内/etc/sysconfig/network-scripts/ifcfg-enp1s0的配置文件,NetworkManager会忽略/etc/sysconfig/network-scripts/下的网络设备导致会出现device not managed错误导致dhclient不启动,进而云主机拿不到IP地址。
- 解决方法,将/etc/sysconfig/network-scripts/ifcfg-enp1s0删除。
端口转发
基于浮动IP的端口转发
浮动IP端口转发使用户能够将TCP/UDP流量,从Port通过iptables的NAT功能,转发给浮动IP。
部署
在运行neutron-server的所有节点(网络节点)上,修改/etc/neutron/neutron.conf文件。
1 | [DEFAULT] |
在运行neutron-l3-agent的所有节点上,修改/etc/neutron/l3_agent.ini。
1 | [agent] |
重启neutron-server和neutron-l3-agent服务。
1 | systemctl restart neutron-server neutron-l3-agent |
验证。
1 | openstack extension list --network | grep floating-ip-port-forwarding |
操作
创建端口转发
1 | openstack floating ip port forwarding create \ |
36bcd62a-0860-4e22-bf8a-81f5052eff60和825cc4f8-9a1c-4e46-b380-501ba0f9b08d分别是Port和浮动IP的ID。
原理
TODO
horizon
1 | compressor.exceptions.OfflineGenerationError: You have offline compression enabled but key "9a5d87a23b1b5362cdee3cc104aa5c24c3a33cd113d8e4ac4dfbebd1edbd9efc" is missing from offline manifest. You may need to run "python manage.py compress". |
1 | python manage.py collectstatic |
其他
keepalived
多虚IP
使用kvm部署多台机器,使用keepalived和haproxy作为集群高可用。发现虚IP在多个节点上同时出现,怀疑keepalived配置出问题。
在多个节点上利用tcpdump抓包,vrrp包都能被抓到,但是似乎节点之间收不到vrrp包。
1 | tcpdump -i any vrrp -n |
确保SElinux处于关闭状态。
1 | cat /etc/selinux/config |
检查防火墙是否关闭。
1 | systemtcl status firewalld |
查看iptables规则。
1 | iptables -S |
防火墙一切正常,怀疑是KVM虚拟机的网络问题导致VRRP不能被传输。KVM使用nat网络进行传输时没有问题,在使用macvtap网络会出现上述问题。
查看官方文档,kvm在使用macvtap驱动时,参数trustGuestRxFilters默认否,可能会修改从虚拟机出来的流量的MAC地址,导致网络不可达。
编辑虚拟机配置文件。
1 | ... |
最后如果问题还是复现,将每台虚拟机对应的macvtap网卡设置成混杂模式。
1 | ifconfig macvtap5 promisc |