第33讲:K8S集群StorageClass使用Ceph CSI供应商与Cephfs文件系统集成 ...

打印 上一主题 下一主题

主题 543|帖子 543|积分 1629

1.Ceph CSI供应商简介

K8S StorageClass对接Ceph集群的Cephfs文件系统有两种方法,一种是cephfs-provisioner另一种是cephfs-csi。
Cephfs-csi是第三方的客户端程序,部署简单,只需要拉取下来镜像就可以部署乐成,而cephfs-provisioner则有许多的故障,相对于对接RBD的存储时,rbd-provisioner非常简单,rbd-csi则有许多故障。
Cephfs-csi官方文档:https://github.com/ceph/ceph-csi/blob/devel/docs/deploy-cephfs.md
2.创建Cephfs文件系统为StorageCLass提供底层存储端

2.1.创建Cephfs文件系统

Cephfs类型的CSI提供了指定使用哪一个Cephfs文件系统的参数,我们可以在Ceph集群中再创建一个Cephfs文件系统,专门为Storageclass使用。
  1. 1.创建Cephfs使用的资源池
  2. [root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_data 16 16
  3. pool 'kubernetes_cephfs_data' created
  4. [root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_metadata 16 16
  5. pool 'kubernetes_cephfs_metadata' created
  6. 2.创建cephfs文件系统
  7. [root@ceph-node-1 ~]# ceph fs new kubernetes_cephfs  kubernetes_cephfs_metadata kubernetes_cephfs_data
  8. new fs with metadata pool 24 and data pool 23
复制代码
2.2.在Cephfs文件系统中为Storageclass创建子目次

   这一步无需做,在2.3中说明。
  我们可以将这一个Cephfs文件系统仅针对K8S集群进利用用,全部的K8S恒久化数据都存在这个Cephfs文件系统中,在这个文件系统里可以针对不同的应用程序,创建出不同的子目次,然后将子目次挂载到具体的应用程序上。ll
  1. [root@ceph-node-1 ~]# mkdir /kubernetes_cephfs/k8s_data/storageclass_storage
复制代码
cephfs文件系统就相当于系统中的一块磁盘,按照目次结构创建即可。
2.3.在Cephfs文件系统中创建一个子卷

StorageClass使用Cephfs-CSI客户端将数据恒久化到Cephfs文件系统时,无法指定Cephfs文件系统中现有的子目次进行挂载,只能将数据写在文件系统的/目次中,这是Cephfs-CSI程序内部写死的,无法进行设置,除非修改源代码。
如下图所示,StorageClass分配PV时,会通过Cephfs-CSI在Cephfs文件系统中/目次中创建一个volumes的子目次,在volumes中再创建一个子目次叫做csi,在csi目次中存放的都是PV恒久化的数据,每个PV都会对应生成一个目次。

volumes目次是无法修改的,只能修改volumes目次中的子目次csi,Cephfs-CSI会在Ceph集群指定的Cephfs文件系统中创建一个子卷,这个目次就对应的就是子卷的名称。
下面我们来创建一个子卷。
命令格式:ceph fs subvolumegroup create {cephfs文件系统名称} {子卷名称}
  1. 1.创建子卷
  2. [root@ceph-node-1 ~]# ceph fs subvolumegroup create kubernetes_cephfs k8s-storageclass-volumes
  3. 2.查看文件系统下所有的子卷
  4. [root@ceph-node-1 ~]# ceph fs subvolumegroup ls kubernetes_cephfs
  5. [
  6.     {
  7.         "name": "k8s-storageclass-volumes"
  8.     }
  9. ]
  10. 3.删除子卷的命令:
  11. [root@ceph-node-1 ~]# ceph fs subvolumegroup create kubernetes_cephfs k8s-storageclass-volumes
复制代码
3.在K8S集群中部署Cephfs-CSI供应商客户端

3.1.下载Cephfs-CSI客户端的资源编排文件

  1. [root@k8s-master cephfs-csi]# git clone https://github.com/ceph/ceph-csi.git -b release-v3.4
  2. [root@k8s-master cephfs-csi]# cd ceph-csi/deploy/cephfs/kubernetes
复制代码
3.2.设置CSI连接Ceph集群的ConfigMap资源

  1. [root@k8s-master kubernetes]# vim csi-config-map.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. data:
  5.   config.json: |-
  6.     [
  7.       {
  8.        "clusterID": "a5ec192a-8d13-4624-b253-5b350a616041",
  9.        "monitors": [
  10.           "192.168.20.20:6789",
  11.           "192.168.20.21:6789",
  12.           "192.168.20.22:6789"
  13.        ],
  14.         "cephFS": {
  15.           "subvolumeGroup": "k8s-storageclass-volumes"
  16.         }
  17.       }
  18.     ]
  19. metadata:
  20.   name: ceph-csi-config
复制代码
  clusterID:集群的ID号
  monitors:Monitor组件的地址
  subvolumeGroup:Cephfs文件系统中的子卷名称,StorageClass分配的PV,产生的恒久化数据都会存储在这里。
  3.3.将Ceph的设置文件保存在Configmap中

需要将Ceph的基础设置文件写入到Configmap资源中,CSI客户端的两个容器都需要挂载。
  1. [root@k8s-master kubernetes]# vim ceph-config.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. data:
  5.   ceph.conf: |
  6.     [global]
  7.     auth_cluster_required = cephx
  8.     auth_service_required = cephx
  9.     auth_client_required = cephx
  10.   # keyring is a required key and its value should be empty
  11.   keyring: |
  12. metadata:
  13.   name: ceph-config
复制代码
3.4.调解资源编排文件的命名空间以及镜像地址

CSI的镜像在国外,拉取会超时,需要替换成DockerHub上的地址。
  1. [root@k8s-master kubernetes]# NAMESPACE=cephfs-storage
  2. [root@k8s-master kubernetes]# sed -ri "s/namespace: [^ ]+/namespace: $NAMESPACE/g" *.yaml
  3. [root@k8s-master kubernetes]# sed -ri 's/k8s.gcr.io\/sig-storage/jiangxlrepo/' *.yaml
  4. [root@k8s-master kubernetes]# sed -ri 's/quay.io\/cephcsi/jiangxlrepo/' *.yaml
复制代码
3.5.部署CSI客户端

1)在K8S集群中部署CSI客户端
  1. 1.创建CSI客户端所在的Namespace
  2. [root@k8s-master kubernetes]# kubectl create ns cephfs-storage
  3. namespace/cephfs-storage created
  4. 2.部署所有的CSI资源控制器
  5. [root@k8s-master kubernetes]# kubectl apply -f ./ -n cephfs-storage
  6. configmap/ceph-config created
  7. service/csi-cephfsplugin-provisioner created
  8. deployment.apps/csi-cephfsplugin-provisioner created
  9. daemonset.apps/csi-cephfsplugin created
  10. service/csi-metrics-cephfsplugin created
  11. configmap/ceph-csi-config created
  12. podsecuritypolicy.policy/cephfs-csi-nodeplugin-psp created
  13. role.rbac.authorization.k8s.io/cephfs-csi-nodeplugin-psp created
  14. rolebinding.rbac.authorization.k8s.io/cephfs-csi-nodeplugin-psp created
  15. serviceaccount/cephfs-csi-nodeplugin created
  16. clusterrole.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created
  17. clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created
  18. podsecuritypolicy.policy/cephfs-csi-provisioner-psp created
  19. role.rbac.authorization.k8s.io/cephfs-csi-provisioner-psp created
  20. rolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-psp created
  21. serviceaccount/cephfs-csi-provisioner created
  22. clusterrole.rbac.authorization.k8s.io/cephfs-external-provisioner-runner created
  23. clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role created
  24. role.rbac.authorization.k8s.io/cephfs-external-provisioner-cfg created
  25. rolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role-cfg created
  26. csidriver.storage.k8s.io/cephfs.csi.ceph.com created
复制代码
2)检察部署的CSI客户端Pod资源
  1. [root@k8s-master kubernetes]# kubectl get pod -n cephfs-storage
  2. NAME                                            READY   STATUS    RESTARTS   AGE
  3. csi-cephfsplugin-bfdvj                          3/3     Running   0          39s
  4. csi-cephfsplugin-ngv84                          3/3     Running   0          39s
  5. csi-cephfsplugin-provisioner-7bffb54f69-d26ms   6/6     Running   0          38s
  6. csi-cephfsplugin-provisioner-7bffb54f69-q2wsn   6/6     Running   0          38s
  7. csi-cephfsplugin-provisioner-7bffb54f69-q6hw9   6/6     Running   0          38s
  8. csi-cephfsplugin-qlj4k                          3/3     Running   0          39s
