第30讲:Ceph集群RBD块存储通过CSI客户端与K8S StorageClass集成

文章目录

    • 1.Ceph集群使用CSI客户端与K8S StorageClass集成简介
    • 2.RBD块存储与StorageClass集成架构图
    • 3.Ceph集群为StorageClass提供块存储设备
      • 3.1.在Ceph集群中创建StorageClass使用的资源池
      • 3.2.创建K8S集群访问RBD块存储设备的认证用户
      • 3.3.获取Ceph集群的集群信息
    • 4.在K8S集群中部署CSI客户端工具
      • 4.1.创建CSI客户端使用的Configmap资源
        • 4.1.1.CSI连接Ceph集群的Configmap资源
        • 4.1.2.KMS密钥管理服务的Configmap资源
        • 4.1.3.Ceph配置的Configmap资源
      • 4.2.创建CSI客户端访问K8S集群的RBAC授权
      • 4.3.在K8S集群中部署CSI客户端
    • 5.基于Ceph集群RBD块设备创建Storageclass资源并进行使用
      • 5.1.将K8S访问RBD块存储的用户信息存储在Secret资源中
      • 5.2.创建一个StorageClass资源控制器
      • 5.3.创建PVC存储卷从StorageClass中自动分配PV
      • 5.4.创建Pod资源挂载PVC存储卷
    • 6.在Statefulset控制器中应用StorageClass为每个Pod分配独立的存储
      • 6.1.编写Statefulset控制器资源编排文件
      • 6.2.创建资源控制器并观察PV和PVC的状态
      • 6.3.查看PV对应的RBD块存储
    • 7.报错合集
      • 7.1.PVC使用StorageClass分配PV时报错缺少有效参数
      • 7.2.PVC创建一支处于等待中
      • 7.3.PVC通过StorageClass无法申请PV报错认证失败
      • 7.4.Pod无法挂载PVC报错块存储含有一些特殊featrues

1.Ceph集群使用CSI客户端与K8S StorageClass集成简介

StorageClass与Ceph RBD集成的官方文档:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/#rbd

Ceph对于StorageClass的官方文档:https://docs.ceph.com/en/pacific/rbd/rbd-kubernetes/

2.RBD块存储与StorageClass集成架构图

StorageClass资源可以通过客户端根据用户的需求自动创建出PV以及PVC资源。

StorageClass使用Ceph作为底层存储,为用户自动创建出PV以及PVC资源,使用的客户端工具是csi,首先需要在K8S集群中部署csi客户端工具,由csi客户端中驱动去连接Ceph集群。

image-20220412150549532

3.Ceph集群为StorageClass提供块存储设备

3.1.在Ceph集群中创建StorageClass使用的资源池

RBD块设备对接StorageClass,无需创建块设备,StorageClass连接到资源池后,会自动在里面创建块设备,分配的每一块PV都会在资源池中创建一个块存储设备。

[root@ceph-node-1 ~]# ceph osd pool create kubernetes_data 16 16
pool 'kubernetes_data' created

3.2.创建K8S集群访问RBD块存储设备的认证用户

