当前位置: 代码网 > 服务器>服务器>Linux > 第33讲:K8S集群StorageClass使用Ceph CSI供应商与Cephfs文件系统集成

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

2024年08月02日 Linux 我要评论
K8S StorageClass对接Ceph集群的Cephfs文件系统有两种方法,一种是cephfs-provisioner另一种是cephfs-csi。Cephfs-csi是第三方的客户端程序,部署简单,只需要拉取下来镜像就可以部署成功,而cephfs-provisioner则有很多的故障,相对于对接RBD的存储时,rbd-provisioner非常简单,rbd-csi则有很多故障。

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.创建cephfs使用的资源池
[root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_data 16 16
pool 'kubernetes_cephfs_data' created
[root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_metadata 16 16
pool 'kubernetes_cephfs_metadata' created

2.创建cephfs文件系统
[root@ceph-node-1 ~]# ceph fs new kubernetes_cephfs  kubernetes_cephfs_metadata kubernetes_cephfs_data
new fs with metadata pool 24 and data pool 23

2.2.在cephfs文件系统中为storageclass创建子目录

我们可以将这一个cephfs文件系统仅针对k8s集群进行使用,所有的k8s持久化数据都存在这个cephfs文件系统中,在这个文件系统里可以针对不同的应用程序,创建出不同的子目录,然后将子目录挂载到具体的应用程序上。ll

[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都会对应生成一个目录。

image-20220419171140172

volumes目录是无法修改的,只能修改volumes目录中的子目录csi,cephfs-csi会在ceph集群指定的cephfs文件系统中创建一个子卷,这个目录就对应的就是子卷的名称。

下面我们来创建一个子卷。

命令格式:ceph fs subvolumegroup create {cephfs文件系统名称} {子卷名称}

1.创建子卷
[root@ceph-node-1 ~]# ceph fs subvolumegroup create kubernetes_cephfs k8s-storageclass-volumes

2.查看文件系统下所有的子卷
[root@ceph-node-1 ~]# ceph fs subvolumegroup ls kubernetes_cephfs
[
    {
        "name": "k8s-storageclass-volumes"
    }
]

3.删除子卷的命令:
[root@ceph-node-1 ~]# ceph fs subvolumegroup create kubernetes_cephfs k8s-storageclass-volumes

3.在k8s集群中部署cephfs-csi供应商客户端

3.1.下载cephfs-csi客户端的资源编排文件

[root@k8s-master cephfs-csi]# git clone https://github.com/ceph/ceph-csi.git -b release-v3.4
[root@k8s-master cephfs-csi]# cd ceph-csi/deploy/cephfs/kubernetes

3.2.配置csi连接ceph集群的configmap资源

[root@k8s-master kubernetes]# vim csi-config-map.yaml
apiversion: v1
kind: configmap
data:
  config.json: |-
    [
      {
       "clusterid": "a5ec192a-8d13-4624-b253-5b350a616041",
       "monitors": [
          "192.168.20.20:6789",
          "192.168.20.21:6789",
          "192.168.20.22:6789"
       ],
        "cephfs": {
          "subvolumegroup": "k8s-storageclass-volumes"
        }
      }
    ]
metadata:
  name: ceph-csi-config

3.3.将ceph的配置文件保存在configmap中

需要将ceph的基础配置文件写入到configmap资源中,csi客户端的两个容器都需要挂载。

[root@k8s-master kubernetes]# vim ceph-config.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

3.4.调整资源编排文件的命名空间以及镜像地址

csi的镜像在国外,拉取会超时,需要替换成dockerhub上的地址。

[root@k8s-master kubernetes]# namespace=cephfs-storage
[root@k8s-master kubernetes]# sed -ri "s/namespace: [^ ]+/namespace: $namespace/g" *.yaml

[root@k8s-master kubernetes]# sed -ri 's/k8s.gcr.io\/sig-storage/jiangxlrepo/' *.yaml
[root@k8s-master kubernetes]# sed -ri 's/quay.io\/cephcsi/jiangxlrepo/' *.yaml

3.5.部署csi客户端

1)在k8s集群中部署csi客户端

1.创建csi客户端所在的namespace
[root@k8s-master kubernetes]# kubectl create ns cephfs-storage
namespace/cephfs-storage created

2.部署所有的csi资源控制器
[root@k8s-master kubernetes]# kubectl apply -f ./ -n cephfs-storage 
configmap/ceph-config created
service/csi-cephfsplugin-provisioner created
deployment.apps/csi-cephfsplugin-provisioner created
daemonset.apps/csi-cephfsplugin created
service/csi-metrics-cephfsplugin created
configmap/ceph-csi-config created
podsecuritypolicy.policy/cephfs-csi-nodeplugin-psp created
role.rbac.authorization.k8s.io/cephfs-csi-nodeplugin-psp created
rolebinding.rbac.authorization.k8s.io/cephfs-csi-nodeplugin-psp created
serviceaccount/cephfs-csi-nodeplugin created
clusterrole.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created
podsecuritypolicy.policy/cephfs-csi-provisioner-psp created
role.rbac.authorization.k8s.io/cephfs-csi-provisioner-psp created
rolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-psp created
serviceaccount/cephfs-csi-provisioner created
clusterrole.rbac.authorization.k8s.io/cephfs-external-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role created
role.rbac.authorization.k8s.io/cephfs-external-provisioner-cfg created
rolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role-cfg created
csidriver.storage.k8s.io/cephfs.csi.ceph.com created

2)查看部署的csi客户端pod资源

[root@k8s-master kubernetes]# kubectl get pod -n cephfs-storage 
name                                            ready   status    restarts   age
csi-cephfsplugin-bfdvj                          3/3     running   0          39s
csi-cephfsplugin-ngv84                          3/3     running   0          39s
csi-cephfsplugin-provisioner-7bffb54f69-d26ms   6/6     running   0          38s
csi-cephfsplugin-provisioner-7bffb54f69-q2wsn   6/6     running   0          38s
csi-cephfsplugin-provisioner-7bffb54f69-q6hw9   6/6     running   0          38s
csi-cephfsplugin-qlj4k                          3/3     running   0          39s

全部处于running状态,下面可以来创建storageclass存储类,将数据持久化到cephfs文件系统了。

4.基于cephfs文件系统创建storageclass资源并进行使用

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

创建完storageclass后,可以创建一个pvc存储卷,观察pv是否会自动创建,最后在pod中使用pvc。

4.1.将k8s访问cephfs文件系统的用户信息存储在secret资源中

将用户信息的secret资源固定存放在一个namespace下,然后在storageclass中引用即可。

1)编写资源编排文件

