第25章: Kubernetes使用Ceph(rbd cephfs)作為Pod存儲


5.5 Kubernetes使用Ceph作為Pod存儲

ceph-csi版本 kubernetes版本 ceph版本
cephcsi:v3.2.2 v1.20.4 15.2.15 octopus (stable)

1 PV 與 PVC 概述

(1) PersistentVolume(PV) 持久卷

對外部存儲資源創建和使用的抽象,使得存儲作為集群中的資源管理,PV又分為靜態供給和動態供給,由於靜態供給需要提前創建一堆PV,維護成本
較高,所以企業一般使用動態供給。

(2) PersistentVolumeClaim(PVC)持久卷申請

讓用戶不需要關心具體的Volume實現細節,只需要定義PVC需要多少磁盤容量即可。

(3) PV動態供給工作流程

pv-pvc

動態供給主要是能夠自動幫你創建pv,需要多大的空間就創建多大的pv,k8s幫助創建pv,pvc就直接使用api調用存儲類來尋找pv。
如果是存儲靜態供給的話,會需要我們手動去創建pv,而動態供給主要的一個實現就是StorageClass存儲對象,其實它就是聲明你使用哪
個存儲,然后幫你去連接,再幫你去自動創建pv。如果沒有足夠的資源,找不到合適的pv,那么pod就會處於pending等待的狀態。

PersistentVolume 子系統為用戶和管理員提供了一組 API,將存儲如何供應的細節從其如何被使用中抽象出來。為了實現這點,引入了一些新的資源
和概念:
# PV(PersistentVolume,持久卷)
是集群中的一塊存儲,可以由管理員事先供應,或者使用存儲類(StorageClass)來動態供應。持久卷是集群資源,就像節點也是集群資源一樣。
# PVC(PersistentVolumeClaim,持久卷申領)
表達的是用戶對存儲的請求,PVC申領請求特定的大小和訪問模式的PV卷。
# StorageClass(存儲類)
集群管理員需要能夠提供不同性質的PersistentVolume,並且這些PV卷之間的差別不僅限於卷大小和訪問模式,同時又不能將卷是如何實現的這些細節
暴露給用戶,為了滿足這類需求,就有了存儲類(StorageClass)資源。
# volume
卷的核心是一個目錄,其中可能存有數據,Pod 中的容器可以訪問該目錄中的數據。

2 ceph-csi 自動供給程序

ceph-csi是ceph官方維護的PV供給程序,專門用於在Kubernetes中使用RBD、CephFS為Pod提供存儲。
項目地址: https://github.com/ceph/ceph-csi

3 Pod使用RBD塊存儲

k8s-rbd-ceph-st

(1) 關於部署,RBD YAML文件在"deploy/rbd/kubernetes"目錄,需要做如下改動

1) 全部統一命名空間到 ceph-csi
2) 將鏡像轉存到 docker hub (由於使用的鏡像在國外,國內無法下載,先FQ將其下載后放再放到docker hub上)
3) 增加 secret.yaml 和 storageclass.yaml 文件
4) 將 csi-rbdplugin-provisioner.yaml 和 csi-rbdplugin.yaml 中關於 kms 的配置注釋掉

(2) 在使用中,還需要根據自己集群環境修改

1) csi-config-map.yaml 修改連接ceph集群信息
2) secret.yaml 修改秘鑰
3) storageclass.yaml 修改集群ID和存儲池

(3) 部署

 
           
1) 從github上下載的yaml文件如下所示,然后全部統一命名空間到 ceph-csi
[root@k8s-master1 rbd]# ls -l
total 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.yaml

2) 將鏡像轉存到 docker hub
csi-rbdplugin-provisioner.yaml
csi-rbdplugin.yaml

3) 增加 secret.yaml 和 storageclass.yaml 文件
[root@k8s-master1 rbd]# cat > secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph-csi 
stringData:
  userID: admin
  userKey: AQDwAsxgatvdARAAkf2inKyubNr/IbzgPhJyGg== 
EOF

[root@k8s-master1 rbd]# cat > storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   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: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - discard
EOF

4) 將 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: v1
kind: ConfigMap
data:
  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 id
id:     14912382-3d84-4cf2-9fdb-eebab12107d8

6) secret.yaml 修改秘鑰
# 修改userKey
[root@k8s-master1 rbd]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  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.admin
key: AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==

7) storageclass.yaml 修改集群ID和存儲池
# 修改clusterID和pool參數
[root@k8s-master1 rbd]# vim storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   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: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - 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 {}

(4) 檢查

[root@k8s-master1 rbd]# kubectl get sc
NAME         PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
csi-rbd-sc   rbd.csi.ceph.com   Delete         Immediate           true                   3m33s

