找回密码
 注册
查看: 566|回复: 0

Kubernetes使用Ceph(rbd cephfs)作为Pod存储

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-7-27 11:50:08 | 显示全部楼层 |阅读模式
5.5 Kubernetes使用Ceph作为Pod存储[color=var(--theme-color)]#ceph-csi版本kubernetes版本ceph版本
) `+ w4 O6 u, C) o2 e3 r" ycephcsi:v3.2.2v1.20.415.2.15 octopus (stable)
( d' H$ Z9 C& l/ U1 PV 与 PVC 概述[color=var(--theme-color)]#
(1) PersistentVolume(PV) 持久卷
对外部存储资源创建和使用的抽象,使得存储作为集群中的资源管理,PV又分为静态供给和动态供给,由于静态供给需要提前创建一堆PV,维护成本1 `) E7 r2 V" m9 A" g8 D
较高,所以企业一般使用动态供给。
(2)  PersistentVolumeClaim(PVC)持久卷申请
让用户不需要关心具体的Volume实现细节,只需要定义PVC需要多少磁盘容量即可。
(3) PV动态供给工作流程
[color=var(--theme-color)]
动态供给主要是能够自动帮你创建pv,需要多大的空间就创建多大的pv,k8s帮助创建pv,pvc就直接使用api调用存储类来寻找pv。
- R% I3 r% b+ _* A) z& S如果是存储静态供给的话,会需要我们手动去创建pv,而动态供给主要的一个实现就是StorageClass存储对象,其实它就是声明你使用哪
- _8 T3 C* [. s# a3 d6 Z个存储,然后帮你去连接,再帮你去自动创建pv。如果没有足够的资源,找不到合适的pv,那么pod就会处于pending等待的状态。
% E# ~6 A3 a7 a4 ^; m8 ?
( R' `2 [* h2 h. h3 [* xPersistentVolume 子系统为用户和管理员提供了一组 API,将存储如何供应的细节从其如何被使用中抽象出来。为了实现这点,引入了一些新的资源
0 b7 f; \) h6 J3 z. I8 b$ G  a和概念:$ Y8 y! J# A, l% G  w" X& X3 ~& X: Y% E
# PV(PersistentVolume,持久卷)+ n9 Q1 a8 S3 B) l& w
是集群中的一块存储,可以由管理员事先供应,或者使用存储类(StorageClass)来动态供应。持久卷是集群资源,就像节点也是集群资源一样。" B0 l5 h3 M  k2 ?) S% a* P+ U
# PVC(PersistentVolumeClaim,持久卷申领), C% i! L( _2 D# A* n" N. m3 o
表达的是用户对存储的请求,PVC申领请求特定的大小和访问模式的PV卷。
: g( p! W: n! X- a  l# StorageClass(存储类)
8 H: ~' t" _. J) a* n, b1 o" a集群管理员需要能够提供不同性质的PersistentVolume,并且这些PV卷之间的差别不仅限于卷大小和访问模式,同时又不能将卷是如何实现的这些细节
( E! j: ~  ]  b. u暴露给用户,为了满足这类需求,就有了存储类(StorageClass)资源。
5 C! N0 \: o) G* `% w/ A' \" F# volume
# X; U6 ^' H) v5 S4 T! o) J5 ?
卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。2 ceph-csi 自动供给程序[color=var(--theme-color)]#ceph-csi是ceph官方维护的PV供给程序,专门用于在Kubernetes中使用RBD、CephFS为Pod提供存储。
/ B( m& N; G% j, n5 u$ h
项目地址: https://github.com/ceph/ceph-csi3 Pod使用RBD块存储[color=var(--theme-color)]#
[color=var(--theme-color)]
(1) 关于部署,RBD YAML文件在"deploy/rbd/kubernetes"目录,需要做如下改动
1) 全部统一命名空间到 ceph-csi
2 W) u( Z, U- ^. d. D* _/ {8 j& f2) 将镜像转存到 docker hub (由于使用的镜像在国外,国内无法下载,先FQ将其下载后放再放到docker hub上)  t7 E4 U8 ]. x/ k
3) 增加 secret.yaml 和 storageclass.yaml 文件
4 F* H' R5 @8 C& J% c) p5 N
4) 将 csi-rbdplugin-provisioner.yaml 和 csi-rbdplugin.yaml 中关于 kms 的配置注释掉
(2) 在使用中,还需要根据自己集群环境修改
1) csi-config-map.yaml 修改连接ceph集群信息
5 i7 h9 {5 }  i8 m2) secret.yaml 修改秘钥. a. o: Z8 {. ?) Y1 O8 {8 P
3) storageclass.yaml 修改集群ID和存储池
(3) 部署
[color=var(--theme-color)][url=][/url]" q+ ^2 ?3 r# o. b3 r, e% f
1) 从github上下载的yaml文件如下所示,然后全部统一命名空间到 ceph-csi[root@k8s-master1 rbd]# ls -ltotal 36-rw-rw-r-- 1 root root  331 Jun 18 17:39 csi-config-map.yaml-rw-rw-r-- 1 root root 1711 Jun 18 17:42 csi-nodeplugin-psp.yaml-rw-rw-r-- 1 root root  603 Jun 18 17:41 csi-nodeplugin-rbac.yaml-rw-rw-r-- 1 root root 1337 Jun 18 17:43 csi-provisioner-psp.yaml-rw-rw-r-- 1 root root 2923 Jun 18 17:41 csi-provisioner-rbac.yaml-rw-rw-r-- 1 root root 6876 Jun 18 17:42 csi-rbdplugin-provisioner.yaml-rw-rw-r-- 1 root root 5630 Jun 18 17:42 csi-rbdplugin.yaml2) 将镜像转存到 docker hubcsi-rbdplugin-provisioner.yamlcsi-rbdplugin.yaml3) 增加 secret.yaml 和 storageclass.yaml 文件[root@k8s-master1 rbd]# cat > secret.yaml << EOFapiVersion: v1kind: Secretmetadata:  name: csi-rbd-secret  namespace: ceph-csi stringData:  userID: admin  userKey: AQDwAsxgatvdARAAkf2inKyubNr/IbzgPhJyGg== EOF[root@k8s-master1 rbd]# cat > storageclass.yaml << EOFapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:   name: csi-rbd-scprovisioner: rbd.csi.ceph.comparameters:   clusterID: 57026ab3-a596-4c79-a33a-08c37153d462    pool: rbd-k8s    imageFeatures: layering   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret   csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi   csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret   csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret   csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi   csi.storage.k8s.io/fstype: ext4reclaimPolicy: DeleteallowVolumeExpansion: truemountOptions:   - discardEOF4) 将 csi-rbdplugin-provisioner.yaml 和 csi-rbdplugin.yaml 中关于 kms 的配置注释掉[root@k8s-master1 rbd]# grep kms csi-rbdplugin-provisioner.yaml#- name: ceph-csi-encryption-kms-config#  mountPath: /etc/ceph-csi-encryption-kms-config/#- name: ceph-csi-encryption-kms-config#    name: ceph-csi-encryption-kms-config[root@k8s-master1 rbd]# grep kms csi-rbdplugin.yaml#- name: ceph-csi-encryption-kms-config#  mountPath: /etc/ceph-csi-encryption-kms-config/#- name: ceph-csi-encryption-kms-config#    name: ceph-csi-encryption-kms-config[root@k8s-master1 rbd]# 5) csi-config-map.yaml 修改连接ceph集群信息# 修改连接Ceph集群的clusterID和monitors的地址[root@k8s-master1 rbd]# vim csi-config-map.yaml---apiVersion: v1kind: ConfigMapdata:  config.json: |-    [      {        "clusterID": "14912382-3d84-4cf2-9fdb-eebab12107d8",        "monitors": [          "172.16.1.31:6789",          "172.16.1.32:6789",          "172.16.1.33:6789"        ]      }    ]metadata:  name: ceph-csi-config  namespace: ceph-csi注: 获取ceph集群clusterID的方法为[root@ceph-deploy ~]# ceph -s | grep idid:     14912382-3d84-4cf2-9fdb-eebab12107d86) secret.yaml 修改秘钥# 修改userKey[root@k8s-master1 rbd]# vim secret.yamlapiVersion: v1kind: Secretmetadata:  name: csi-rbd-secret  namespace: ceph-csi stringData:  userID: admin  userKey: AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==注: 获取ceph集群admin密钥的方法为[root@ceph-deploy ~]# ceph auth list | egrep "admin|key"client.adminkey: AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==7) storageclass.yaml 修改集群ID和存储池# 修改clusterID和pool参数[root@k8s-master1 rbd]# vim storageclass.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:   name: csi-rbd-scprovisioner: rbd.csi.ceph.comparameters:   clusterID: 14912382-3d84-4cf2-9fdb-eebab12107d8   pool: rbd-k8s   imageFeatures: layering   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret   csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi   csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret   csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret   csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi   csi.storage.k8s.io/fstype: ext4reclaimPolicy: DeleteallowVolumeExpansion: truemountOptions:   - discard注: 在ceph集群中创建rbd存储池的方法[root@ceph-deploy ~]# ceph osd pool create rbd-k8s 64 64[root@ceph-deploy ~]# ceph osd pool application enable rbd-k8s rbd[root@ceph-deploy ~]# ceph osd pool ls detail[root@ceph-deploy ~]# rbd ls rbd-k8s  # 列表中没有创建任何rbd块设备8) 应用yaml文件[root@k8s-master1 rbd]# kubectl create namespace ceph-csi  # 创建ceph-csi命名空间[root@k8s-master1 rbd]# ls | xargs -i kubectl apply -f {}[color=var(--theme-color)][url=][/url]
2 a+ A, _" v7 H7 N: m9 {- l
) _  \1 d, b2 J* l% A0 C0 F" U& g5 |

3 b. ?& B- F4 b- f6 p6 B5 }3 \7 @9 x
(4) 检查
[root@k8s-master1 rbd]# kubectl get sc
# ^/ u% i$ `* b0 yNAME         PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
" _+ R. D) I% \9 ~( b" ocsi-rbd-sc   rbd.csi.ceph.com   Delete         Immediate           true                   3m33s6 `% l' X+ Q# U# g

. \; ?, L- M/ f$ D( C[root@k8s-master1 rbd]# kubectl get pod -o wide -n ceph-csi
4 d+ X% b9 S) ?- m% g# LNAME                                     READY   STATUS   RESTARTS   AGE     IP               NODE         
2 G/ S0 a; O/ H; f7 l$ T6 h6 p6 acsi-rbdplugin-95bs4                       3/3     Running   0         6m31s   172.16.1.82     k8s-master2   
5 Z9 p1 x; j/ ]6 G' ^* Ncsi-rbdplugin-b9qnd                       3/3     Running   0         6m31s   172.16.1.81     k8s-master1   
' }, h0 g1 K+ r: M3 D6 Wcsi-rbdplugin-pb82h                       3/3     Running   0         6m31s   172.16.1.84     k8s-node2     
# H* _8 v) M2 Y& l4 tcsi-rbdplugin-provisioner-fc66bb6-rvhcd   7/7     Running   0         6m31s   172.27.169.138   k8s-node2     
; m' Q# p: b8 K( n5 v* i7 ]csi-rbdplugin-provisioner-fc66bb6-tgkpj   7/7     Running   0         6m31s   172.27.36.68     k8s-node1     
  o0 z* {8 d$ j& |csi-rbdplugin-provisioner-fc66bb6-wclzw   7/7     Running   0         6m31s   172.27.159.135   k8s-master1   
3 x: n0 A- l& ^. ncsi-rbdplugin-trffn                       3/3     Running   0         6m31s   172.16.1.83     k8s-node1     6 G3 x# V$ T! E  J1 c
[root@k8s-master1 rbd]#
1 X& w* k. W; S6 h* J8 I4 x1 @0 i5 {) U* P  u5 H9 c2 t
# 可以看到ceph pv自动供给应用部署正常
(5) 测试
[color=var(--theme-color)][url=][/url]
, r$ c& W6 G. S" U; ~; d. b# |[root@k8s-master1 ceph-dir]# cat > rbd-pod-test.yaml << EOFapiVersion: v1kind: Podmetadata:  name: ceph-rbd-testspec:  containers:  - name: nginx    image: nginx:latest    volumeMounts:      - name: www         mountPath: /usr/share/nginx/html   volumes:  - name: www     persistentVolumeClaim:      claimName: ceph-rbd-test---apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: ceph-rbd-testspec:  accessModes:    - ReadWriteOnce  storageClassName: csi-rbd-sc    resources:    requests:      storage: 10GiEOF2) 应用yaml文件[root@k8s-master1 ceph-dir]# kubectl apply -f rbd-pod-test.yaml -n default3) 查看pod[root@k8s-master1 ceph-dir]# kubectl get pod -o wide -n defaultNAME            READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE   READINESS GATESceph-rbd-test   1/1     Running   0          36s   172.27.224.24   k8s-master2   <none>           <none>4) 在ceph集群中查看rbd列表[root@ceph-deploy ~]# rbd ls rbd-k8scsi-vol-9fb06274-5d6e-11ec-8295-9e604dd3c50f[root@ceph-deploy ~]# rbd info rbd-k8s/csi-vol-9fb06274-5d6e-11ec-8295-9e604dd3c50frbd image 'csi-vol-9fb06274-5d6e-11ec-8295-9e604dd3c50f':    size 10 GiB in 2560 objects    order 22 (4 MiB objects)    snapshot_count: 0    id: 47d8d58a5c095    block_name_prefix: rbd_data.47d8d58a5c095    format: 2    features: layering    op_features:     flags:     create_timestamp: Wed Dec 15 14:17:04 2021    access_timestamp: Wed Dec 15 14:17:04 2021    modify_timestamp: Wed Dec 15 14:17:04 20215) 进入测试pod内查看挂载信息# 可以看到"ceph-rbd-test"容器内挂载了10G的硬盘rbd0到"/usr/share/nginx/html"目录上[root@k8s-master1 ceph-dir]# kubectl exec -it pod/ceph-rbd-test -n default -- bashroot@ceph-rbd-test:/# lsblk NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTsda      8:0    0   60G  0 disk |-sda1   8:1    0  200M  0 part |-sda2   8:2    0    2G  0 part `-sda3   8:3    0 57.8G  0 part /etc/hostssr0     11:0    1 1024M  0 rom  rbd0   253:0    0   10G  0 disk /usr/share/nginx/htmlroot@ceph-rbd-test:/# exit6) 查看pv、pvc信息[root@k8s-master1 ceph-dir]# kubectl get pvc -o wide -n default[root@k8s-master1 ceph-dir]# kubectl get pv -o wide[root@k8s-master1 ceph-dir]# kubectl describe pvc/ceph-rbd-test -n default[root@k8s-master1 ceph-dir]# kubectl describe pv/pvc-fe43b3cd-a8a3-4642-9c50-208f675973f7[color=var(--theme-color)][url=][/url]
! E" ?; {/ K6 H$ B( G0 I

) `% L1 ?% ~4 F  ]' e  `
$ p/ o1 }7 l0 ~* [
3 k7 ]+ w4 P- z( l6 x
7 m( @& V6 O; X- i' z+ |
图示:[color=var(--theme-color)]
7) 在线扩容功能1 N2 D7 H4 O2 Y3 _0 h
当修改rbd-pod-test.yaml文件中pvc的需求大小为20G后再应用,相应的ceph集群的rbd块会自动扩容,但不支持缩容的操作。
4 pod使用CephFS文件存储[color=var(--theme-color)]#
[color=var(--theme-color)]
(1) 关于部署,CephFS YAML文件在"deploy/cephfs/kubernetes"目录,部署时YAML文件需做如下改动
1) 全部统一命名空间到ceph-csi-cephfs9 g9 l* N/ f* z- u: R
2) 将镜像转存到docker hub
3 ^4 w) d" t: _) D3) 增加secret.yaml和storageclass.yaml文件
(2) 在使用中,还需要根据自己集群环境修改
1) csi-config-map.yaml 修改连接ceph集群信息
" r7 L( h/ P, b; O% ]1 l) F0 z! e2) secret.yaml 修改秘钥2 ^9 L) V# ]1 b+ D
3) storageclass.yaml 修改集群ID和文件系统名称
(3) 部署
[color=var(--theme-color)][url=][/url]
  l  [' p; ~% K$ Q1) 从github上下载的yaml文件如下所示,然后全部统一命名空间到 ceph-csi-cephfs[root@k8s-master1 cephfs]# ls -ltotal 36-rw-rw-r-- 1 root root 5615 Jun 18 19:20 csi-cephfsplugin-provisioner.yaml-rw-rw-r-- 1 root root 5421 Jun 18 19:20 csi-cephfsplugin.yaml-rw-rw-r-- 1 root root  338 Jun 18 19:20 csi-config-map.yaml-rw-rw-r-- 1 root root 1760 Jun 18 19:20 csi-nodeplugin-psp.yaml-rw-rw-r-- 1 root root  646 Jun 18 19:20 csi-nodeplugin-rbac.yaml-rw-rw-r-- 1 root root 1383 Jun 18 19:20 csi-provisioner-psp.yaml-rw-rw-r-- 1 root root 3017 Jun 18 19:20 csi-provisioner-rbac.yaml2) 将镜像转存到docker hubcsi-cephfsplugin-provisioner.yamlcsi-cephfsplugin.yaml3) 增加secret.yaml和storageclass.yaml文件[root@k8s-master1 cephfs]# cat > secret.yaml << EOFapiVersion: v1kind: Secretmetadata:  name: csi-cephfs-secret  namespace: ceph-csi-cephfs stringData:  adminID: admin  adminKey: AQDwAsxgatvdARAAkf2inKyubNr/IbzgPhJyGg== EOF[root@k8s-master1 cephfs]# cat > storageclass.yaml << EOFapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:   name: csi-cephfs-scprovisioner: cephfs.csi.ceph.comparameters:   clusterID: 57026ab3-a596-4c79-a33a-08c37153d462    pool: cephfs_data    fsName: cephfs   csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret   csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-cephfs   csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret   csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-cephfs   csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret   csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-cephfsreclaimPolicy: DeleteallowVolumeExpansion: truemountOptions:   - discardEOF4) csi-config-map.yaml 修改连接ceph集群信息# 修改连接Ceph集群的clusterID和monitors的地址[root@k8s-master1 cephfs]# vim csi-config-map.yaml---apiVersion: v1kind: ConfigMapdata:  config.json: |-    [      {        "clusterID": "14912382-3d84-4cf2-9fdb-eebab12107d8",        "monitors": [          "172.16.1.31:6789",          "172.16.1.32:6789",          "172.16.1.33:6789"        ]      }    ]metadata:  name: ceph-csi-config  namespace: ceph-csi-cephfs注: 获取ceph集群clusterID的方法为[root@ceph-deploy ~]# ceph -s | grep idid:     14912382-3d84-4cf2-9fdb-eebab12107d85) secret.yaml 修改秘钥# 修改adminKey[root@k8s-master1 cephfs]# vim secret.yamlapiVersion: v1kind: Secretmetadata:  name: csi-cephfs-secret  namespace: ceph-csi-cephfs stringData:  adminID: admin  adminKey: AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==注: 获取ceph集群admin密钥的方法为[root@ceph-deploy ~]# ceph auth list | egrep "admin|key"client.adminkey: AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==6) storageclass.yaml 修改集群ID和文件系统名称# 修改clusterID、pool、fsName参数[root@k8s-master1 cephfs]# vim storageclass.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:   name: csi-cephfs-scprovisioner: cephfs.csi.ceph.comparameters:   clusterID: 14912382-3d84-4cf2-9fdb-eebab12107d8   pool: cephfs_data   fsName: cephfs   csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret   csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-cephfs   csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret   csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-cephfs   csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret   csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-cephfsreclaimPolicy: DeleteallowVolumeExpansion: truemountOptions:   - discard注: 在ceph集群中创建rbd存储池的方法# 部署MDS服务首先要创建两个pool,一个是cephfs-data,一个是cephfs-metadate,分别存储文件数据和文件元数据,这个pg也可以设置小一点,这个根据OSD去配置。# cd /root/my-cluster/# ceph-deploy mds create ceph-node01 ceph-node02 ceph-node03# ceph mds stat  # 查看mds节点状态3 up:standby# 创建存储池# ceph osd pool create cephfs_data 64 64# ceph osd pool create cephfs_metadata 64 64# ceph osd pool lsdevice_health_metricsrbd-k8scephfs_datacephfs_metadata# 创建文件系统格式: ceph fs new <fs_name> <metadata> <data># ceph fs new cephfs cephfs_metadata cephfs_data# ceph fs ls    # 查看创建后的cephfsname: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]7) 应用yaml文件[root@k8s-master1 cephfs]# kubectl create namespace ceph-csi-cephfs  # 创建ceph-csi-cephfs命名空间[root@k8s-master1 cephfs]# ls | xargs -i kubectl apply -f {}[color=var(--theme-color)][url=][/url]

1 S2 y8 w! W; G6 ^

8 ?# W& C3 F0 ~8 p5 {% L3 d+ k7 W5 N! i" f0 O! R' g" x: o4 v
* m7 l5 L( l" w) i8 g! X
# A6 N4 p" X; o4 Z
(4) 检查
[root@k8s-master1 cephfs]# kubectl get sc
) ?* E( \0 s' y' k/ A, k6 uNAME            PROVISIONER           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE0 w) r6 h3 D  z: R' T! X
csi-cephfs-sc   cephfs.csi.ceph.com   Delete          Immediate           true                   2m44s5 W( J/ B5 {4 T, ]- X% L9 e: D

  P( s7 G) w+ }4 }; s) {* V  z8 D% B[root@k8s-master1 cephfs]# kubectl get pod -o wide -n ceph-csi-cephfs
) I! E4 U# r1 S: a* A7 QNAME                                            READY   STATUS    RESTARTS   AGE     IP               NODE      
" x$ k7 P+ W3 L  h, D. ^9 s7 vcsi-cephfsplugin-7kv9h                          3/3     Running   0          5m35s   172.16.1.84      k8s-node2  
* N$ L2 a& a5 d$ l+ L( ?/ Xcsi-cephfsplugin-8zh5x                          3/3     Running   0          5m35s   172.16.1.83      k8s-node1  ! S& ^, s* X' o7 k! V% ?
csi-cephfsplugin-provisioner-7c454885fc-5xkm7   6/6     Running   0          5m33s   172.27.159.149   k8s-master1
4 F4 ]/ {2 L8 g& R+ `/ y  b5 icsi-cephfsplugin-provisioner-7c454885fc-75rn4   6/6     Running   0          5m33s   172.27.36.76     k8s-node1  8 G. n0 [' |' o' s! b* }
csi-cephfsplugin-provisioner-7c454885fc-wc6lv   6/6     Running   0          5m33s   172.27.169.154   k8s-node2  
8 x$ H. n6 Y# O3 z" B7 A3 ucsi-cephfsplugin-skwnh                          3/3     Running   0          5m35s   172.16.1.82      k8s-master2
1 k1 u4 i, T) n3 ?$ q7 m1 c6 u, J, Fcsi-cephfsplugin-vxlj5                          3/3     Running   0          5m35s   172.16.1.81      k8s-master1; Q$ {) J4 [; T& c( Q# O6 j& y
0 F$ v* Z& G) m( T6 @+ j$ q- |
# 可以看到ceph pv自动供给应用部署正常
(5) 测试
[color=var(--theme-color)][url=][/url]& @# ]: z! e3 m' {6 Y; T' O' e
1) 测试yaml文件[root@k8s-master1 ceph-dir]# cat > cephfs-deployment-test.yaml << EOFapiVersion: apps/v1kind: Deploymentmetadata:  name: cephfs-pod-test spec:  replicas: 3  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx        volumeMounts:          - name: www             mountPath: /usr/share/nginx/html       volumes:      - name: www         persistentVolumeClaim:          claimName: ceph-cephfs-test---apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: ceph-cephfs-testspec:  accessModes:    - ReadWriteMany   storageClassName: csi-cephfs-sc    resources:    requests:      storage: 10GiEOF2) 应用yaml文件[root@k8s-master1 ceph-dir]# kubectl apply -f cephfs-deployment-test.yaml -n default3) 查看pod[root@k8s-master1 ceph-dir]# kubectl get pod -o wide -n defaultNAME                               READY   STATUS    RESTARTS   AGE    IP              NODE       cephfs-pod-test-5d95fd8858-crjh8   1/1     Running   0          111s   172.27.224.26   k8s-master2cephfs-pod-test-5d95fd8858-dv96p   1/1     Running   0          111s   172.27.224.25   k8s-master2cephfs-pod-test-5d95fd8858-rlsw7   1/1     Running   0          111s   172.27.224.27   k8s-master24) 在ceph集群中查看cephfs信息# 命令行挂载cephfs文件系统[root@ceph-deploy ~]# mkdir -p /data/[root@ceph-deploy ~]# mount -t ceph 172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ /data -o \name=admin,secret=AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==# 查看volume,可以看到数据存储位置[root@ceph-deploy ~]# tree /data//data/└── volumes    ├── csi    │   └── csi-vol-c88b78ff-5d7f-11ec-8395-e64214c2d68a    │   └── 6ab0685a-7414-4edd-9561-28bed0406035    │   └── index.html    └── _csi:csi-vol-c88b78ff-5d7f-11ec-8395-e64214c2d68a.meta4 directories, 2 files5) 进入测试pod内查看挂载信息# 可以看到创建的3个pod共享了cephfs存储池[root@k8s-master1 ceph-dir]# kubectl exec -it pod/cephfs-pod-test-5d95fd8858-crjh8 -n default -- bashroot@cephfs-pod-test-5d95fd8858-crjh8:/# df -hTFilesystem     Type            Size  Used Avail Use% Mounted on......(省略的内容)ceph-fuse      fuse.ceph-fuse   10G     0   10G   0% /usr/share/nginx/htmlroot@cephfs-pod-test-5d95fd8858-crjh8:/# exitexit[root@k8s-master1 ceph-dir]# kubectl exec -it pod/cephfs-pod-test-5d95fd8858-dv96p -n default -- bashroot@cephfs-pod-test-5d95fd8858-dv96p:/# df -hTFilesystem     Type            Size  Used Avail Use% Mounted on......(省略的内容)ceph-fuse      fuse.ceph-fuse   10G     0   10G   0% /usr/share/nginx/htmlroot@cephfs-pod-test-5d95fd8858-dv96p:/# exitexit[root@k8s-master1 ceph-dir]# kubectl exec -it pod/cephfs-pod-test-5d95fd8858-rlsw7 -n default -- bashroot@cephfs-pod-test-5d95fd8858-rlsw7:/# df -hTFilesystem     Type            Size  Used Avail Use% Mounted on......(省略的内容)ceph-fuse      fuse.ceph-fuse   10G     0   10G   0% /usr/share/nginx/htmlroot@cephfs-pod-test-5d95fd8858-rlsw7:/# exitexit[root@k8s-master1 ceph-dir]# 6) 查看pv、pvc信息[root@k8s-master1 ceph-dir]# kubectl get pvc -o wide -n default[root@k8s-master1 ceph-dir]# kubectl get pv -o wide[root@k8s-master1 ceph-dir]# kubectl describe pvc/ceph-cephfs-test -n default[root@k8s-master1 ceph-dir]# kubectl describe pv/pvc-92064e70-8b2d-4abf-a705-4b51fb2a7ded[color=var(--theme-color)][url=][/url]

# t) R& h2 W3 l# q; |9 R% L

  z  Q! b. n! |7 z$ R- E" _- e+ X( l

/ @8 H! w4 {# u/ l+ V
7 l4 c- s4 l3 ]8 ]" M, R$ n, r
图示:[color=var(--theme-color)]
5 小结[color=var(--theme-color)]#
(1) 图示[color=var(--theme-color)]
(2) pvc,pv总结
官方文档:
( c& o6 n6 t: \; X1 w$ ?https://kubernetes.io/docs/conce ... lumes/#access-modes
6 [, D( |* _* m  M$ A1) pv独立于pod存在,pv是全局资源,pvc是局部资源(在pod使用的命名空间下)。
( Y# D9 B. m5 I4 f( V4 `- G  X. x: y! X
2) pv可以创建动态pv或者静态pv,动态pv不需要手动去创建,静态pv需要手动创建。
' b: `2 ?" h0 N! i) p
4 p' w# e) E, T9 [- r/ ~  I/ c8 k+ \3) 访问模式
8 P& B- d( V- k/ kReadWriteOnce     # 卷可以被一个节点以读写方式挂载。ReadWriteOnce访问模式也允许运行在同一节点上的多个Pod访问卷。0 f) N1 ]- I4 z7 z5 |0 e
ReadOnlyMany      # 卷可以被多个节点多个Pod以只读方式挂载。
' {5 n/ }$ c8 l) w) K% cReadWriteMany     # 卷可以被多个节点多个Pod以读写方式挂载。
9 C/ |: m; V3 AReadWriteOncePod  # 卷可以被单个Pod以读写方式挂载。如果你想确保整个集群中只有一个Pod可以读取或写入该PVC,请使用ReadWriteOncePod2 u' ~- ~1 h4 K; g- @2 Z
访问模式。这只支持CSI卷以及需要Kubernetes 1.22以上版本。
2 K/ @) d3 m6 i9 o' V# U
# W7 _* C" `$ J. ]8 R1 E- h! l在CLI中,访问模式缩写为 RWO - ReadWriteOnce、ROX - ReadOnlyMany、RWX - ReadWriteMany、RWOP - ReadWriteOncePod! h: }6 C! w& ^% N
' s0 v( E1 d5 _$ p
4) pv回收策略
% B; ^: c1 ^, q! ?当用户不再使用其存储卷时,他们可以从 API 中将 PVC 对象删除,从而允许该资源被回收再利用。PersistentVolume 对象的回收策略告诉集6 L( x  S" v( T- G  T) L% R
群,当其被从申领中释放时如何处理该数据卷,pv支持的回收策略有Retain、Recycle、Delete。pv静态供给和pv动态供给下,单独删除pod后
  G: ], P1 m* R- Kpvc不会被删除,使用"kubectl delete -f rbd-pod-test.yaml"或"kubectl delete pvc/pvcname"的方式会删除pvc。$ v/ w# |* A9 l