复制代码
全部处于Running状态,下面可以来创建StorageClass存储类,将数据恒久化到Cephfs文件系统了。
4.基于Cephfs文件系统创建Storageclass资源并进利用用

Cephfs的CSI客户端驱动已经在集群中部署完成了,下面可以创建一个StorageClass资源通过CSI驱动连接Ceph集群的块存储设备。
创建完StorageClass后,可以创建一个PVC存储卷,观察PV是否会自动创建,最后在Pod中使用PVC。
   使用CSI之前,先在每一个K8S节点中安装Ceph的相关命令。
  1. yum -y install ceph-common
复制代码
4.1.将K8S访问Cephfs文件系统的用户信息存储在Secret资源中

将用户信息的Secret资源固定存放在一个Namespace下,然后在StorageClass中引用即可。
1)编写资源编排文件
  1. [root@k8s-master cephfs-csi]# vim cephfs-sc-secret.yaml
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5.   name: cephfs-sc-secret
  6.   namespace: kube-system
  7. stringData:
  8.   userID: admin
  9.   userKey: AQBIWUhiEmaFOBAA6Jr6itUeHiLVVOeYFVpRog==
  10.   adminID: admin
  11.   adminKey: AQBIWUhiEmaFOBAA6Jr6itUeHiLVVOeYFVpRog==