[root@k8s-master1 rbd]# kubectl get pod -o wide -n ceph-csi
NAME                                     READY   STATUS   RESTARTS   AGE     IP               NODE         
csi-rbdplugin-95bs4                       3/3     Running   0         6m31s   172.16.1.82     k8s-master2  
csi-rbdplugin-b9qnd                       3/3     Running   0         6m31s   172.16.1.81     k8s-master1  
csi-rbdplugin-pb82h                       3/3     Running   0         6m31s   172.16.1.84     k8s-node2    
csi-rbdplugin-provisioner-fc66bb6-rvhcd   7/7     Running   0         6m31s   172.27.169.138   k8s-node2    
csi-rbdplugin-provisioner-fc66bb6-tgkpj   7/7     Running   0         6m31s   172.27.36.68     k8s-node1    
csi-rbdplugin-provisioner-fc66bb6-wclzw   7/7     Running   0         6m31s   172.27.159.135   k8s-master1  
csi-rbdplugin-trffn                       3/3     Running   0         6m31s   172.16.1.83     k8s-node1    
[root@k8s-master1 rbd]#

# 可以看到ceph pv自動供給應用部署正常

(5) 測試


  
  
  
          
[root@k8s-master1 ceph-dir]# cat > rbd-pod-test.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: ceph-rbd-test
spec:
  containers:
  - name: nginx
    image: nginx:latest
    volumeMounts:
      - name: www 
        mountPath: /usr/share/nginx/html 
  volumes:
  - name: www 
    persistentVolumeClaim:
      claimName: ceph-rbd-test
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ceph-rbd-test
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: csi-rbd-sc  
  resources:
    requests:
      storage: 10Gi
EOF

2) 應用yaml文件
[root@k8s-master1 ceph-dir]# kubectl apply -f rbd-pod-test.yaml -n default

3) 查看pod
[root@k8s-master1 ceph-dir]# kubectl get pod -o wide -n default
NAME            READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE   READINESS GATES
ceph-rbd-test   1/1     Running   0          36s   172.27.224.24   k8s-master2   <none>           <none>

4) 在ceph集群中查看rbd列表
[root@ceph-deploy ~]# rbd ls rbd-k8s
csi-vol-9fb06274-5d6e-11ec-8295-9e604dd3c50f

[root@ceph-deploy ~]# rbd info rbd-k8s/csi-vol-9fb06274-5d6e-11ec-8295-9e604dd3c50f
rbd 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 2021

5) 進入測試pod內查看掛載信息
# 可以看到"ceph-rbd-test"容器內掛載了10G的硬盤rbd0到"/usr/share/nginx/html"目錄上
[root@k8s-master1 ceph-dir]# kubectl exec -it pod/ceph-rbd-test -n default -- bash
root@ceph-rbd-test:/# lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      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/hosts
sr0     11:0    1 1024M  0 rom  
rbd0   253:0    0   10G  0 disk /usr/share/nginx/html
root@ceph-rbd-test:/# exit

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-rbd-test -n default
[root@k8s-master1 ceph-dir]# kubectl describe pv/pvc-fe43b3cd-a8a3-4642-9c50-208f675973f7



圖示: rbd-pvc pv

7) 在線擴容功能
當修改rbd-pod-test.yaml文件中pvc的需求大小為20G后再應用,相應的ceph集群的rbd塊會自動擴容,但不支持縮容的操作。

4 pod使用CephFS文件存儲

k8s-cephfs-ceph-st

(1) 關於部署,CephFS YAML文件在"deploy/cephfs/kubernetes"目錄,部署時YAML文件需做如下改動

1) 全部統一命名空間到ceph-csi-cephfs
2) 將鏡像轉存到docker hub
3) 增加secret.yaml和storageclass.yaml文件

(2) 在使用中,還需要根據自己集群環境修改

1) csi-config-map.yaml 修改連接ceph集群信息
2) secret.yaml 修改秘鑰
3) storageclass.yaml 修改集群ID和文件系統名稱

(3) 部署


  
  
  
          
1) 從github上下載的yaml文件如下所示,然后全部統一命名空間到 ceph-csi-cephfs
[root@k8s-master1 cephfs]# ls -l
total 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.yaml

2) 將鏡像轉存到docker hub
csi-cephfsplugin-provisioner.yaml
csi-cephfsplugin.yaml

3) 增加secret.yaml和storageclass.yaml文件
[root@k8s-master1 cephfs]# cat > secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: ceph-csi-cephfs 
stringData:
  adminID: admin
  adminKey: AQDwAsxgatvdARAAkf2inKyubNr/IbzgPhJyGg== 
EOF

[root@k8s-master1 cephfs]# cat > storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
   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-cephfs
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - discard
EOF