[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==

命令解释可以参考之前的文章。

3.3.获取Ceph集群的集群信息

[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

4.在K8S集群中部署CSI客户端工具

StorageClass通过CSI客户端与Ceph集群建立连接。

创建出StorageClass客户端所在的Namespace。

[root@k8s-master rbd-csi]# kubectl create ns storage-class
namespace/storage-class created

4.1.创建CSI客户端使用的Configmap资源

4.1.1.CSI连接Ceph集群的Configmap资源

首先来创建第一个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
4.1.2.KMS密钥管理服务的Configmap资源

新版本的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
4.1.3.Ceph配置的Configmap资源

新版的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 = cephxauth_service_required = cephxauth_client_required = cephx# keyring is a required key and its value should be emptykeyring: |
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

4.2.创建CSI客户端访问K8S集群的RBAC授权

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

4.3.在K8S集群中部署CSI客户端

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客户端,镜像都在国外,拉取会超时。

image-20220412225921181

我在DockerHub中放了一套CSI的Docker镜像,只需要将资源编排文件中的镜像地址前缀修改即可,其余都不需要动,替换命令如下。

:%s#k8s.gcr.io/sig-storage#jiangxlrepo#g                                                                       :%s#quay.io/cephcsi#jiangxlrepo#g  

替换完如下所示。

image-20220420110220897

3)将客户端资源编排文件中的oidc-token卷注释掉

在客户端的两个资源编排文件中都有名称为oidc-token的存储卷,具体这个卷中是什么内容,官方也没有明确表示,因此不注释的话,在部署资源控制器的时候就会报错找不到这个卷,有没有这个卷对后面的使用没有任何影响。

image-20220420110251509

不注释掉此卷的话将来会报这个错误。

  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状态,去除污点配置即可。

image-20220413140216120

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          32mNAME                                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   32mNAME                           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/csi-rbdplugin   2         2         2       2            2           <none>          10mNAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/csi-rbdplugin-provisioner   3/3     3            2           32mNAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/csi-rbdplugin-provisioner-68f8797c8c   3         3         2       32m

5.基于Ceph集群RBD块设备创建Storageclass资源并进行使用

CSI客户端驱动已经在集群中部署完成了,下面可以创建一个StorageClass资源通过CSI驱动连接Ceph集群的块存储设备。

创建完StorageClass后,可以创建一个PVC存储卷,观察PV是否会自动创建,最后在Pod中使用PVC。

使用CSI之前,先在每一个K8S节点中安装Ceph的相关命令。

yum -y install ceph-common

5.1.将K8S访问RBD块存储的用户信息存储在Secret资源中

创建一个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: kubernetesuserKey: AQBlRVRibbqzJRAAD3lacYaxRloTVTio6e+10A==

2)创建资源

[root@k8s-master rbd-csi]# kubectl apply -f csi-rbd-secret.yaml -n storage-class 
secret/csi-rbd-secret created

5.2.创建一个StorageClass资源控制器

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集群的idpool: 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节点挂载块存储也需要使用认证信息,也需要指定secretcsi.storage.k8s.io/node-stage-secret-namespace: storage-class		#secret资源所在的命名空间imageFormat: "2"													#指定rbd块设备features某个特性的ID,默认为1imageFeatures: "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

5.3.创建PVC存储卷从StorageClass中自动分配PV

1)编写PVC的资源编排文件

[root@k8s-master storageclass]# vim rbd-sc-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: rbd-sc-pvc
spec:accessModes:- ReadWriteOnce							#必须使用这个访问模式,否则会报错volumeMode: Filesystemresources:requests:storage: 1GistorageClassName: 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 objectsorder 22 (4 MiB objects)snapshot_count: 0id: d4ca14b70f09block_name_prefix: rbd_data.d4ca14b70f09format: 2features: layering		op_features: flags: create_timestamp: Wed Apr 13 16:51:21 2022access_timestamp: Wed Apr 13 16:51:21 2022modify_timestamp: Wed Apr 13 16:51:21 2022

5.4.创建Pod资源挂载PVC存储卷

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.15name: nginxports:- name: webcontainerPort: 80protocol: TCPvolumeMounts:- name: datamountPath: /var/www/htmlvolumes:- name: datapersistentVolumeClaim: 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/htmlroot@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

6.在Statefulset控制器中应用StorageClass为每个Pod分配独立的存储

现在StorageClass已经对接好了Ceph集群的RBD块存储,下面在Statefulset控制器使用StorageClass为每个Pod分配独立的存储源。

每个Pod都会通过StorageClass创建出一个PVC,每个PVC都会对应一个PV,每个PV都会在资源池中创建一个块存储设备。

6.1.编写Statefulset控制器资源编排文件

资源编排文件的内容无任何差别,注意要设置一个访问模式。

[root@k8s-master storageclass]# vim ceph-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginx
spec:selector:matchLabels:app: nginxserviceName: "nginx"replicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.15volumeMounts:- name: web-datamountPath: /var/www/htmlvolumeClaimTemplates:- metadata:name: web-dataspec:accessModes: [ "ReadWriteOnce" ]					#访问模式设置成单主机可读可写storageClassName: "rbd-storageclass"resources:requests:storage: 1Gi

6.2.创建资源控制器并观察PV和PVC的状态

1.创建statefulset控制器
[root@k8s-master storageclass]# kubectl apply -f ceph-statefulset.yaml
statefulset.apps/nginx created2.查看创建的资源
nginx-0           1/1     Running   0          8m39s
nginx-1           1/1     Running   0          8m23s
nginx-2           1/1     Running   0          8m3.查看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存储数据