复制代码
2)创建Secret资源
  1. [root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-secret.yaml
  2. secret/csi-cephfs-secret created
复制代码
4.2.创建一个StorageClass资源控制器

1)编写资源编排文件
  1. [root@k8s-master cephfs-csi]# vim cephfs-storageclass.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5.   name: cephfs-storageclass
  6. provisioner: cephfs.csi.ceph.com                                #cephfs csi客户端的驱动名称
  7. parameters:
  8.   clusterID: a5ec192a-8d13-4624-b253-5b350a616041                        #集群的ID
  9.   fsName: kubernetes_cephfs                                                                        #使用Ceph集群的哪一个Cephfs文件系统
  10.   pool: kubernetes_cephfs_data                                                                #Cephfs文件系统的数据资源池名称
  11.   #rootPath: /k8s_data/storageclass_storage                                         #无需指定Cephfs文件系统中的子目录,CSi会自动在/下的volumes目录中存储,无法修改
  12.   csi.storage.k8s.io/provisioner-secret-name: cephfs-sc-secret                               
  13.   csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  14.   csi.storage.k8s.io/controller-expand-secret-name: cephfs-sc-secret
  15.   csi.storage.k8s.io/controller-expand-secret-namespace: kube-system
  16.   csi.storage.k8s.io/node-stage-secret-name: cephfs-sc-secret
  17.   csi.storage.k8s.io/node-stage-secret-namespace: kube-system
  18. reclaimPolicy: Delete
  19. allowVolumeExpansion: true
复制代码
2)创建StorageClass并检察资源的状态
  1. [root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-secret.yaml
  2. secret/cephfs-sc-secret created
  3. [root@k8s-master cephfs-csi]# kubectl get sc
  4. NAME                  PROVISIONER           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  5. cephfs-storageclass   cephfs.csi.ceph.com   Delete          Immediate           true                   3s
复制代码
4.3.创建PVC存储卷从StorageClass中自动分配PV

1)编写PVC的资源编排文件
  1. [root@k8s-master cephfs-csi]# vim cephfs-sc-pvc.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: cephfs-sc-pvc
  6. spec:
  7.   accessModes:
  8.     - ReadWriteMany
  9.   resources:
  10.     requests:
  11.       storage: 1Gi
  12.   storageClassName: cephfs-storageclass