[root@k8s-master cephfs-csi]# vim cephfs-sc-secret.yaml 
apiversion: v1
kind: secret
metadata:
  name: cephfs-sc-secret
  namespace: kube-system
stringdata:
  userid: admin
  userkey: aqbiwuhiemafobaa6jr6ituehilvvoeyfvprog==
  adminid: admin
  adminkey: aqbiwuhiemafobaa6jr6ituehilvvoeyfvprog==

2)创建secret资源

[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-secret.yaml
secret/csi-cephfs-secret created

4.2.创建一个storageclass资源控制器

1)编写资源编排文件

[root@k8s-master cephfs-csi]# vim cephfs-storageclass.yaml 
apiversion: storage.k8s.io/v1
kind: storageclass
metadata:
  name: cephfs-storageclass
provisioner: cephfs.csi.ceph.com				#cephfs csi客户端的驱动名称
parameters:
  clusterid: a5ec192a-8d13-4624-b253-5b350a616041			#集群的id
  fsname: kubernetes_cephfs									#使用ceph集群的哪一个cephfs文件系统
  pool: kubernetes_cephfs_data								#cephfs文件系统的数据资源池名称
  #rootpath: /k8s_data/storageclass_storage					 #无需指定cephfs文件系统中的子目录,csi会自动在/下的volumes目录中存储,无法修改
  csi.storage.k8s.io/provisioner-secret-name: cephfs-sc-secret				
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  csi.storage.k8s.io/controller-expand-secret-name: cephfs-sc-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: kube-system
  csi.storage.k8s.io/node-stage-secret-name: cephfs-sc-secret
  csi.storage.k8s.io/node-stage-secret-namespace: kube-system
reclaimpolicy: delete
allowvolumeexpansion: true

2)创建storageclass并查看资源的状态

[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-secret.yaml 
secret/cephfs-sc-secret created

[root@k8s-master cephfs-csi]# kubectl get sc
name                  provisioner           reclaimpolicy   volumebindingmode   allowvolumeexpansion   age
cephfs-storageclass   cephfs.csi.ceph.com   delete          immediate           true                   3s

4.3.创建pvc存储卷从storageclass中自动分配pv

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

[root@k8s-master cephfs-csi]# vim cephfs-sc-pvc.yaml 
apiversion: v1
kind: persistentvolumeclaim
metadata:
  name: cephfs-sc-pvc
spec:
  accessmodes:
    - readwritemany
  resources:
    requests:
      storage: 1gi
  storageclassname: cephfs-storageclass

2)创建资源并查看资源的状态

[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-pvc.yaml
persistentvolumeclaim/cephfs-sc-pvc created

[root@k8s-master cephfs-csi]# kubectl get pvc
name            status   volume                                     capacity   access modes   storageclass          age
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自动创建的。

[root@k8s-master cephfs-csi]# kubectl get pv
name                                       capacity   access modes   reclaim policy   status   claim                   storageclass          reason   age
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)编写资源编排文件

[root@k8s-master cephfs-csi]# vim cephfs-sc-pvc-pod.yaml 
apiversion: v1
kind: pod
metadata:
  name: cephfs-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: cephfs-sc-pvc

2)创建资源并观察资源的状态