4 H/ Y3 }9 N- k, P
pvc被删除后pv根据pv回收策略对pv和资源进行相应的操作,单独操作pv(例如: 删除)不会对pv资源产生影响。nfs只支持Retain、Recycle策略,
. ]$ C! `' o. j" f2 U6 Lceph只支持Retain、Delete策略。
! Z2 ]- T; x+ U5 F4 A) p( D8 ?& U8 h( s4 T  d" d2 M
# Retain策略(保留,默认策略)1 U3 r6 ]/ |& w3 X' G7 Q/ a% V1 d
在删除pvc后PV变为Released不可用状态,若想重新被使用,需要管理员删除pv,重新创建pv,删除pv并不会删除存储的资源,只是删除pv对象而# X7 h3 A( `5 H3 T) R! L# t/ U
已,若想保留数据,请使用该Retain策略。
9 ?: s5 I; Y0 r/ I; S9 u8 _2 c( e) f回收策略Retain使得用户可以手动回收资源,当PersistentVolumeClaim对象被删除时,PersistentVolume卷仍然存在,对应的数据卷被视为2 n9 t5 t' E4 D7 S
"已释放(released)",由于卷上仍然存在着前一申领人的数据,该卷还不能用于其他申领,管理员可以通过手动回收该卷。使用命令编辑pv,删除
, R6 |7 S: c$ [: z/ W8 c- e绑定信息"claimRef:"下的"resourceVersion"和"uid"键,即可重新释放PV使其状态由Released变为Available(但是引用的pvc不变,删除. c# M$ R. j% L6 q
"claimRef:"的所有内容可以被其它pvc引用)编辑命令为"kubectl edit pv/pvname"。
$ v$ V4 ~/ M5 s& F" @1 y
8 V  D* \! {( ?8 X9 ^. _# Recycle策略(回收)! q- [! R% F# H7 Y  r
删除pvc自动清除pv中的数据,效果相当于执行 rm -rf /thevolume/*,删除pvc时pv的状态由Bound变为Available,此时可重新被pvc申请& C% ~0 \6 J' F
绑定。警告: 回收策略Recycle会被废弃,取而代之的建议方案是使用动态供应。
- Z! o8 T- i0 o
% I% ]' y2 @/ U6 i# Delete策略(删除)6 c; ]  M* {3 F( g6 n+ Q# G
在删除pvc后pv被删除并删除存储上的对应存储资源,例如AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume等。
) d( h/ G; O; c& w对于支持Delete回收策略的卷插件,删除动作会将PersistentVolume对象从Kubernetes中移除,同时也会从外部基础设施(如AWS EBS、GCE PD、8 b$ |* u  \1 A. _6 N* g* Z" N
Azure Disk、Cinder卷)中移除所关联的存储资产,动态供应的卷会继承其StorageClass中设置的回收策略,该策略默认为Delete,管理员需要根+ U& }9 N8 i) q) u) X5 e6 k" B6 A- }
据用户的期望来配置StorageClass,否则PV卷被创建之后必须要被编辑或者修改。
. u) i5 n' C/ ~- }7 h修改方法:0 H/ ?. J0 w' T0 B9 J
# kubectl edit pv/pvname. S+ X2 F$ Q; A7 Q# s% ^2 J; k; T
# kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
, y9 A* [! l$ ?' v/ A& _9 Q* x! Y7 v$ r* `3 P- ^8 m
5) storageClassName! i/ Q3 v# g) J
在pvc的请求存储大小和访问权限与创建的pv一致的情况下,根据storageClassName进行与pv绑定,常用在pvc需要和特定pv进行绑定的情况下。, ?0 w$ u& V7 w& K
例如,当有创建多个pv、pvc设置存储的大小和访问权限一致时,且pv、pvc没有配置storageClassName时,pvc会根据存储大小和访问权限去随+ y' D1 Y$ O# z: I3 \" q. h! P
机匹配,如果配置了storageClassName会根据这三个条件进行匹配,当然也可以用其他方法实现pvc与特定pv的绑定如标签。

* v1 Z5 v" D; `# K; f) [% J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:15 , Processed in 0.281857 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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