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相关推荐

  1. 创建PV报错pvcreate Read-only locking type set

    创建PV报错pvcreate Read-only locking type set 创建PV报错  pvcreate /dev/emcpowerd pvcreate Read-only locking ...

  2. OpenStack虚拟机部署K8S集群,使用Cinder提供PV报错:mount: special device does not exist

    1.出错信息 kubelet挂载pv卷失败,从出错信息来看失败原因是设备不存在 # kubectl describe pods testpvcpod-cinder Mounting command: ...

  3. 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 ...

  4. vmware ESXI 创建虚拟机报错verification failed (0x1a) security violation

    1.出现verification failed (0x1a) security violation报错 过段时间,页面出现报错Failed to load image :Security policy ...

  5. 微信公众号创建菜单报错40016

    微信公众号创建菜单报错40016 今天帮连锁处理公众号链接的时候,我通过接口将连锁的公众号菜单链接返回回来,然后处理一个跳转链接,本来想着是手到擒来的事,没想到突然给我抛出一个错误,打了我一个措手不及 ...

  6. anaconda创建虚拟环境报错(2种情况)

    anaconda创建虚拟环境报错: UnsatisfiableError: Note that strict channel priority may have removed packages re ...

  7. SAP RETAIL WA03 基于分配表创建PO报错 - No work list could be selected –

    SAP RETAIL WA03 基于分配表创建PO报错 - No work list could be selected – 1, 执行事务代码WA03,输入分配表4,回车进入如下界面, 选中item ...

  8. Pyinstaller 打包exe 报错 “failed to execute script XXX“的一种解决方案

    Pyinstaller 打包exe 报错 "failed to execute script XXX"的一种解决方案 参考文章: (1)Pyinstaller 打包exe 报错 & ...

  9. tomcat运行报错Failed to start component [StandardEngine[Catalina].StandardHost[localhost].

    一.问题 tomcat运行报错Failed to start component [StandardEngine[Catalina].StandardHost[localhost]. 多半情况是找不到 ...

  10. es 创建索引报错_ES添加映射报错analyzer [ik_max_word] not found for field [title]

    给索引创建映射报错 { "error":{ "root_cause":[ { "type":"mapper_parsing_exc ...

最新文章

  1. 百度重置页面自动跳转脚本
  2. Windows或者linux深度学习环境搭建
  3. 全球首例猪心移植人体手术:57岁晚期心脏病患者术后状况良好
  4. css中颜色的表示方法
  5. pyqt5 listview 不默认选中_pyqt5 商店小票打印的实现模板
  6. 当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决
  7. 华人微型计算机之父,计算机之父是谁?
  8. Python文件操作与函数目录
  9. cocos2dx飞机大战开发记录(3)
  10. 解决git 命令出现end问题
  11. 分布式存储之GlusterFS软件安装及使用
  12. springcloud 01 euraka整理
  13. linux crontab零点,Linux中20个crontab例子
  14. Google Cloud Platform
  15. Android——扩大ImageButton的点击区域
  16. 富受贿数额为45437元
  17. 宝塔服务器源代码修改记录,宝塔BT面板修改相关记录,所有插件免费用
  18. 评选最牛群主v1.0(哈工大Mooc)
  19. Xshell远程登录中方向键及删除键出现乱码问题
  20. python 外星人游戏下载大全_【Python】Python制作外星人入侵小游戏

热门文章

  1. android 电子签名证书,android 电子签名实现
  2. 元宇宙:不透明面纱下的“康德主义”
  3. 川农《劳动与社会保障法(本科)》21年12月作业考核
  4. PHP香港微信跨境支付,微信支付-跨境支付开发者文档
  5. 异常解决——Tomcat启动异常:Cannot assign requested address
  6. DOTA数据集+YOLOV5
  7. 聊一聊微服务之间的通讯方式
  8. 实现手机蓝牙解锁电脑_手机版和电脑版微信多开的实现方法
  9. 居于canvas的原生js抽奖小程序
  10. 如何用计算机控制电灯,怎么用电脑控制LED灯