赞
踩
StorageClass与Ceph RBD集成的官方文档:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/#rbd
Ceph对于StorageClass的官方文档:https://docs.ceph.com/en/pacific/rbd/rbd-kubernetes/
StorageClass资源可以通过客户端根据用户的需求自动创建出PV以及PVC资源。
StorageClass使用Ceph作为底层存储,为用户自动创建出PV以及PVC资源,使用的客户端工具是csi,首先需要在K8S集群中部署csi客户端工具,由csi客户端中驱动去连接Ceph集群。
RBD块设备对接StorageClass,无需创建块设备,StorageClass连接到资源池后,会自动在里面创建块设备,分配的每一块PV都会在资源池中创建一个块存储设备。
[root@ceph-node-1 ~]# ceph osd pool create kubernetes_data 16 16
pool 'kubernetes_data' created
[root@ceph-node-1 ~]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes_data'
[client.kubernetes]
key = AQBlRVRibbqzJRAAD3lacYaxRloTVTio6e+10A==
命令解释可以参考之前的文章。
[root@ceph-node-1 ~]# ceph mon dump
epoch 1
fsid a5ec192a-8d13-4624-b253-5b350a616041 #集群的ID,稍后会用到
last_changed 2022-04-02 22:09:57.238072
created 2022-04-02 22:09:57.238072
min_mon_release 14 (nautilus)
0: [v2:192.168.20.20:3300/0,v1:192.168.20.20:6789/0] mon.ceph-node-1
1: [v2:192.168.20.21:3300/0,v1:192.168.20.21:6789/0] mon.ceph-node-2
2: [v2:192.168.20.22:3300/0,v1:192.168.20.22:6789/0] mon.ceph-node-3
dumped monmap epoch 1
StorageClass通过CSI客户端与Ceph集群建立连接。
创建出StorageClass客户端所在的Namespace。
[root@k8s-master rbd-csi]# kubectl create ns storage-class
namespace/storage-class created
首先来创建第一个Configmap资源,CSI客户端通过这个配置文件去连接Ceph集群,配置文件中包含集群的ID、集群Monitor组件的地址等信息。
1)编写资源编排文件
注意:不要在configmap资源编排文件中写注释。
[root@k8s-master rbd-csi]# vim csi-configmap.yaml apiVersion: v1 kind: ConfigMap data: config.json: |- [ { "clusterID": "a5ec192a-8d13-4624-b253-5b350a616041", #ceph集群的ID "monitors": [ #ceph集群monitor组件的地址 "192.168.20.20:6789", "192.168.20.21:6789", "192.168.20.22:6789" ] } ] metadata: name: ceph-csi-config
2)创建Confimap资源
[root@k8s-master rbd-csi]# kubectl apply -f csi-configmap.yaml -n storage-class
configmap/ceph-csi-config created
[root@k8s-master rbd-csi]# kubectl get cm -n storage-class
NAME DATA AGE
ceph-csi-config 1 45s
新版本的CSI客户端还需要一个额外的Configmap资源,来定义KMS提供者的信息。
1)编写资源编排文件
[root@k8s-master rbd-csi]# vim csi-kms-config-map.yaml apiVersion: v1 kind: ConfigMap data: config.json: |- { "vault-test": { "encryptionKMSType": "vault", "vaultAddress": "http://vault.default.svc.cluster.local:8200", "vaultAuthPath": "/v1/auth/kubernetes/login", "vaultRole": "csi-kubernetes", "vaultPassphraseRoot": "/v1/secret", "vaultPassphrasePath": "ceph-csi/", "vaultCAVerify": "false" } } metadata: name: ceph-csi-encryption-kms-config
2)创建Confimap资源
[root@k8s-master rbd-csi]# kubectl apply -f csi-kms-config-map.yaml -n storage-class
configmap/ceph-csi-encryption-kms-config created
[root@k8s-master rbd-csi]# kubectl get cm -n storage-class
NAME DATA AGE
ceph-csi-config 1 78m
ceph-csi-encryption-kms-config 1 30m
新版的CSI客户端还需要再定义一个Configmap资源,来保存Ceph的配置。
1)编写资源编排文件
[root@k8s-master rbd-csi]# vim ceph-config-map.yaml
apiVersion: v1
kind: ConfigMap
data:
ceph.conf: |
[global]
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
# keyring is a required key and its value should be empty
keyring: |
metadata:
name: ceph-config
2)创建Confimap资源
[root@k8s-master rbd-csi]# kubectl apply -f ceph-config-map.yaml -n storage-class
configmap/ceph-config created
[root@k8s-master rbd-csi]# kubectl get cm -n storage-class
NAME DATA AGE
ceph-config 2 10m
ceph-csi-config 1 78m
ceph-csi-encryption-kms-config 1 30m
CSI会在K8S集群中部署两个组件,分别是csi-provisioner和csi-nodeplugin,两个组件都需要配置RBAC授权。
1)下载CSI客户端的RBAC资源编排文件
[root@k8s-master rbd-csi]# wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
[root@k8s-master rbd-csi]# wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml
2)在K8S集群中创建RBAC资源
创建之前先将资源编排文件中写死的Namespace替换成你的Namespace。
:%s/namespace: default/namespace: storage-class/g
[root@k8s-master rbd-csi]# kubectl apply -f csi-provisioner-rbac.yaml -n storage-class
serviceaccount/rbd-csi-provisioner created
clusterrole.rbac.authorization.k8s.io/rbd-external-provisioner-runner configured
clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role configured
role.rbac.authorization.k8s.io/rbd-external-provisioner-cfg created
rolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role-cfg created
[root@k8s-master rbd-csi]# kubectl apply -f csi-nodeplugin-rbac.yaml -n storage-class
serviceaccount/rbd-csi-nodeplugin created
clusterrole.rbac.authorization.k8s.io/rbd-csi-nodeplugin configured
clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-nodeplugin configured
1)下载CSI客户端部署的资源编排文件
[root@k8s-master rbd-csi]# wget csi-rbdplugin-provisioner.yaml -n storage-class
[root@k8s-master rbd-csi]# wget csi-rbdplugin.yaml -n storage-class
2)调整资源编排文件中的镜像地址
将资源编排文件中的镜像地址全部替换成我给出的DockerHub地址,否则无法成功部署CSI客户端,镜像都在国外,拉取会超时。
我在DockerHub中放了一套CSI的Docker镜像,只需要将资源编排文件中的镜像地址前缀修改即可,其余都不需要动,替换命令如下。
:%s#k8s.gcr.io/sig-storage#jiangxlrepo#g :%s#quay.io/cephcsi#jiangxlrepo#g
替换完如下所示。
3)将客户端资源编排文件中的oidc-token卷注释掉
在客户端的两个资源编排文件中都有名称为oidc-token的存储卷,具体这个卷中是什么内容,官方也没有明确表示,因此不注释的话,在部署资源控制器的时候就会报错找不到这个卷,有没有这个卷对后面的使用没有任何影响。
不注释掉此卷的话将来会报这个错误。
Warning FailedMount 38s (x8 over 102s) kubelet MountVolume.SetUp failed for volume "oidc-token" : failed to fetch token: the API server does not have TokenRequest endpoints enabled
3)去除Master节点配置的污点
csi-rbdplugin组件的是以DaemonSet控制器部署的,会在K8S集群中每一个节点中都部署一个Pod资源,由于我们的K8S集群是以Kubeadmin方式搭建的,因此需要将Master节点的污点去除,否则运行在Master节点的Pod将会一直处于pending状态。
[root@k8s-master rbd-csi]# kubectl taint node k8s-master node-role.kubernetes.io/master:NoSchedule-
node/k8s-master untainted
存在污点会报下面的错,并且Pod一直处于Pending状态,去除污点配置即可。
4)在K8S集群中部署CSI客户端
[root@k8s-master rbd-csi]# kubectl apply -f csi-rbdplugin-provisioner.yaml -n storage-class
service/csi-rbdplugin-provisioner created
deployment.apps/csi-rbdplugin-provisioner created
[root@k8s-master rbd-csi]# kubectl apply -f csi-rbdplugin.yaml -n storage-class
daemonset.apps/csi-rbdplugin created
service/csi-metrics-rbdplugin created
5)查看部署的资源
[root@k8s-master rbd-csi]# kubectl get all -n storage-class NAME READY STATUS RESTARTS AGE pod/csi-rbdplugin-brkn7 3/3 Running 0 10m pod/csi-rbdplugin-gqvwl 3/3 Running 0 10m pod/csi-rbdplugin-provisioner-68f8797c8c-44fwd 7/7 Pending 0 32m pod/csi-rbdplugin-provisioner-68f8797c8c-9qfj7 7/7 Running 0 32m pod/csi-rbdplugin-provisioner-68f8797c8c-vdx9z 7/7 Running 0 32m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/csi-metrics-rbdplugin ClusterIP 10.107.244.13 <none> 8080/TCP 10m service/csi-rbdplugin-provisioner ClusterIP 10.109.233.129 <none> 8080/TCP 32m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/csi-rbdplugin 2 2 2 2 2 <none> 10m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/csi-rbdplugin-provisioner 3/3 3 2 32m NAME DESIRED CURRENT READY AGE replicaset.apps/csi-rbdplugin-provisioner-68f8797c8c 3 3 2 32m
CSI客户端驱动已经在集群中部署完成了,下面可以创建一个StorageClass资源通过CSI驱动连接Ceph集群的块存储设备。
创建完StorageClass后,可以创建一个PVC存储卷,观察PV是否会自动创建,最后在Pod中使用PVC。
使用CSI之前,先在每一个K8S节点中安装Ceph的相关命令。
yum -y install ceph-common
创建一个Secret资源,用于存储CSI客户端连接RBD的认证用户信息,由于使用的stringData保存用户的Key,因此用户的key在这里无需使用Base64加密。
在旧版本的CSI中,CSI客户端连接Ceph集群必须使用admin用户,CSI与Ceph认证存在Bug,如果使用的是新版本的CSI,则可以使用在Ceph中创建的普通用户进行连接,没有任何问题。
1)编写资源编排文件
[root@k8s-master rbd-csi]# vim csi-rbd-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
stringData:
userID: kubernetes
userKey: AQBlRVRibbqzJRAAD3lacYaxRloTVTio6e+10A==
2)创建资源
[root@k8s-master rbd-csi]# kubectl apply -f csi-rbd-secret.yaml -n storage-class
secret/csi-rbd-secret created
1)编写资源编排文件
[root@k8s-master storageclass]# vim rbd-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: rbd-storageclass provisioner: rbd.csi.ceph.com #csi的驱动名称 parameters: clusterID: a5ec192a-8d13-4624-b253-5b350a616041 #ceph集群的id pool: kubernetes_data #块存储设备所在的资源池 csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret #csi客户端连接ceph需要用到认证用户的凭据,之前将用户凭据写在了secret资源中,这里填写secret的名称即可 csi.storage.k8s.io/provisioner-secret-namespace: storage-class #secret资源所在的命名空间 csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret #node节点挂载块存储也需要使用认证信息,也需要指定secret csi.storage.k8s.io/node-stage-secret-namespace: storage-class #secret资源所在的命名空间 imageFormat: "2" #指定rbd块设备features某个特性的ID,默认为1 imageFeatures: "layering" #指定块设备的features类型 reclaimPolicy: Delete #回收策略设置的是Delete,当PVC删除时,在资源池中的块设备文件也会被删除 mountOptions: - discard
2)创建资源并查看资源的状态
[root@k8s-master storageclass]# kubectl apply -f rbd-storageclass.yaml
storageclass.storage.k8s.io/rbd-storageclass created
[root@k8s-master storageclass]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rbd-storageclass rbd.csi.ceph.com Delete Immediate false 4m30s
1)编写PVC的资源编排文件
[root@k8s-master storageclass]# vim rbd-sc-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-sc-pvc
spec:
accessModes:
- ReadWriteOnce #必须使用这个访问模式,否则会报错
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
storageClassName: rbd-storageclass #使用刚刚创建的storageclass为pv分配存储空间
2)创建资源并查看资源的状态
[root@k8s-master storageclass]# kubectl apply -f rbd-sc-pvc.yaml
persistentvolumeclaim/rbd-sc-pvc created
[root@k8s-master storageclass]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
rbd-sc-pvc Bound pvc-9f4e2523-c812-4f0a-a801-4000d318fd10 1Gi RWX rbd-storageclass 31s
[root@k8s-master storageclass]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-9f4e2523-c812-4f0a-a801-4000d318fd10 1Gi RWX Delete Bound default/rbd-sc-pvc rbd-storageclass 43s
可以看到PVC已经通过StorageClass为其自动创建了一个PV,并进行了绑定。
3)查看StorageClass是否在资源池中创建了块存储
通过StorageClass自动创建的每一个PV,在资源池中都会生成一个块存储设备。
[root@ceph-node-1 ~]# rbd -p kubernetes_data ls
csi-vol-e3e11cae-bb06-11ec-ac57-225651f4b5c9
rbd_pv_data.img
rbd_volume_data.img
4)查看块设备的信息
由于在StorageClass中已经配置了块设备的features类型,因此自动创建出来的块设备就不会含有不支持的features了。
[root@ceph-node-1 ~]# rbd info kubernetes_data/csi-vol-e3e11cae-bb06-11ec-ac57-225651f4b5c9
rbd image 'csi-vol-e3e11cae-bb06-11ec-ac57-225651f4b5c9':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: d4ca14b70f09
block_name_prefix: rbd_data.d4ca14b70f09
format: 2
features: layering
op_features:
flags:
create_timestamp: Wed Apr 13 16:51:21 2022
access_timestamp: Wed Apr 13 16:51:21 2022
modify_timestamp: Wed Apr 13 16:51:21 2022
1)编写资源文件
和传统使用pvc的方式一样。
[root@k8s-master storageclass]# vim rbd-sc-pvc-pod.yaml apiVersion: v1 kind: Pod metadata: name: rbd-sc-pvc-pod spec: containers: - image: nginx:1.15 name: nginx ports: - name: web containerPort: 80 protocol: TCP volumeMounts: - name: data mountPath: /var/www/html volumes: - name: data persistentVolumeClaim: claimName: rbd-sc-pvc
2)创建资源并观察资源的状态
[root@k8s-master storageclass]# kubectl apply -f rbd-sc-pvc-pod.yaml
pod/rbd-sc-pvc-pod created
[root@k8s-master storageclass]# kubectl get pod
NAME READY STATUS RESTARTS AGE
rbd-sc-pvc-pod 1/1 Running 0 69s
3)进入Pod中使用PVC存储数据
[root@k8s-master storageclass]# kubectl exec -it rbd-sc-pvc-pod bash
root@rbd-sc-pvc-pod:/# df -hT /var/www/html
Filesystem Type Size Used Avail Use% Mounted on
/dev/rbd0 ext4 976M 2.6M 958M 1% /var/www/html
root@rbd-sc-pvc-pod:/# cd /var/www/html
root@rbd-sc-pvc-pod:/var/www/html# echo "123" > index.html
root@rbd-sc-pvc-pod:/var/www/html# ls
index.html lost+found
root@rbd-sc-pvc-pod:/var/www/html# curl 127.0.0.1
123
现在StorageClass已经对接好了Ceph集群的RBD块存储,下面在Statefulset控制器使用StorageClass为每个Pod分配独立的存储源。
每个Pod都会通过StorageClass创建出一个PVC,每个PVC都会对应一个PV,每个PV都会在资源池中创建一个块存储设备。
资源编排文件的内容无任何差别,注意要设置一个访问模式。
[root@k8s-master storageclass]# vim ceph-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15 volumeMounts: - name: web-data mountPath: /var/www/html volumeClaimTemplates: - metadata: name: web-data spec: accessModes: [ "ReadWriteOnce" ] #访问模式设置成单主机可读可写 storageClassName: "rbd-storageclass" resources: requests: storage: 1Gi
1.创建statefulset控制器 [root@k8s-master storageclass]# kubectl apply -f ceph-statefulset.yaml statefulset.apps/nginx created 2.查看创建的资源 nginx-0 1/1 Running 0 8m39s nginx-1 1/1 Running 0 8m23s nginx-2 1/1 Running 0 8m 3.查看PV和PVC [root@k8s-master storageclass]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-65cfd953-f131-4b94-9c6b-a4916b5281d3 1Gi RWO Delete Bound default/web-data-nginx-0 rbd-storageclass 12m pvc-74551433-767c-439e-8ce8-a5f93b68a1e0 1Gi RWO Delete Bound default/web-data-nginx-1 rbd-storageclass 12m pvc-f46cce3e-0875-4045-b0b8-3b16f6def18e 1Gi RWO Delete Bound default/web-data-nginx-2 rbd-storageclass 12m [root@k8s-master storageclass]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE web-data-nginx-0 Bound pvc-65cfd953-f131-4b94-9c6b-a4916b5281d3 1Gi RWO rbd-storageclass 13m web-data-nginx-1 Bound pvc-74551433-767c-439e-8ce8-a5f93b68a1e0 1Gi RWO rbd-storageclass 13m web-data-nginx-2 Bound pvc-f46cce3e-0875-4045-b0b8-3b16f6def18e 1Gi RWO rbd-storageclass 12m #每一个Pod都有独立的PVC存储数据
每一个PV都会对应一个PVC。
[root@ceph-node-1 ~]# rbd -p kubernetes_data ls
csi-vol-1a423881-bba7-11ec-ac57-225651f4b5c9
csi-vol-66004615-bbc0-11ec-ac57-225651f4b5c9
csi-vol-6fb32417-bbc0-11ec-ac57-225651f4b5c9
csi-vol-7d94aaa2-bbc0-11ec-ac57-225651f4b5c9
csi-vol-e3e11cae-bb06-11ec-ac57-225651f4b5c9
rbd_pv_data.img
rbd_storageclass_data.img
rbd_volume_data.img
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Provisioning 19s (x8 over 83s) rbd.csi.ceph.com_csi-rbdplugin-provisioner-68f8797c8c-vdx9z_da4228be-a2c9-44cd-ad7a-0c125c0322c6 External provisioner is provisioning volume for claim "default/rbd-sc-pvc"
Warning ProvisioningFailed 19s (x8 over 83s) rbd.csi.ceph.com_csi-rbdplugin-provisioner-68f8797c8c-vdx9z_da4228be-a2c9-44cd-ad7a-0c125c0322c6 failed to provision volume with StorageClass "rbd-storageclass": rpc error: code = InvalidArgument desc = missing required parameter imageFeatures
Normal ExternalProvisioning 13s (x6 over 83s) persistentvolume-controller waiting for a volume to be created, either by external provisioner "rbd.csi.ceph.com" or manually created by system administrator
从pvc的详细信息中可以看到一些报错内容,注意观察这句话: failed to provision volume with StorageClass "rbd-storageclass":rpc error: code = InvalidArgument desc = missing required parameter imageFeatures
,大概意思就是说在rbd-storageclass资源中缺少了必要的参数,这个参数就是imageFeatures。
解决方案就是在StorageClass中将这个必要参数配置上即可,K8S的官方文档中也有说明。
imageFeatures这个参数是来指定块存储的一些特性的,块设备的一些特性在很多的场景下是不支持的,因此需要在StorageClass中来指定自动创建的块存储的一些特性,避免不支持的特性产生其他的影响。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: rbd-storageclass provisioner: rbd.csi.ceph.com parameters: clusterID: a5ec192a-8d13-4624-b253-5b350a616041 pool: kubernetes_data csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret csi.storage.k8s.io/provisioner-secret-namespace: storage-class csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret csi.storage.k8s.io/node-stage-secret-namespace: storage-class imageFormat: "2" imageFeatures: "layering" reclaimPolicy: Delete mountOptions: - discard
报错内容如下:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ExternalProvisioning 6s (x6 over 67s) persistentvolume-controller waiting for a volume er "rbd.csi.ceph.com" or manually created by system administrator
Normal Provisioning 3s (x8 over 67s) rbd.csi.ceph.com_csi-rbdplugin-provisioner-68f8797c8c-42nlv_ff1dda12-9e5f-4d23-8aa0-7115c54c84d1 External provisioner eph-sc-pvc"
Warning ProvisioningFailed 3s (x8 over 67s) rbd.csi.ceph.com_csi-rbdplugin-provisioner-68f8797c8c-42nlv_ff1dda12-9e5f-4d23-8aa0-7115c54c84d1 failed to provision vass": rpc error: code = InvalidArgument desc = multi node access modes are only supported on rbd `block` type volumes
原因:PVC使用storageclass创建PV时,如果使用的是文件系统类型的PVC,那么访问模式必须设置成ReadWriteOnce,否则就会产生以上报错。
解决方法:要么将访问模式改成ReadWriteOnce,要么使用会Block块类型的PVC。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ExternalProvisioning 10s (x3 over 20s) persistentvolume-controller
waiting for a volume to be created,either by external provisioner "rbd.csi.ceph.com" or manually created by system administrator
Normal Provisioning 4s (x5 over 20s)rbd.csi.ceph.com_csi-rbdplugin-provisioner-7b4b98b96f-6gcs 5dd21d9d-2c20-4657-9725-876383c7b04b External provisioner is provisioning volume for claim "default/rbd-pvc"
Warning ProvisioningFailed3s (x5over 15s) rbd.csi.ceph.com_csi-rbdplugin-provisioner-7b4b98b96f-6gqcs _5dd21d9d-2c20-4657-9725-876383c7b04b failed to provision volume with StorageClass "csi-rbd-sc" :rpc error: code = Internal desc = failed to get IOContext: failed to get connection: connecting failed:rados: ret=1, Operation not permitted
原因:CSI早期版本的Bug,必须使用admin才能认证成功,新版已经没有该问题了。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 80s default- scheduler Successfully assigned default/csi- rbd-demo-pod to node-3
Normal SuccessfulAttachVolume 80s attachdetach-controller AttachVolume.Attach succeeded for volume "pvc-514448dd-f261-4095-a25c-c959dff7667e"
Warning FailedMount 31s (x7 over 67s) kubelet, node-3 MountVolume . MountDevice failed for volume "pvc-514448dd-f261-4095-a25c-959dff7667e" : rpc error: code = Internal desc = rbd: map failed exit status 6,rbd output: rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable kubernetes_data/csi-vol-159d233b-83e6-llea-8064- d24dd24330b3 object-map fast-diff deep- flatten".
In some cases useful info is found in syslog - try "dmesg| tail".
rbd: map failed: (6) No such device or address
这是StorageClass在Ceph资源池中默认创建的块存储包含了一些系统不支持的特性导致,执行rbd feature disable kubernetes_data/csi-vol-159d233b-83e6-llea-8064- d24dd24330b3 object-map fast-diff deep- flatten
这条命令将不支持的特性删除即可解决。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。