经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
k8s使用rbd作为存储
来源:cnblogs  作者:FuShudi  时间:2024/6/19 15:14:31  对本文有异议

k8s使用rbd作为存储

如果需要使用rbd作为后端存储的话,需要先安装ceph-common

1. ceph集群创建rbd

需要提前在ceph集群上创建pool,然后创建image

  1. [root@ceph01 ~]# ceph osd pool create pool01
  2. [root@ceph01 ~]# ceph osd pool application enable pool01 rbd
  3. [root@ceph01 ~]# rbd pool init pool01
  4. [root@ceph01 ~]# rbd create pool01/test --size 10G --image-format 2 --image-feature layerin
  5. [root@ceph01 ~]# rbd info pool01/test

2. k8s编写yaml文件

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. creationTimestamp: null
  5. labels:
  6. app: rbd
  7. name: rbd
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: rbd
  13. strategy: {}
  14. template:
  15. metadata:
  16. creationTimestamp: null
  17. labels:
  18. app: rbd
  19. spec:
  20. volumes:
  21. - name: test
  22. rbd:
  23. fsType: xfs
  24. keyring: /root/admin.keyring
  25. monitors:
  26. - 192.168.200.230:6789
  27. pool: pool01
  28. image: test
  29. user: admin
  30. readOnly: false
  31. containers:
  32. - image: nginx
  33. imagePullPolicy: IfNotPresent
  34. volumeMounts:
  35. - mountPath: /usr/share/nginx/html
  36. name: test
  37. name: nginx
  38. resources: {}
  39. status: {}
  1. [root@master ~]# kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. rbd-888b8b747-n56wr 1/1 Running 0 26m

这个时候k8s就使用了rbd作为存储

如果这个地方一直显示ContainerCreating的话,可能是没有安装ceph-common,也可能是你的keyring或者ceph.conf没有发放到node节点,具体可以使用describe来看

2.1 进入容器查看挂载

  1. [root@master euler]# kubectl exec -it rbd-5db4759c-nj2b4 -- bash
  2. root@rbd-5db4759c-nj2b4:/# df -hT |grep /dev/rbd0
  3. /dev/rbd0 xfs 10G 105M 9.9G 2% /usr/share/nginx/html

可以看到,/dev/rbd0已经被格式化成xfs并且挂载到了/usr/share/nginx/html

2.2 进入容器修改内容

  1. root@rbd-5db4759c-nj2b4:/usr/share/nginx# cd html/
  2. root@rbd-5db4759c-nj2b4:/usr/share/nginx/html# ls
  3. root@rbd-5db4759c-nj2b4:/usr/share/nginx/html# echo 123 > index.html
  4. root@rbd-5db4759c-nj2b4:/usr/share/nginx/html# chmod 644 index.html
  5. root@rbd-5db4759c-nj2b4:/usr/share/nginx/html# exit
  6. [root@master euler]# kubectl get pods -o wide
  7. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  8. rbd-5db4759c-nj2b4 1/1 Running 0 8m5s 192.168.166.131 node1 <none> <none>

访问容器查看内容

  1. [root@master euler]# curl 192.168.166.131
  2. 123

内容可以正常被访问到,我们将容器删除,然后让他自己重新启动一个来看看文件是否还存在

  1. [root@master euler]# kubectl delete pods rbd-5db4759c-nj2b4
  2. pod "rbd-5db4759c-nj2b4" deleted
  3. [root@master euler]# kubectl get pods
  4. NAME READY STATUS RESTARTS AGE
  5. rbd-5db4759c-v9cgm 0/1 ContainerCreating 0 2s
  6. [root@master euler]# kubectl get pods -owide
  7. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  8. rbd-5db4759c-v9cgm 1/1 Running 0 40s 192.168.166.132 node1 <none> <none>
  9. [root@master euler]# curl 192.168.166.132
  10. 123

可以看到,也是没有问题的,这样k8s就正常的使用了rbd存储

有一个问题,那就是开发人员他们并不是很了解yaml文件里面改怎么去写挂载,每种类型的存储都是不同的写法,那有没有一种方式屏蔽底层的写法,直接告诉k8s集群我想要一个什么样的存储呢?

有的,那就是pv