6.3.查看PV对应的RBD块存储

每一个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

7.报错合集

7.1.PVC使用StorageClass分配PV时报错缺少有效参数

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 imageFeaturesNormal   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的官方文档中也有说明。

image-20220413163149699

imageFeatures这个参数是来指定块存储的一些特性的,块设备的一些特性在很多的场景下是不支持的,因此需要在StorageClass中来指定自动创建的块存储的一些特性,避免不支持的特性产生其他的影响。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: rbd-storageclass
provisioner: rbd.csi.ceph.com
parameters:clusterID: a5ec192a-8d13-4624-b253-5b350a616041pool: kubernetes_datacsi.storage.k8s.io/provisioner-secret-name: csi-rbd-secretcsi.storage.k8s.io/provisioner-secret-namespace: storage-classcsi.storage.k8s.io/node-stage-secret-name: csi-rbd-secretcsi.storage.k8s.io/node-stage-secret-namespace: storage-classimageFormat: "2"imageFeatures: "layering"
reclaimPolicy: Delete
mountOptions:- discard

7.2.PVC创建一支处于等待中

报错内容如下:

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 administratorNormal   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。

7.3.PVC通过StorageClass无法申请PV报错认证失败

Events:Type    Reason                  Age   From                     Message----    ------                  ----  ----                     -------Normal  ExternalProvisioning  10s  (x3 over 20s)  persistentvolume-controllerwaiting for a volume to be created,either by external provisioner "rbd.csi.ceph.com" or manually created by system administratorNormal  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才能认证成功,新版已经没有该问题了。

7.4.Pod无法挂载PVC报错块存储含有一些特殊featrues

Events:Type    Reason                  Age   From                     Message----    ------                  ----  ----                     -------Normal Scheduled				 80s   default- scheduler       Successfully assigned default/csi- rbd-demo-pod to node-3Normal 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这条命令将不支持的特性删除即可解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/33084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言—结构体