复制代码
2)创建资源并检察资源的状态
  1. [root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-pvc.yaml
  2. persistentvolumeclaim/cephfs-sc-pvc created
  3. [root@k8s-master cephfs-csi]# kubectl get pvc
  4. NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
  5. cephfs-sc-pvc   Bound    pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1Gi        RWX            cephfs-storageclass   68s
复制代码
可以看到PVC已经与pvc-f5ce8114-088e-41fa-91da-63d759f1dd9c这个PV进行了绑定,这个PV就是由Storageclass自动创建的。
  1. [root@k8s-master cephfs-csi]# kubectl get pv
  2. NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS          REASON   AGE
  3. pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1Gi        RWX            Delete           Bound    default/cephfs-sc-pvc   cephfs-storageclass            69s
复制代码
4.4.创建Pod资源挂载PVC存储卷

PVC已经预备就绪了,下面创建一个Pod资源,将PVC挂载到Pod资源中,恒久化Pod资源的数据。
1)编写资源编排文件
  1. [root@k8s-master cephfs-csi]# vim cephfs-sc-pvc-pod.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: cephfs-sc-pvc-pod
  6. spec:
  7.   containers:
  8.     - image: nginx:1.15
  9.       name: nginx
  10.       ports:
  11.       - name: web
  12.         containerPort: 80
  13.         protocol: TCP
  14.       volumeMounts:
  15.       - name: data
  16.         mountPath: /var/www/html
  17.   volumes:
  18.     - name: data
  19.       persistentVolumeClaim:
  20.         claimName: cephfs-sc-pvc
