删除OpenStack卷时遭遇API版本错误的问题咨询
你遇到的这个406错误其实是块存储服务(Cinder)的微版本不兼容导致的,和你设置的identity_api_version完全没关系——这个参数是用来配置身份服务Keystone的版本,管不到Cinder的API逻辑。
先给你理清楚核心问题:OpenStack的各个服务(比如管理实例的Nova、管理卷的Cinder)都有自己独立的微版本机制,它们的主版本都是v3,但每个服务会在主版本下迭代子版本(也就是微版本)。你的错误提示明确说了Cinder API最高只支持到3.59,但你的SDK默认启用了3.60版本,所以直接被服务端拒绝了。
下面是具体的解决办法,完全不用换单独的Cinder SDK,用现有的OpenStack统一SDK就能搞定:
在创建连接时直接指定Cinder的微版本
直接在openstack.connect()里添加block_storage_api_version参数,设置成你的环境支持的版本(比如你提到的3.13,或者错误提示里的最高兼容版本3.59):conn = openstack.connect( auth_url=auth_url, auth_type=auth_type, application_credential_id=cred_id, application_credential_secret=cred_secret, identity_api_version='3', block_storage_api_version='3.59' # 替换成你环境实际支持的版本 )如果已经创建了连接,也可以事后修改
要是你已经初始化了连接对象,还能单独给块存储客户端调整微版本:conn.block_storage.api_version = '3.59'
顺便给你解释下微版本的作用:它是OpenStack用来在不升级主版本的前提下,逐步新增或调整服务功能的机制。每个服务支持的微版本范围都可能不同,所以当SDK默认使用的微版本超过你集群支持的上限时,就会出现这类兼容性错误。
最后建议你先确认下自己集群Cinder服务支持的微版本范围,可以用OpenStack CLI命令查询:
openstack volume api show
这样能更精准地设置兼容的版本号。
备注:内容来源于stack exchange,提问作者Lou