4) csi-config-map.yaml 修改連接ceph集群信息
# 修改連接Ceph集群的clusterID和monitors的地址
[root@k8s-master1 cephfs]# vim csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  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 id
id:     14912382-3d84-4cf2-9fdb-eebab12107d8

5) secret.yaml 修改秘鑰
# 修改adminKey
[root@k8s-master1 cephfs]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  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.admin
key: AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==

6) storageclass.yaml 修改集群ID和文件系統名稱
# 修改clusterID、pool、fsName參數
[root@k8s-master1 cephfs]# vim storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
   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-cephfs
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - 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 ls
device_health_metrics
rbd-k8s
cephfs_data
cephfs_metadata

# 創建文件系統
格式: ceph fs new <fs_name> <metadata> <data>
# ceph fs new cephfs cephfs_metadata cephfs_data

# ceph fs ls    # 查看創建后的cephfs
name: 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 {}



(4) 檢查

[root@k8s-master1 cephfs]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
csi-cephfs-sc cephfs.csi.ceph.com Delete Immediate true 2m44s

[root@k8s-master1 cephfs]# kubectl get pod -o wide -n ceph-csi-cephfs
NAME READY STATUS RESTARTS AGE IP NODE
csi-cephfsplugin-7kv9h 3/3 Running 0 5m35s 172.16.1.84 k8s-node2
csi-cephfsplugin-8zh5x 3/3 Running 0 5m35s 172.16.1.83 k8s-node1
csi-cephfsplugin-provisioner-7c454885fc-5xkm7 6/6 Running 0 5m33s 172.27.159.149 k8s-master1
csi-cephfsplugin-provisioner-7c454885fc-75rn4 6/6 Running 0 5m33s 172.27.36.76 k8s-node1
csi-cephfsplugin-provisioner-7c454885fc-wc6lv 6/6 Running 0 5m33s 172.27.169.154 k8s-node2
csi-cephfsplugin-skwnh 3/3 Running 0 5m35s 172.16.1.82 k8s-master2
csi-cephfsplugin-vxlj5 3/3 Running 0 5m35s 172.16.1.81 k8s-master1

# 可以看到ceph pv自動供給應用部署正常

(5) 測試


  
  
  
          
1) 測試yaml文件
[root@k8s-master1 ceph-dir]# cat > cephfs-deployment-test.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  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: v1
kind: PersistentVolumeClaim
metadata:
  name: ceph-cephfs-test
spec:
  accessModes:
    - ReadWriteMany 
  storageClassName: csi-cephfs-sc  
  resources:
    requests:
      storage: 10Gi
EOF

2) 應用yaml文件
[root@k8s-master1 ceph-dir]# kubectl apply -f cephfs-deployment-test.yaml -n default

3) 查看pod
[root@k8s-master1 ceph-dir]# kubectl get pod -o wide -n default
NAME                               READY   STATUS    RESTARTS   AGE    IP              NODE       
cephfs-pod-test-5d95fd8858-crjh8   1/1     Running   0          111s   172.27.224.26   k8s-master2
cephfs-pod-test-5d95fd8858-dv96p   1/1     Running   0          111s   172.27.224.25   k8s-master2
cephfs-pod-test-5d95fd8858-rlsw7   1/1     Running   0          111s   172.27.224.27   k8s-master2

4) 在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.meta
4 directories, 2 files

5) 進入測試pod內查看掛載信息
# 可以看到創建的3個pod共享了cephfs存儲池
[root@k8s-master1 ceph-dir]# kubectl exec -it pod/cephfs-pod-test-5d95fd8858-crjh8 -n default -- bash
root@cephfs-pod-test-5d95fd8858-crjh8:/# df -hT
Filesystem     Type            Size  Used Avail Use% Mounted on
......(省略的內容)
ceph-fuse      fuse.ceph-fuse   10G     0   10G   0% /usr/share/nginx/html
root@cephfs-pod-test-5d95fd8858-crjh8:/# exit
exit
[root@k8s-master1 ceph-dir]# kubectl exec -it pod/cephfs-pod-test-5d95fd8858-dv96p -n default -- bash
root@cephfs-pod-test-5d95fd8858-dv96p:/# df -hT
Filesystem     Type            Size  Used Avail Use% Mounted on
......(省略的內容)
ceph-fuse      fuse.ceph-fuse   10G     0   10G   0% /usr/share/nginx/html
root@cephfs-pod-test-5d95fd8858-dv96p:/# exit
exit
[root@k8s-master1 ceph-dir]# kubectl exec -it pod/cephfs-pod-test-5d95fd8858-rlsw7 -n default -- bash
root@cephfs-pod-test-5d95fd8858-rlsw7:/# df -hT
Filesystem     Type            Size  Used Avail Use% Mounted on
......(省略的內容)
ceph-fuse      fuse.ceph-fuse   10G     0   10G   0% /usr/share/nginx/html
root@cephfs-pod-test-5d95fd8858-rlsw7:/# exit
exit
[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



圖示: cephfs-pvc pv

5 小結

(1) 圖示 k8s-pvc pv

(2) pvc,pv總結

官方文檔:
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
1) pv獨立於pod存在,pv是全局資源,pvc是局部資源(在pod使用的命名空間下)。