1.结构体类型的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1结构的简单声明 struct xxx {member——list&#xff1b; }xxxxx&#xff1b; 例如&#xff1a;描述一本书 struct BOOK {char Book_Name[20];char autho…

面向卫星遥感的红外微小舰船目标检测方法:MTU-Net

论文简介 空间红外微小舰船检测旨在从地球轨道卫星所拍摄的图像中识别并分离出微小舰船。由于图像覆盖面积极其广大&#xff08;如数千平方公里&#xff09;&#xff0c;这些图像中的候选目标相比空中或地面成像设备观测到的目标&#xff0c;尺寸更小、亮度更低且变化更多。现有…

mayavi pyqt 实例

目录 安装&#xff1a; 示例代码&#xff1a; 生成3d检测框&#xff1a; 显示立方体 两个窗口 安装&#xff1a; pip install vtk pip install mayavi pip install PyQt5 pip install pyqt5 mayavi traits traitsui 示例代码&#xff1a; import sys from PyQt5.QtWidg…

如何在Java中实现缓存机制?

如何在Java中实现缓存机制&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Java应用程序中如何实现高效的缓存机制。缓存是提高…

温湿度采集及OLED显示

目录 软件I2C和硬件I2C每隔2秒钟采集一次温湿度数据&#xff0c;显示到OLED上&#xff0c;同时通过串口发送到上位机的“串口助手”软件 软件I2C和硬件I2C "I2C"代表Inter-Integrated Circuit&#xff0c;是一种用于在数字电路之间进行通信的串行通信协议。软件I2C和…

使用Testcontainers进行Java集成测试

在现代软件开发中&#xff0c;集成测试是确保应用程序与其依赖项&#xff08;如数据库、消息队列等&#xff09;正确交互的关键步骤。Testcontainers是一个支持JUnit测试的Java库&#xff0c;它提供了一个简单而强大的方式来创建和管理测试所需的任何Docker容器。本文将详细介绍…

【PythonWeb开发】Flask请求中传递参数到视图函数的方法总结。

在Flask中&#xff0c;传入参数主要有两种常见的方式&#xff0c;即通过GET请求和POST请求。 一、GET请求传递参数 &#xff08;1&#xff09;URL路径中获取 这种类型的参数通常称为路径参数或路由参数&#xff0c;它们是URL路径的一部分&#xff0c;通过尖括号<parameter…

CV每日论文--2024.6.21

1、An Image is Worth More Than 16x16 Patches: Exploring Transformers on Individual Pixels 中文标题&#xff1a;一张图像的价值超过 16x16 的补丁&#xff1a;在单个像素上探索 Transformers 简介&#xff1a;这项工作并非介绍一种新的方法&#xff0c;而是呈现了一项有…

@ControllerAdvice:你可以没用过,但是不能不了解

1.概述 最近在梳理Spring MVC相关扩展点时发现了ControllerAdvice这个注解&#xff0c;用于定义全局的异常处理、数据绑定、数据预处理等功能。通过使用 ControllerAdvice&#xff0c;可以将一些与控制器相关的通用逻辑提取到单独的类中进行集中管理&#xff0c;从而减少代码重…

WinForm 2048

WinForm 2048 是一个基于 Windows 窗体应用程序&#xff08;WinForms&#xff09;实现的经典益智游戏——2048。这个游戏通过简单的滑动或点击操作&#xff0c;将相同数字的方块合并&#xff0c;以生成更大的数字方块&#xff0c;最终目标是创造出一个数字为 2048 的方块。 游…

电商爬虫API的定制开发:满足个性化需求的解决方案

一、引言 随着电子商务的蓬勃发展&#xff0c;电商数据成为了企业决策的重要依据。然而&#xff0c;电商数据的获取并非易事&#xff0c;特别是对于拥有个性化需求的企业来说&#xff0c;更是面临诸多挑战。为了满足这些个性化需求&#xff0c;电商爬虫API的定制开发成为了解决…

【杂记-浅谈IPv6地址】

IPv6地址 一、IPv6地址概述二、IPv6地址结构三、IPv6地址分类四、IPv6地址配置五、IPv6的应用场景 一、IPv6地址概述 IPv6&#xff0c;Internet Protocol version 6&#xff0c;是互联网协议的第六版&#xff0c;旨在克服IPv4地址耗尽的挑战&#xff0c;并为互联网的未来发展提…

Apache Tomcat 10.1.25 新版本发布 java 应用服务器

Tomcat 是一个小型的轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#xff0c;当在一台机器上配置好 Apache 服务器&#xff0c;可利用它响应对 H…

uniapp 使用uview 插件

看创建项目版本vue2 、 vue3 Button 按钮 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 1. npm install uview-ui2.0.36 2. // main.js&#xff0c;注意要在use方法之后执行 import uView from uview-ui Vue.use(uView) // 如此配置即可 uni.$u.c…

服务治理入门

服务治理的生命周期 在微服务架构中&#xff0c;服务治理是确保服务正常运行和高效协作的关键。服务治理的生命周期包括以下五个阶段&#xff1a;服务注册、服务发现、服务续约/心跳、服务被动剔除和服务主动剔除。 服务注册 服务提供者在启动时&#xff0c;需要将其服务信…

Prometheus的infratest、UAT、PRE、PRD分别代表什么

Prometheus的infratest、UAT、PRE、PRD分别代表什么 在Prometheus监控系统中,infratest、UAT、PRE和PRD通常指的是不同阶段的测试环境,分别对应基础设施测试(Infrastructure Test)、用户验收测试(User Acceptance Test)、预生产环境(Pre-production)和生产环境(Produ…

构建RISC-V工具链:基本步骤

在这一节内容中&#xff0c;我们将介绍如何构建一个64位的RISC-V工具链。在这个过程中&#xff0c;我们将编译默认的RISC-V工具链&#xff0c;而不修改指令集。 1. 安装必要的软件包 首先&#xff0c;需要安装一些必要的软件包。在终端中运行以下命令&#xff1a; sudo apt-g…

vue3-cropperjs图片裁剪工具-用户上传图片截取-(含预览视频)

效果图 上传图片弹窗预览 对于这个上传图片样式可以参考 官方原代码 官网传送入口 Upload 上传 | Element Plus (element-plus.org) <template><el-uploadclass"upload-demo"dragaction"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6…

免费分享一套SpringBoot+Vue电影院售票管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue电影院售票管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue电影院售票管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue电影院售票管理系统 Java毕业设计…

DriverManager.getConnection用法总结

DriverManager.getConnection用法总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;DriverManager.getConnection是一个用于建立与…