3. pv使用rbd

  1. [root@master euler]# vim pvc.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5. name: myclaim
  6. spec:
  7. accessModes:
  8. - ReadWriteOnce
  9. volumeMode: Block
  10. resources:
  11. requests:
  12. storage: 8Gi

这里的pvc使用的是块设备,8个G,目前还没有这个pv可以给到他

具体的这里不细说,CKA里面有写

注意,这里是pvc,并不是pv,pvc就是开发人员定义想要的存储类型,大小,然后我可以根据你的pvc去给你创建pv,或者提前创建好pv你直接申领

  1. [root@master euler]# vim pv.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5. name: rbdpv
  6. spec:
  7. capacity:
  8. storage: 8Gi
  9. volumeMode: Block
  10. accessModes:
  11. - ReadWriteOnce
  12. persistentVolumeReclaimPolicy: Recycle
  13. mountOptions:
  14. - hard
  15. - nfsvers=4.1
  16. rbd:
  17. fsType: xfs
  18. image: test
  19. keyring: /etc/ceph/ceph.client.admin.keyring
  20. monitors:
  21. - 172.16.1.33
  22. pool: rbd
  23. readOnly: false
  24. user: admin

3.1 查看pvc状态

  1. [root@master euler]# kubectl get pvc
  2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  3. myclaim Bound rbdpv 8Gi RWO 11s

这个时候pv和就和pvc绑定上了,一个pv只能绑定一个pvc,同样,一个pvc也只能绑定一个pv

3.2 使用pvc

  1. [root@master euler]# vim pod-pvc.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. creationTimestamp: null
  6. labels:
  7. run: pvc-pod
  8. name: pvc-pod
  9. spec:
  10. volumes:
  11. - name: rbd
  12. persistentVolumeClaim:
  13. claimName: myclaim
  14. readOnly: false
  15. containers:
  16. - image: nginx
  17. imagePullPolicy: IfNotPresent
  18. name: pvc-pod
  19. volumeDevices: # 因为是使用的块设备,所以这里是volumeDevices
  20. - devicePath: /dev/rbd0
  21. name: rbd
  22. resources: {}
  23. dnsPolicy: ClusterFirst
  24. restartPolicy: Always
  25. status: {}
  26. ~
  1. [root@master euler]# kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. pvc-pod 1/1 Running 0 2m5s
  4. rbd-5db4759c-v9cgm 1/1 Running 0 39m

3.3 进入容器查看块设备

  1. root@pvc-pod:/# ls /dev/rbd0
  2. /dev/rbd0

可以看到,现在rbd0已经存在于容器内部了

这样做我们每次创建pvc都需要创建对应的pv,我们可以使用动态制备

4. 动态制备

使用storageClass,但是目前欧拉使用的k8s太老了,所以需要下载欧拉fork的一个storageClass

  1. [root@master ~]# git clone https://gitee.com/yftyxa/ceph-csi.git
  2. [root@master ~]# cd ceph-csi/deploy/
  3. [root@master deploy]# ls
  4. ceph-conf.yaml csi-config-map-sample.yaml rbd
  5. cephcsi Makefile scc.yaml
  6. cephfs nfs service-monitor.yaml

4.1 动态制备rbd

我们需要修改/root/ceph-csi/deploy/rbd/kubernetes/csi-config-map.yaml

  1. # 先创建一个csi命名空间
  2. [root@master ~]# kubectl create ns csi

修改文件内容

  1. [root@master kubernetes]# vim csi-rbdplugin-provisioner.yaml
  2. # 将第63行的内容改为false
  3. 63 - "--extra-create-metadata=false"
  4. # 修改第二个文件
  5. [root@master kubernetes]# vim csi-config-map.yaml
  6. apiVersion: v1
  7. kind: ConfigMap
  8. metadata:
  9. name: "ceph-csi-config"
  10. data:
  11. config.json: |-
  12. [
  13. {
  14. "clusterID": "c1f213ae-2de3-11ef-ae15-00163e179ce3",
  15. "monitors": ["172.16.1.33","172.16.1.32","172.16.1.31"]
  16. }
  17. ]
  • 这里面的clusterID可以通过ceph -s去查看

修改第三个文件

  1. [root@master kubernetes]# vim csidriver.yaml
  2. ---
  3. apiVersion: storage.k8s.io/v1
  4. kind: CSIDriver
  5. metadata:
  6. name: "rbd.csi.ceph.com"
  7. spec:
  8. attachRequired: true
  9. podInfoOnMount: false
  10. # seLinuxMount: true # 将这一行注释
  11. fsGroupPolicy: File

自行编写一个文件

  1. [root@master kubernetes]# vim csi-kms-config-map.yaml
  2. ---
  3. apiVersion: v1
  4. kind: ConfigMap
  5. metadata:
  6. name: ceph-csi-encryption-kms-config
  7. data:
  8. config-json: |-
  9. {}

4.2 获取admin的key

  1. [root@ceph001 ~]# cat /etc/ceph/ceph.client.admin.keyring
  2. [client.admin]
  3. key = AQC4QnJmng4HIhAA42s27yOflqOBNtEWDgEmkg==
  4. caps mds = "allow *"
  5. caps mgr = "allow *"
  6. caps mon = "allow *"
  7. caps osd = "allow *"
  • AQC4QnJmng4HIhAA42s27yOflqOBNtEWDgEmkg== 只要这部分

然后自行编写一个csi-secret.yaml的文件

  1. [root@master kubernetes]# vim csi-secret.yaml
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5. name: csi-secret
  6. stringData:
  7. userID: admin
  8. userKey: AQC4QnJmng4HIhAA42s27yOflqOBNtEWDgEmkg==
  9. adminID: admin
  10. adminKey: AQC4QnJmng4HIhAA42s27yOflqOBNtEWDgEmkg==
  11. [root@master kubernetes]# kubectl apply -f csi-secret.yaml -n csi
  12. secret/csi-secret created
  13. [root@master kubernetes]# cd ../../
  14. [root@master deploy]# kubectl apply -f ceph-conf.yaml -n csi
  15. configmap/ceph-config created
  16. [root@master deploy]# cd -
  17. /root/ceph-csi/deploy/rbd/kubernetes

4.3替换所有的namespace

  1. [root@master kubernetes]# sed -i "s/namespace: default/namespace: csi/g"
  2. *.yaml

4.4 部署

  1. [root@master kubernetes]# [root@master kubernetes]# kubectl apply -f . -n csi

注意:如果你的worker节点数量少于3个的话,是需要将 csi-rbdplugin-provisioner.yaml这个文件里面的replicas改小一点的。

  1. [root@master kubernetes]# kubectl get pods -n csi
  2. NAME READY STATUS RESTARTS AGE
  3. csi-rbdplugin-cv455 3/3 Running 1 (2m14s ago) 2m46s
  4. csi-rbdplugin-pf5ld 3/3 Running 0 4m36s
  5. csi-rbdplugin-provisioner-6846c4df5f-dvqqk 7/7 Running 0 4m36s
  6. csi-rbdplugin-provisioner-6846c4df5f-nmcxf 7/7 Running 1 (2m11s ago) 4m36s

5.使用动态制备

5.1 创建storageClass

  1. [root@master rbd]# /root/ceph-csi/examples/rbd
  2. [root@master rbd]# grep -Ev "\s*#|^$" storageclass.yaml
  3. ---
  4. apiVersion: storage.k8s.io/v1
  5. kind: StorageClass
  6. metadata:
  7. name: csi-rbd-sc
  8. provisioner: rbd.csi.ceph.com
  9. parameters:
  10. clusterID: <cluster-id>
  11. pool: <rbd-pool-name>
  12. imageFeatures: "layering"
  13. csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
  14. csi.storage.k8s.io/provisioner-secret-namespace: default
  15. csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
  16. csi.storage.k8s.io/controller-expand-secret-namespace: default
  17. csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
  18. csi.storage.k8s.io/node-stage-secret-namespace: default
  19. csi.storage.k8s.io/fstype: ext4
  20. reclaimPolicy: Delete
  21. allowVolumeExpansion: true
  22. mountOptions:
  23. - discard

将这里的内容复制出来

  1. ---
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5. name: csi-rbd-sc
  6. provisioner: rbd.csi.ceph.com
  7. parameters:
  8. clusterID: c1f213ae-2de3-11ef-ae15-00163e179ce3
  9. pool: rbd
  10. imageFeatures: "layering"
  11. csi.storage.k8s.io/provisioner-secret-name: csi-secret
  12. csi.storage.k8s.io/provisioner-secret-namespace: csi
  13. csi.storage.k8s.io/controller-expand-secret-name: csi-secret
  14. csi.storage.k8s.io/controller-expand-secret-namespace: csi
  15. csi.storage.k8s.io/node-stage-secret-name: csi-secret
  16. csi.storage.k8s.io/node-stage-secret-namespace: csi
  17. csi.storage.k8s.io/fstype: ext4
  18. reclaimPolicy: Retain
  19. allowVolumeExpansion: true
  20. mountOptions:
  21. - discard

修改成这个样子,这里面的clusterID改成自己的,secret-name自己查一下

5.2 创建pvc

  1. [root@master euler]# cp pvc.yaml sc-pvc.yaml
  2. [root@master euler]# vim sc-pvc.yaml
  3. apiVersion: v1
  4. kind: PersistentVolumeClaim
  5. metadata:
  6. name: sc-pvc
  7. spec:
  8. accessModes:
  9. - ReadWriteOnce
  10. volumeMode: Block
  11. storageClassName: "csi-rbd-sc"
  12. resources:
  13. requests:
  14. storage: 15Gi
  • storageClassName 可以使用 kubectl get sc查看

现在我们只需要创建pvc,他就自己可以创建pv了

  1. [root@master euler]# kubectl apply -f sc-pvc.yaml
  2. persistentvolumeclaim/sc-pvc created
  3. [root@master euler]# kubectl get pvc
  4. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  5. myclaim Bound rbdpv 8Gi RWO 111m
  6. sc-pvc Bound pvc-dfe3497f-9ed7-4961-9265-9e7242073c28 15Gi RWO csi-rbd-sc 2s

回到ceph集群查看rbd

  1. [root@ceph001 ~]# rbd ls
  2. csi-vol-56e37046-b9d7-4ef1-a534-970a766744f3
  3. test
  4. [root@ceph001 ~]# rbd info csi-vol-56e37046-b9d7-4ef1-a534-970a766744f3
  5. rbd image 'csi-vol-56e37046-b9d7-4ef1-a534-970a766744f3':
  6. size 15 GiB in 3840 objects
  7. order 22 (4 MiB objects)
  8. snapshot_count: 0
  9. id: 38019ee708da
  10. block_name_prefix: rbd_data.38019ee708da
  11. format: 2
  12. features: layering
  13. op_features:
  14. flags:
  15. create_timestamp: Wed Jun 19 04:55:35 2024
  16. access_timestamp: Wed Jun 19 04:55:35 2024
  17. modify_timestamp: Wed Jun 19 04:55:35 2024

5.3 将sc设为默认

如果不设置为默认的话,每次写yaml文件都需要指定sc,将sc设为默认的话就不用每次都指定了

  1. [root@master euler]# kubectl edit sc csi-rbd-sc
  2. # 在注释里面写入这一行
  3. annotations:
  4. storageclass.kubernetes.io/is-default-class: "true"

5.4 测试默认pvc

  1. [root@master euler]# kubectl get sc
  2. NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
  3. csi-rbd-sc (default) rbd.csi.ceph.com Retain Immediate true 29m

再去查看sc就会有一个default的显示

  1. [root@master euler]# cp sc-pvc.yaml sc-pvc1.yaml
  2. [root@master euler]# cat sc-pvc1.yaml
  3. apiVersion: v1
  4. kind: PersistentVolumeClaim
  5. metadata:
  6. name: sc-pvc1
  7. spec:
  8. accessModes:
  9. - ReadWriteOnce
  10. volumeMode: Block
  11. resources:
  12. requests:
  13. storage: 20Gi

这个文件里面是没有指定storageClassName的

  1. [root@master euler]# kubectl apply -f sc-pvc1.yaml
  2. persistentvolumeclaim/sc-pvc1 created
  3. [root@master euler]# kubectl get pvc
  4. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  5. myclaim Bound rbdpv 8Gi RWO 138m
  6. sc-pvc Bound pvc-dfe3497f-9ed7-4961-9265-9e7242073c28 15Gi RWO csi-rbd-sc 27m
  7. sc-pvc1 Bound pvc-167cf73b-4983-4c28-aa98-bb65bb966649 20Gi RWO csi-rbd-sc 6s

这样就好了

原文链接:https://www.cnblogs.com/fsdstudy/p/18254695

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号