2) pv可以創建動態pv或者靜態pv,動態pv不需要手動去創建,靜態pv需要手動創建。

3) 訪問模式
ReadWriteOnce # 卷可以被一個節點以讀寫方式掛載。ReadWriteOnce訪問模式也允許運行在同一節點上的多個Pod訪問卷。
ReadOnlyMany # 卷可以被多個節點多個Pod以只讀方式掛載。
ReadWriteMany # 卷可以被多個節點多個Pod以讀寫方式掛載。
ReadWriteOncePod # 卷可以被單個Pod以讀寫方式掛載。如果你想確保整個集群中只有一個Pod可以讀取或寫入該PVC,請使用ReadWriteOncePod
訪問模式。這只支持CSI卷以及需要Kubernetes 1.22以上版本。

在CLI中,訪問模式縮寫為 RWO - ReadWriteOnce、ROX - ReadOnlyMany、RWX - ReadWriteMany、RWOP - ReadWriteOncePod

4) pv回收策略
當用戶不再使用其存儲卷時,他們可以從 API 中將 PVC 對象刪除,從而允許該資源被回收再利用。PersistentVolume 對象的回收策略告訴集
群,當其被從申領中釋放時如何處理該數據卷,pv支持的回收策略有Retain、Recycle、Delete。pv靜態供給和pv動態供給下,單獨刪除pod后
pvc不會被刪除,使用"kubectl delete -f rbd-pod-test.yaml"或"kubectl delete pvc/pvcname"的方式會刪除pvc。

pvc被刪除后pv根據pv回收策略對pv和資源進行相應的操作,單獨操作pv(例如: 刪除)不會對pv資源產生影響。nfs只支持Retain、Recycle策略,
ceph只支持Retain、Delete策略。

# Retain策略(保留,默認策略)
在刪除pvc后PV變為Released不可用狀態,若想重新被使用,需要管理員刪除pv,重新創建pv,刪除pv並不會刪除存儲的資源,只是刪除pv對象而
已,若想保留數據,請使用該Retain策略。
回收策略Retain使得用戶可以手動回收資源,當PersistentVolumeClaim對象被刪除時,PersistentVolume卷仍然存在,對應的數據卷被視為
"已釋放(released)",由於卷上仍然存在着前一申領人的數據,該卷還不能用於其他申領,管理員可以通過手動回收該卷。使用命令編輯pv,刪除
綁定信息"claimRef:"下的"resourceVersion"和"uid"鍵,即可重新釋放PV使其狀態由Released變為Available(但是引用的pvc不變,刪除
"claimRef:"的所有內容可以被其它pvc引用)編輯命令為"kubectl edit pv/pvname"。

# Recycle策略(回收)
刪除pvc自動清除pv中的數據,效果相當於執行 rm -rf /thevolume/*,刪除pvc時pv的狀態由Bound變為Available,此時可重新被pvc申請
綁定。警告: 回收策略Recycle會被廢棄,取而代之的建議方案是使用動態供應。

# Delete策略(刪除)
在刪除pvc后pv被刪除並刪除存儲上的對應存儲資源,例如AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume等。
對於支持Delete回收策略的卷插件,刪除動作會將PersistentVolume對象從Kubernetes中移除,同時也會從外部基礎設施(如AWS EBS、GCE PD、
Azure Disk、Cinder卷)中移除所關聯的存儲資產,動態供應的卷會繼承其StorageClass中設置的回收策略,該策略默認為Delete,管理員需要根
據用戶的期望來配置StorageClass,否則PV卷被創建之后必須要被編輯或者修改。
修改方法:
# kubectl edit pv/pvname
# kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

5) storageClassName
在pvc的請求存儲大小和訪問權限與創建的pv一致的情況下,根據storageClassName進行與pv綁定,常用在pvc需要和特定pv進行綁定的情況下。
例如,當有創建多個pv、pvc設置存儲的大小和訪問權限一致時,且pv、pvc沒有配置storageClassName時,pvc會根據存儲大小和訪問權限去隨
機匹配,如果配置了storageClassName會根據這三個條件進行匹配,當然也可以用其他方法實現pvc與特定pv的綁定如標簽。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM