5.5 Kubernetes使用Ceph作为Pod存储[color=var(--theme-color)]#ceph-csi版本kubernetes版本ceph版本 [# w7 O; X0 o8 d7 {7 I: j' p
cephcsi:v3.2.2v1.20.415.2.15 octopus (stable)
/ s9 u5 [- P; l1 PV 与 PVC 概述[color=var(--theme-color)]#(1) PersistentVolume(PV) 持久卷 对外部存储资源创建和使用的抽象,使得存储作为集群中的资源管理,PV又分为静态供给和动态供给,由于静态供给需要提前创建一堆PV,维护成本
6 Q0 T% \+ w% |- N0 o- C# x3 g较高,所以企业一般使用动态供给。(2) PersistentVolumeClaim(PVC)持久卷申请 让用户不需要关心具体的Volume实现细节,只需要定义PVC需要多少磁盘容量即可。(3) PV动态供给工作流程 [color=var(--theme-color)] 动态供给主要是能够自动帮你创建pv,需要多大的空间就创建多大的pv,k8s帮助创建pv,pvc就直接使用api调用存储类来寻找pv。( i* V* T/ s; v X' l' j; J
如果是存储静态供给的话,会需要我们手动去创建pv,而动态供给主要的一个实现就是StorageClass存储对象,其实它就是声明你使用哪
5 Y9 W3 D+ S! q' A& q' x( O' B个存储,然后帮你去连接,再帮你去自动创建pv。如果没有足够的资源,找不到合适的pv,那么pod就会处于pending等待的状态。9 ^6 R( V4 X$ k. b
9 H- G. w8 ?, m& B' i" S$ D
PersistentVolume 子系统为用户和管理员提供了一组 API,将存储如何供应的细节从其如何被使用中抽象出来。为了实现这点,引入了一些新的资源
/ H( U4 }; {" i9 ^& P9 Y$ U和概念:
0 S9 J6 Z+ a; O4 b/ \# PV(PersistentVolume,持久卷)7 M2 s) w. w* z$ k/ r& A
是集群中的一块存储,可以由管理员事先供应,或者使用存储类(StorageClass)来动态供应。持久卷是集群资源,就像节点也是集群资源一样。
+ o# w8 ^. z( b$ @/ Z1 I# PVC(PersistentVolumeClaim,持久卷申领)
1 D o( M4 R" l0 E+ N6 }表达的是用户对存储的请求,PVC申领请求特定的大小和访问模式的PV卷。 c& h3 Z3 y' V$ `
# StorageClass(存储类)- X0 r/ y$ v% E( D" Q
集群管理员需要能够提供不同性质的PersistentVolume,并且这些PV卷之间的差别不仅限于卷大小和访问模式,同时又不能将卷是如何实现的这些细节# B0 m( d! h; g1 L) A
暴露给用户,为了满足这类需求,就有了存储类(StorageClass)资源。 A$ i7 |( x# o$ l/ T) S, Y
# volume
A9 S$ t) G" L" @! u9 O卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。2 ceph-csi 自动供给程序[color=var(--theme-color)]#ceph-csi是ceph官方维护的PV供给程序,专门用于在Kubernetes中使用RBD、CephFS为Pod提供存储。3 S" A2 n) w6 X2 R* p
项目地址: 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
( \' |+ ]0 w ~# @2 o- C2) 将镜像转存到 docker hub (由于使用的镜像在国外,国内无法下载,先FQ将其下载后放再放到docker hub上)& R$ c$ L; `& b/ G# a1 Z
3) 增加 secret.yaml 和 storageclass.yaml 文件3 L: }5 l: ~% ?) n' [
4) 将 csi-rbdplugin-provisioner.yaml 和 csi-rbdplugin.yaml 中关于 kms 的配置注释掉(2) 在使用中,还需要根据自己集群环境修改 1) csi-config-map.yaml 修改连接ceph集群信息
+ x& f1 l8 W2 n6 |& I/ x$ {$ |7 N% g2) secret.yaml 修改秘钥+ R( r7 s9 Q( h6 g& C3 r
3) storageclass.yaml 修改集群ID和存储池(3) 部署 [color=var(--theme-color)][url=] [/url]. {- [5 I% \: y# l q& k" z! N
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]/ G: W! V; K/ b7 n0 j2 _
! W3 n! L4 ~2 v* S# l( Y W9 L. m# h5 Q
(4) 检查 [root@k8s-master1 rbd]# kubectl get sc
- }# x' u8 m' }* i) q6 M( i& H* s$ HNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
" G6 i3 n/ ^6 J8 Z, L% Z" Ncsi-rbd-sc rbd.csi.ceph.com Delete Immediate true 3m33s
" \4 o) o: k: W+ M7 n( e
3 L& X5 n1 g, m G9 Z5 j[root@k8s-master1 rbd]# kubectl get pod -o wide -n ceph-csi
' l% [ M/ E" ^3 X) qNAME READY STATUS RESTARTS AGE IP NODE # p8 ]9 n" I0 `2 Z
csi-rbdplugin-95bs4 3/3 Running 0 6m31s 172.16.1.82 k8s-master2
7 ~- _6 H) H/ }$ Y! k5 f" t# |# Z2 Hcsi-rbdplugin-b9qnd 3/3 Running 0 6m31s 172.16.1.81 k8s-master1
( Z1 d+ B5 P: u0 Q$ }: D: Kcsi-rbdplugin-pb82h 3/3 Running 0 6m31s 172.16.1.84 k8s-node2 9 Q. |" ^6 ]* G; S
csi-rbdplugin-provisioner-fc66bb6-rvhcd 7/7 Running 0 6m31s 172.27.169.138 k8s-node2 8 {2 j% k. D, f/ |$ E9 ^/ j
csi-rbdplugin-provisioner-fc66bb6-tgkpj 7/7 Running 0 6m31s 172.27.36.68 k8s-node1 8 e/ A9 |, \% X4 ]- v
csi-rbdplugin-provisioner-fc66bb6-wclzw 7/7 Running 0 6m31s 172.27.159.135 k8s-master1 4 X( s6 ?( [2 A( t- i
csi-rbdplugin-trffn 3/3 Running 0 6m31s 172.16.1.83 k8s-node1 & o/ p E* ?$ C' ^+ C. ?4 z
[root@k8s-master1 rbd]#
2 |( j& L2 _) q! m" M# u% {7 ]2 L* f2 y5 H, t- y
# 可以看到ceph pv自动供给应用部署正常(5) 测试 [color=var(--theme-color)][url=] [/url]( N u: p, [" U! e0 o+ K
[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]5 ^; p' o0 c; N' r
' q3 i, I+ L; v; ~3 `7 R8 x
/ T1 d2 P6 f! e g5 V; E$ p7 V: V8 l1 S1 K
2 J' A# K S7 B* A1 }9 q- E( t图示:[color=var(--theme-color)] 7) 在线扩容功能2 c6 V$ l: y t+ f. L% E
当修改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-cephfs5 F. w# l- ?/ y7 u1 u4 B* W! Y
2) 将镜像转存到docker hub
8 ~) }6 L' T/ b& J0 ~3) 增加secret.yaml和storageclass.yaml文件(2) 在使用中,还需要根据自己集群环境修改 1) csi-config-map.yaml 修改连接ceph集群信息1 ~( n$ V! M {9 U
2) secret.yaml 修改秘钥
Q' t6 ]! T; S6 ^& c3) storageclass.yaml 修改集群ID和文件系统名称(3) 部署 [color=var(--theme-color)][url=] [/url]4 V$ ~0 q! w( v
1) 从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]5 J& }' W! v9 [, f
/ X+ n& Z+ Y- i+ z E! i. D/ ?" B3 O% U, A
$ W9 N8 d2 R. L; R7 u
' L8 t9 w1 r: w(4) 检查 [root@k8s-master1 cephfs]# kubectl get sc
s2 E3 Y* p" @9 |, j7 _; c- zNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE3 E& o/ @ ~5 `9 G# V/ p
csi-cephfs-sc cephfs.csi.ceph.com Delete Immediate true 2m44s
+ e& g3 F7 B$ o/ S& ]( t
3 Y" k" I# w7 z# a% N[root@k8s-master1 cephfs]# kubectl get pod -o wide -n ceph-csi-cephfs
! a! B6 a3 B6 L2 J. KNAME READY STATUS RESTARTS AGE IP NODE
3 M+ ~1 P9 b+ X( n2 Ncsi-cephfsplugin-7kv9h 3/3 Running 0 5m35s 172.16.1.84 k8s-node2 2 P5 M, g. J8 K' Z! v" r
csi-cephfsplugin-8zh5x 3/3 Running 0 5m35s 172.16.1.83 k8s-node1 3 P2 I! P6 o; i* u5 {+ G
csi-cephfsplugin-provisioner-7c454885fc-5xkm7 6/6 Running 0 5m33s 172.27.159.149 k8s-master11 V' i D( M9 O: Y
csi-cephfsplugin-provisioner-7c454885fc-75rn4 6/6 Running 0 5m33s 172.27.36.76 k8s-node1
, H0 t$ p* D8 J1 d( Z# ~csi-cephfsplugin-provisioner-7c454885fc-wc6lv 6/6 Running 0 5m33s 172.27.169.154 k8s-node2 $ ]- G( n8 H0 G0 o3 F9 ~) d
csi-cephfsplugin-skwnh 3/3 Running 0 5m35s 172.16.1.82 k8s-master24 ?2 S: k% f, m7 [
csi-cephfsplugin-vxlj5 3/3 Running 0 5m35s 172.16.1.81 k8s-master1
" M$ r0 Z: [6 H1 j5 R3 W
" N7 i( K% h5 U Y& e# 可以看到ceph pv自动供给应用部署正常(5) 测试 [color=var(--theme-color)][url=] [/url]/ C- e4 \ e8 t
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]
- g3 ^7 b5 R' o, F# [, |. g4 R- |$ H4 ]9 k+ b3 s# f
" w& ^# g8 _2 g3 h+ V3 x' S" h
8 @& W1 ~& D& ]9 D* o% ]: n% W3 r0 I/ B/ u
图示:[color=var(--theme-color)] 5 小结[color=var(--theme-color)]#(1) 图示[color=var(--theme-color)] (2) pvc,pv总结 官方文档:5 C' {8 ^1 |$ }1 [
https://kubernetes.io/docs/conce ... lumes/#access-modes
- t/ D* B$ H3 t: y! @2 I& Y4 _' k/ T1) pv独立于pod存在,pv是全局资源,pvc是局部资源(在pod使用的命名空间下)。; v& }+ l( f& Z. V
) R+ c) T: n% S8 o# t% R) Y/ N
2) pv可以创建动态pv或者静态pv,动态pv不需要手动去创建,静态pv需要手动创建。
# f- R3 E- b3 S7 c# ^7 F
/ ~" H o# t# K( w! V5 ~) F% B3) 访问模式
* F$ T' W" \1 w5 kReadWriteOnce # 卷可以被一个节点以读写方式挂载。ReadWriteOnce访问模式也允许运行在同一节点上的多个Pod访问卷。
4 E: _, m4 o7 |9 V! KReadOnlyMany # 卷可以被多个节点多个Pod以只读方式挂载。
6 g4 [- A- V) B: x9 J/ l5 a$ VReadWriteMany # 卷可以被多个节点多个Pod以读写方式挂载。2 `0 ]& x4 p$ I( Y! J; u5 u5 y' E
ReadWriteOncePod # 卷可以被单个Pod以读写方式挂载。如果你想确保整个集群中只有一个Pod可以读取或写入该PVC,请使用ReadWriteOncePod6 n5 h9 i* z7 W' K7 ]+ d* Y) U8 Y- n
访问模式。这只支持CSI卷以及需要Kubernetes 1.22以上版本。$ I8 W( }) e7 B9 w, j: s
" F8 E" _+ [+ P+ u& q* e
在CLI中,访问模式缩写为 RWO - ReadWriteOnce、ROX - ReadOnlyMany、RWX - ReadWriteMany、RWOP - ReadWriteOncePod
" ]6 @/ U) A' @$ k1 F
( s6 m B8 i2 z' `, T+ l4) pv回收策略. G( f* _4 Z) T+ `5 F) M
当用户不再使用其存储卷时,他们可以从 API 中将 PVC 对象删除,从而允许该资源被回收再利用。PersistentVolume 对象的回收策略告诉集7 e9 @% T4 E; x) M
群,当其被从申领中释放时如何处理该数据卷,pv支持的回收策略有Retain、Recycle、Delete。pv静态供给和pv动态供给下,单独删除pod后
% I7 ]' l0 l7 w* J" Vpvc不会被删除,使用"kubectl delete -f rbd-pod-test.yaml"或"kubectl delete pvc/pvcname"的方式会删除pvc。7 r# x# G6 b6 J3 J
) G& X! H4 S2 B* dpvc被删除后pv根据pv回收策略对pv和资源进行相应的操作,单独操作pv(例如: 删除)不会对pv资源产生影响。nfs只支持Retain、Recycle策略,) r4 j: R, V0 y8 D! W" T: H
ceph只支持Retain、Delete策略。, U9 W' H* |+ H: R; ]& p/ O
# m' o/ z9 H+ e! O- H# Retain策略(保留,默认策略), n9 V1 b" [/ r `+ A( r
在删除pvc后PV变为Released不可用状态,若想重新被使用,需要管理员删除pv,重新创建pv,删除pv并不会删除存储的资源,只是删除pv对象而% j3 b* f; g( v( c: a, X
已,若想保留数据,请使用该Retain策略。
. T0 i- t# x, `1 [1 T回收策略Retain使得用户可以手动回收资源,当PersistentVolumeClaim对象被删除时,PersistentVolume卷仍然存在,对应的数据卷被视为4 E! J2 F5 i# n4 a3 D& K
"已释放(released)",由于卷上仍然存在着前一申领人的数据,该卷还不能用于其他申领,管理员可以通过手动回收该卷。使用命令编辑pv,删除
1 `, {! ~! M! @: L; W6 ?- I9 K& Y绑定信息"claimRef:"下的"resourceVersion"和"uid"键,即可重新释放PV使其状态由Released变为Available(但是引用的pvc不变,删除
; _+ @: c2 B" B! ^6 R& A6 @"claimRef:"的所有内容可以被其它pvc引用)编辑命令为"kubectl edit pv/pvname"。
/ l$ B9 f1 J+ }, S& m. W: V/ V% Y1 ~3 e) v/ r& Q# |, G
# Recycle策略(回收)
$ |* y$ t' D& t: n删除pvc自动清除pv中的数据,效果相当于执行 rm -rf /thevolume/*,删除pvc时pv的状态由Bound变为Available,此时可重新被pvc申请
. h# M* Z) V7 d9 P! [绑定。警告: 回收策略Recycle会被废弃,取而代之的建议方案是使用动态供应。
6 ?4 r% K8 P' Z) W8 F0 S, e# @( ]5 E8 S. P% I) |
# Delete策略(删除)+ B; m" }9 N# U4 Z' n0 ^0 ~
在删除pvc后pv被删除并删除存储上的对应存储资源,例如AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume等。' G/ x: |0 {. o C$ l& Z5 ^
对于支持Delete回收策略的卷插件,删除动作会将PersistentVolume对象从Kubernetes中移除,同时也会从外部基础设施(如AWS EBS、GCE PD、
$ @; @9 W j) X. o2 M. ZAzure Disk、Cinder卷)中移除所关联的存储资产,动态供应的卷会继承其StorageClass中设置的回收策略,该策略默认为Delete,管理员需要根
3 ^6 [/ E* k; m. R1 {/ N据用户的期望来配置StorageClass,否则PV卷被创建之后必须要被编辑或者修改。
3 Y7 [# E! }1 v' x! Z* {0 ]; N( ]修改方法:9 a! a( |* h# I' ^) u
# kubectl edit pv/pvname% h8 }' C( `0 P5 G
# kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
5 n# h& |' \ [% ?. K- a+ P4 o) H' ?: R0 n
5) storageClassName
7 f' ?0 Y9 l6 V. m9 \ E- o在pvc的请求存储大小和访问权限与创建的pv一致的情况下,根据storageClassName进行与pv绑定,常用在pvc需要和特定pv进行绑定的情况下。
; G* w2 ~' f" L- P- a例如,当有创建多个pv、pvc设置存储的大小和访问权限一致时,且pv、pvc没有配置storageClassName时,pvc会根据存储大小和访问权限去随
4 { N+ O6 J* p3 s0 T8 Y; i, [8 A3 d3 n机匹配,如果配置了storageClassName会根据这三个条件进行匹配,当然也可以用其他方法实现pvc与特定pv的绑定如标签。
G" f7 q5 U% ~9 H% o8 K |