kubernetes对接cinder创建pv报错:Failed to provision volume with StorageClass standard
1、环境信息
这个环境用于验证kubernetes使用cinder作为provider提供pv
kubernetes本身运行在openstack集群的虚拟机中,通过router打通和openstack管理面的链接
1.1、openstack 集群虚拟机列表
$ nova list
+--------------------------------------+-----------+--------+------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+-----------+--------+------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------+
| ccec3aee-15e5-4710-8e4c-5a4db6826022 | k8s-m1 | ACTIVE | - | Running | clu_mgt=180.0.0.3; clu_net2=172.0.2.139, 192.168.32.198 |
| 9eacafc1-8ce7-4073-a8c2-73270cffae31 | k8s-m2 | ACTIVE | - | Running | clu_mgt=180.0.0.206; clu_net2=172.0.2.146, 192.168.32.186 |
| 8128acd7-fd05-4367-985d-a36023f87de8 | k8s-m3 | ACTIVE | - | Running | clu_mgt=180.0.0.8; clu_net2=172.0.2.234, 192.168.32.159
1.2、kubernetes节点列表
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-m1 Ready master 4d22h v1.17.0 172.0.2.139 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.6
k8s-m2 Ready master 4d22h v1.17.0 172.0.2.146 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.6
k8s-m3 Ready master 4d22h v1.17.0 172.0.2.234 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.6
1.3、cloud-config文件
其中:192.168.32.90为openstack internal api地址,k8s虚拟机通过float ip与该地址对接
# cat ../cloud-config
[Global]
username=admin
password=keystone
auth-url=http://192.168.32.90:5000/v3
tenant-id=d57f7ea9b3b94d9a87321807ec453ca8
domain-id=default
2、创建pv过程
创建过程同
k8s+virtual-kubelet部署带动态pv的pod到openstack-zun
3、创建pvc出现问题
3.1、pvc处于pending状态
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
cinder-pvc Pending
3.2、查看pvc详细信息,显示和这个地址不通:172.255.0.113
# kubectl describe pvc cinder-pvc
Name: cinder-pvc
Namespace: default
StorageClass: standard
Status: Pending
Volume:
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"cinder-pvc","namespace":"default"},"spec":{"accessM...volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/cinder
Finalizers: [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode: Filesystem
Mounted By: <none>
Events:Type Reason Age From Message---- ------ ---- ---- -------Warning ProvisioningFailed 8s (x2 over 16s) persistentvolume-controller Failed to provision volume with StorageClass "standard": failed to create a 1 GB volume: Post https://172.255.0.113:8776/v3/d57f7ea9b3b94d9a87321807ec453ca8/volumes: dial tcp 172.255.0.113:8776: connect: no route to host
3.3、172.255.0.113这个地址是openstack的public api地址
但是我们需要的是 internal api地址
$ openstack endpoint list | grep keystone
| 0fc44a1959dd4888a9a3125c9199dc2c | RegionOne | keystone | identity | True | internal | https://192.168.32.90:5000/v3 |
| 3e39dce895e64d2794c022eb3d6cb85e | RegionOne | keystone | identity | True | public | https://172.255.0.113:5000/v3 |
| 427000db07dd4feda52c04d121e24ca7 | RegionOne | keystone | identity | True | admin | https://192.168.166.113:35357/v3 |
4、解决问题
4.1、初步分析
pvc详细信息中,https://172.255.0.113:8776/v3/d57f7ea9b3b94d9a87321807ec453ca8/volumes
是openstack cinder的public API endpoint,该endpoint是通过调用keystone endpoint查询接口获取
keystone endpoint查询接口有个参数,可以指定获取public、internal还是admin的endpoint
推测:kubernetes默认获取的是openstack public endpoint
4.2、分析kubernetes获取openstack endpoint代码
这里就略去代码分析过程直接贴最终代码了
代码路径:
gophercloud\openstack\client.go
gophercloud\endpoint_search.go
调用链
AuthenticatedClient->Authenticate->v3auth->NewIdentityV3->ApplyDefaults
ApplyDefaults代码
func (eo *EndpointOpts) ApplyDefaults(t string) {if eo.Type == "" {eo.Type = t}if eo.Availability == "" {eo.Availability = AvailabilityPublic}
}
可以看到,gophercloud在ApplyDefaults中将默认值设置为了public
4.3、为什么默认获取public api
从应用场景上来看,k8s要对接IAAS集群,一般情况下都是通过外部对接,所以默认设置获取public api也是合理的
而我的验证环境恰恰是将k8s部署在了openstack集群上,且需要对接openstack集群,走的是internal api,属于少数应用场景
4.4、解决问题
找到问题源头了,解决就比较简单了
可以直接修改代码如下:
func (eo *EndpointOpts) ApplyDefaults(t string) {if eo.Type == "" {eo.Type = t}if eo.Availability == "" {eo.Availability = AvailabilityInternal}
}
当然,更好的解决方法是将该变量作为可配参数引出来
kubernetes对接cinder创建pv报错:Failed to provision volume with StorageClass standard相关推荐
- 创建PV报错pvcreate Read-only locking type set
创建PV报错pvcreate Read-only locking type set 创建PV报错 pvcreate /dev/emcpowerd pvcreate Read-only locking ...
- OpenStack虚拟机部署K8S集群,使用Cinder提供PV报错:mount: special device does not exist
1.出错信息 kubelet挂载pv卷失败,从出错信息来看失败原因是设备不存在 # kubectl describe pods testpvcpod-cinder Mounting command: ...
- k8s ceph csi创建pvc报错 failed to get connection: connecting failed: rados: ret=13, Permission denied
起因 在使用k8s对接ceph-csi时,按照ceph官方流程部署完毕后,在执行kubectl apply -f pvc.yaml 时,相关pod一直处于pending状态. 使用命令kubectl ...
- vmware ESXI 创建虚拟机报错verification failed (0x1a) security violation
1.出现verification failed (0x1a) security violation报错 过段时间,页面出现报错Failed to load image :Security policy ...
- 微信公众号创建菜单报错40016
微信公众号创建菜单报错40016 今天帮连锁处理公众号链接的时候,我通过接口将连锁的公众号菜单链接返回回来,然后处理一个跳转链接,本来想着是手到擒来的事,没想到突然给我抛出一个错误,打了我一个措手不及 ...
- anaconda创建虚拟环境报错(2种情况)
anaconda创建虚拟环境报错: UnsatisfiableError: Note that strict channel priority may have removed packages re ...
- SAP RETAIL WA03 基于分配表创建PO报错 - No work list could be selected –
SAP RETAIL WA03 基于分配表创建PO报错 - No work list could be selected – 1, 执行事务代码WA03,输入分配表4,回车进入如下界面, 选中item ...
- Pyinstaller 打包exe 报错 “failed to execute script XXX“的一种解决方案
Pyinstaller 打包exe 报错 "failed to execute script XXX"的一种解决方案 参考文章: (1)Pyinstaller 打包exe 报错 & ...
- tomcat运行报错Failed to start component [StandardEngine[Catalina].StandardHost[localhost].
一.问题 tomcat运行报错Failed to start component [StandardEngine[Catalina].StandardHost[localhost]. 多半情况是找不到 ...
- es 创建索引报错_ES添加映射报错analyzer [ik_max_word] not found for field [title]
给索引创建映射报错 { "error":{ "root_cause":[ { "type":"mapper_parsing_exc ...
最新文章
- 百度重置页面自动跳转脚本
- Windows或者linux深度学习环境搭建
- 全球首例猪心移植人体手术:57岁晚期心脏病患者术后状况良好
- css中颜色的表示方法
- pyqt5 listview 不默认选中_pyqt5 商店小票打印的实现模板
- 当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决
- 华人微型计算机之父,计算机之父是谁?
- Python文件操作与函数目录
- cocos2dx飞机大战开发记录(3)
- 解决git 命令出现end问题
- 分布式存储之GlusterFS软件安装及使用
- springcloud 01 euraka整理
- linux crontab零点,Linux中20个crontab例子
- Google Cloud Platform
- Android——扩大ImageButton的点击区域
- 富受贿数额为45437元
- 宝塔服务器源代码修改记录,宝塔BT面板修改相关记录,所有插件免费用
- 评选最牛群主v1.0(哈工大Mooc)
- Xshell远程登录中方向键及删除键出现乱码问题
- python 外星人游戏下载大全_【Python】Python制作外星人入侵小游戏
热门文章
- android 电子签名证书,android 电子签名实现
- 元宇宙:不透明面纱下的“康德主义”
- 川农《劳动与社会保障法(本科)》21年12月作业考核
- PHP香港微信跨境支付,微信支付-跨境支付开发者文档
- 异常解决——Tomcat启动异常:Cannot assign requested address
- DOTA数据集+YOLOV5
- 聊一聊微服务之间的通讯方式
- 实现手机蓝牙解锁电脑_手机版和电脑版微信多开的实现方法
- 居于canvas的原生js抽奖小程序
- 如何用计算机控制电灯,怎么用电脑控制LED灯