[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-sc-pvc-pod.yaml
pod/cephfs-sc-pvc-pod created

[root@k8s-master cephfs-csi]# kubectl get pod
name                ready   status    restarts   age
cephfs-sc-pvc-pod   1/1     running   0          42s

4.5.进入pod资源进行数据持久化操作

进入的pod容器的pvc挂载路径,写入一些数据文件。

[root@k8s-master cephfs-csi]# kubectl exec -it cephfs-sc-pvc-pod bash
root@cephfs-sc-pvc-pod:/# cd /var/www/html/
root@cephfs-sc-pvc-pod:/var/www/html# touch web{1..5}.index
root@cephfs-sc-pvc-pod:/var/www/html# mkdir code login admin
root@cephfs-sc-pvc-pod:/var/www/html# ls
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文件系统的哪个路径中,

image-20220419215743773

主要看这一行:

subvolumepath=/volumes/k8s-storageclass-volumes/csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2/50b7e45b-a48d-4d0f-be36-86812c8367e8

每当storageclass分配一个pv,都会在文件系统中/volumes/目录下生产一个元数据文件,并且在创建的子卷目录下为每一个pv创建一个csi的子卷,最后在创建一个目录来存放pv的数据。

我们可以再创建一个pvc,由storageclass为其分配pv,查看目录结构,如下图所示。

image-20220419220743029

4.7.观察cephfs文件系统中是否有pod产生的数据

pod产生的数据都会存储在/volumes/{子卷}/{csi子卷}/{pv目录}这个路径下。

[root@ceph-node-1 ~]# tree /kubernetes_cephfs/
/kubernetes_cephfs/
└── volumes
    ├── _deleting
    ├── k8s-storageclass-volumes
    │   └── csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2
    │       └── 50b7e45b-a48d-4d0f-be36-86812c8367e8
    │           ├── admin
    │           ├── login
    │           ├── web
    │           ├── web1.txt
    │           ├── web2.txt
    │           ├── web3.txt
    │           ├── web4.txt
    │           └── web5.txt
    └── _k8s-storageclass-volumes:csi-vol-2f7d25c6-bfe8-11ec-8b4e-d65c041d72e2.meta

8 directories, 6 files

5.statefulset控制器结合storageclass为每个pod分配独立存储

现在storageclass已经对接好了ceph集群的cephfs文件系统,下面在statefulset控制器使用storageclass为每个pod分配独立的存储源。

每个pod都会通过storageclass创建出一个pvc和pv,每个pvc都会对应一个pv,每个pv都会在文件系统中创建一组目录。

5.1.编写statefulset控制器资源编排文件

[root@k8s-master cephfs-csi]# vim cephfs-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:
      storageclassname: "cephfs-storageclass"
      accessmodes:
      - readwritemany
      resources:
        requests:
          storage: 1gi

5.2.创建资源控制器并观察pv和pvc的状态

1.创建statefulset控制器
[root@k8s-master cephfs-csi]# kubectl apply -f cephfs-statefulset.yaml 
statefulset.apps/nginx created

2.查看创建的资源
[root@k8s-master cephfs-csi]# kubectl get pod
name                ready   status    restarts   age
cephfs-sc-pvc-pod   1/1     running   0          80m
nginx-0             1/1     running   0          8m35s
nginx-1             1/1     running   0          8m24s
nginx-2             1/1     running   0          8m15s

3.查看pv和pvc
[root@k8s-master cephfs-csi]# kubectl get pv
name                                       capacity   access modes   reclaim policy   status   claim                      storageclass          reason   age
pvc-0350926b-1933-411b-8eb4-ba583e272c08   1gi        rwx            delete           bound    default/web-data-nginx-1   cephfs-storageclass            9m4s
pvc-49747cef-46b0-4f83-976d-039020b679c4   1gi        rwx            delete           bound    default/web-data-nginx-0   cephfs-storageclass            9m15s
pvc-93fcf7bf-b593-4b7c-8a04-717d49685c93   1gi        rwx            delete           bound    default/web-data-nginx-2   cephfs-storageclass            8m55s
pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1gi        rwx            delete           bound    default/cephfs-sc-pvc      cephfs-storageclass            81m

[root@k8s-master cephfs-csi]# kubectl get pvc
name               status   volume                                     capacity   access modes   storageclass          age
cephfs-sc-pvc      bound    pvc-9fcb0460-6547-4e9f-8efe-6e2266bc4aab   1gi        rwx            cephfs-storageclass   81m
web-data-nginx-0   bound    pvc-49747cef-46b0-4f83-976d-039020b679c4   1gi        rwx            cephfs-storageclass   9m36s
web-data-nginx-1   bound    pvc-0350926b-1933-411b-8eb4-ba583e272c08   1gi        rwx            cephfs-storageclass   9m25s
web-data-nginx-2   bound    pvc-93fcf7bf-b593-4b7c-8a04-717d49685c93   1gi        rwx            cephfs-storageclass   9m16s

5.3.查看pv对应在cephfs文件系统中的目录结构

每一个pv都对应一个子目录和数据文件。

image-20220419232042628

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com