复制代码
2)创建资源并观察资源的状态
  1. [root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-pvc-pod.yaml
  2. pod/cephfs-sc-pvc-pod created
  3. [root@k8s-master cephfs-csi]# kubectl get pod
  4. NAME                READY   STATUS    RESTARTS   AGE
  5. cephfs-sc-pvc-pod   1/1     Running   0          42s
复制代码
4.5.进入Pod资源进行数据恒久化利用

进入的Pod容器的PVC挂载路径,写入一些数据文件。
  1. [root@k8s-master cephfs-csi]# kubectl exec -it cephfs-sc-pvc-pod bash
  2. root@cephfs-sc-pvc-pod:/# cd /var/www/html/
  3. root@cephfs-sc-pvc-pod:/var/www/html# touch web{1..5}.index
  4. root@cephfs-sc-pvc-pod:/var/www/html# mkdir code login admin
  5. root@cephfs-sc-pvc-pod:/var/www/html# ls
  6. admin  code  login  web1.index        web2.index  web3.index        web4.index  web5.index
复制代码
4.6.检察由StorageClass分配的PV与Cephfs文件存储中子目次的对应关系

由StorageClass动态创建的PV,生成的名称都是随机的,没有什么寄义,盲目的在Cephfs文件系统中找不一定能找的对。
可以通过kubectl describe pv {pv_name}目次看到PV恒久化的数据存储在Cephfs文件系统的哪个路径中,

主要看这一行:
  1. subvolumePath=/volumes/k8s-storageclass-volumes/csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2/50b7e45b-a48d-4d0f-be36-86812c8367e8
复制代码
  /volumes目次:是CSI客户端从代码部分就指定好的,无法变动。
  /volumes/k8s-storageclass-volumes目次:k8s-storageclass-volumes目次对应的就是在Cephfs文件系统中创建的子卷名称
  /volumes/k8s-storageclass-volumes/csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2目次:第三级si-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2目次是由CSI创建的子卷,PV会保存在这一级目次中,也是一个目次。
  /volumes/k8s-storageclass-volumes/csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2/50b7e45b-a48d-4d0f-be36-86812c8367e8:第四级50b7e45b-a48d-4d0f-be36-86812c8367e8目次就是PV的目次,也是Pod数据恒久化落盘的位置。
  每当StorageClass分配一个PV,都会在文件系统中/volumes/目次下生产一个元数据文件,并且在创建的子卷目次下为每一个PV创建一个csi的子卷,最后在创建一个目次来存放PV的数据。
我们可以再创建一个PVC,由Storageclass为其分配PV,检察目次结构,如下图所示。

   万万不要删除volumes这个目次,一旦这个目次删除,使用Cephfs的StorageCLass再次分配PV时就会产生题目,此时只需要将CSI客户端重新部署即可解决题目。
  4.7.观察Cephfs文件系统中是否有Pod产生的数据

Pod产生的数据都会存储在/volumes/{子卷}/{CSI子卷}/{PV目次}这个路径下。
  1. [root@ceph-node-1 ~]# tree /kubernetes_cephfs/
  2. /kubernetes_cephfs/
  3. └── volumes
  4.     ├── _deleting
  5.     ├── k8s-storageclass-volumes
  6.     │   └── csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2
  7.     │       └── 50b7e45b-a48d-4d0f-be36-86812c8367e8
  8.     │           ├── admin
  9.     │           ├── login
  10.     │           ├── web
  11.     │           ├── web1.txt
  12.     │           ├── web2.txt
  13.     │           ├── web3.txt
  14.     │           ├── web4.txt
  15.     │           └── web5.txt
  16.     └── _k8s-storageclass-volumes:csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2.meta
  17. 8 directories, 6 files
复制代码
5.Statefulset控制器结合Storageclass为每个Pod分配独立存储

现在StorageClass已经对接好了Ceph集群的Cephfs文件系统,下面在Statefulset控制器使用StorageClass为每个Pod分配独立的存储源。
每个Pod都会通过StorageClass创建出一个PVC和PV,每个PVC都会对应一个PV,每个PV都会在文件系统中创建一组目次。
5.1.编写Statefulset控制器资源编排文件

  1. [root@k8s-master cephfs-csi]# vim cephfs-statefulset.yaml
  2. apiVersion: apps/v1
  3. kind: StatefulSet
  4. metadata:
  5.   name: nginx
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       app: nginx
  10.   serviceName: "nginx"
  11.   replicas: 3
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: nginx
  16.     spec:
  17.       containers:
  18.       - name: nginx
  19.         image: nginx:1.15
  20.         volumeMounts:
  21.         - name: web-data
  22.           mountPath: /var/www/html
  23.   volumeClaimTemplates:
  24.   - metadata:
  25.       name: web-data
  26.     spec:
  27.       storageClassName: "cephfs-storageclass"
  28.       accessModes:
  29.       - ReadWriteMany
  30.       resources:
  31.         requests:
  32.           storage: 1Gi
复制代码
5.2.创建资源控制器并观察PV和PVC的状态

  1. 1.创建statefulset控制器
  2. [root@k8s-master cephfs-csi]# kubectl apply -f cephfs-statefulset.yaml
  3. statefulset.apps/nginx created
  4. 2.查看创建的资源
  5. [root@k8s-master cephfs-csi]# kubectl get pod
  6. NAME                READY   STATUS    RESTARTS   AGE
  7. cephfs-sc-pvc-pod   1/1     Running   0          80m
  8. nginx-0             1/1     Running   0          8m35s
  9. nginx-1             1/1     Running   0          8m24s
  10. nginx-2             1/1     Running   0          8m15s
  11. 3.查看PV和PVC
  12. [root@k8s-master cephfs-csi]# kubectl get pv
  13. NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS          REASON   AGE
  14. pvc-0350926b-1933-411b-8eb4-ba583e272c08   1Gi        RWX            Delete           Bound    default/web-data-nginx-1   cephfs-storageclass            9m4s
  15. pvc-49747cef-46b0-4f83-976d-039020b679c4   1Gi        RWX            Delete           Bound    default/web-data-nginx-0   cephfs-storageclass            9m15s
  16. pvc-93fcf7bf-b593-4b7c-8a04-717d49685c93   1Gi        RWX            Delete           Bound    default/web-data-nginx-2   cephfs-storageclass            8m55s
  17. pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1Gi        RWX            Delete           Bound    default/cephfs-sc-pvc      cephfs-storageclass            81m
  18. [root@k8s-master cephfs-csi]# kubectl get pvc
  19. NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
  20. cephfs-sc-pvc      Bound    pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1Gi        RWX            cephfs-storageclass   81m
  21. web-data-nginx-0   Bound    pvc-49747cef-46b0-4f83-976d-039020b679c4   1Gi        RWX            cephfs-storageclass   9m36s
  22. web-data-nginx-1   Bound    pvc-0350926b-1933-411b-8eb4-ba583e272c08   1Gi        RWX            cephfs-storageclass   9m25s
  23. web-data-nginx-2   Bound    pvc-93fcf7bf-b593-4b7c-8a04-717d49685c93   1Gi        RWX            cephfs-storageclass   9m16s
复制代码
5.3.检察PV对应在Cephfs文件系统中的目次结构

每一个PV都对应一个子目次和数据文件。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表