最近在新搭建了一个新版的kubernetes集群,在按照ceph官方文档,创建测试pod时,报rbd: map failed: (6) No such device or address的错误。

decribe pod 详细错误信息:

按照提示,在pod所在节点上执行命令dmesg|tail,发现一推unsupported features的报错

[421074.405749] rbd: image csi-vol-ecd8560b-bf38-11ea-a64d-ba01d38dd6c8: image uses unsupported features: 0x38
[421198.154065] libceph: mon2 192.168.12.83:6789 session established
[421198.154525] libceph: client18293 fsid 95e0a109-4d16-4625-8d79-62b09b42b282

应该创建的image有问题。然后去ceph mon节点上查看rdb image信息

查看image信息
rbd info  pool_name/image_name
rbd info kubernetes/csi-vol-ecd8560b-bf38-11ea-a64d-ba01d38dd6c8

一开始怀疑是内核版本问题,导致有些特性不支持。经过查询官方文档发现3.10之后除了fancy striping,其他特性都是支持的。而且通过手动map,也能映射成功。所以应该跟系统和ceph集群没有关系。

然后又在ceph-csi的文档里发现,目前ceph-csi目前只支持layering特性,所以需要在创建StorageClass时必须要添加参数imageFeatures,设置值为:layering 。但ceph的官方文档里没有说明这一点。 修正后的StorageClass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: b9127830-b0cc-4e34-aa47-9d1a2e9949a8
   pool: kubernetes
   imageFeatures: layering
   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
   csi.storage.k8s.io/provisioner-secret-namespace: default
   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
   csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
mountOptions:
   - discard

storageclass一经创建,parameters是不允许更改的,所以只能删除然后重新创建,这个操作不会影响已经创建的pvc。

重新创建storageclass后,pod就能成功挂载rbd设备了。