10 深入学习持久化存储PV和PVC

unlisted · suofeiya's blog


Table of Contents

写在前面 #

上一篇文章中kubernetes系列教程(九)初识Pod存储管理介绍了kubernetes中存储Volume的使用,volume支持多种不同的内置驱动,使用volumes需要知道后端驱动的细节,使用起来不方便,因此社区提出了PV概念,即通过管理员定义好PV,通过PVC使用PV;随着PV数量的不断增加,管理员需要频繁定义PV,因此提出了动态存储StorageClass,通过PVC中调用StorageClass动态创建PV,接下来介绍kubernetes系列教程高级进阶PV/PVC。

1. PV与PVC存储 #

1.1 PV概念介绍 #

PV/PVC概念介绍

PV支持设置字段介绍:

PV支持的不同AccessMode

1.2 定义PV存储 #

接下来我们开始学习PV的使用,使用阶段分为:1. 预先创建好PV,2. 用户通过PVC调用PV,3. Pod中应用PVC,创建流程参考下图:

PV和PVC使用过程

\1. 定义一个PV,指定大小为10G,读写模式为单个node读写,回收模式为Retain,后端驱动plugin为NFS

 1[root@node-1 happylau]# cat pv-nfs-storage.yaml 
 2apiVersion: v1
 3kind: PersistentVolume
 4metadata:
 5  name: pv-nfs-storage 
 6  labels:
 7    storage: nfs
 8  annotations:
 9    kubernetes.io.description: pv-storage
10spec:
11  storageClassName: nfs  #静态指定存储类StorageClass名称
12  capacity:              #capacity指定存储容量大小
13    storage: 10Gi        
14  accessModes:           #访问模式为单个节点读写模式
15    - ReadWriteOnce
16  persistentVolumeReclaimPolicy: Retain  #回收模式为保留
17  nfs:                  #后端plugin驱动类型为NFS指定server和path路径
18    server: 10.254.100.101
19    path: /mnt/data

\2. 创建PersistentVolumes

1[root@node-1 happylau]# kubectl apply -f pv-nfs-storage.yaml 
2persistentvolume/pv-nfs-storage unchanged

\3. 查看PersistentVolumes列表

1[root@node-1 happylau]# kubectl get persistentvolumes 
2NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
3pv-nfs-storage   10Gi       RWO            Retain           Available           nfs                     43m

关于PV输出解释说明:

  1. ACCESS MODES 指定的是读写模式,RWO代表ReadWriteOnce,ROM代表ReadOnlyMany,RWX代表ReadWriteMany
  2. STATUS代表PV状态,Available刚创建未绑定状态,Bound为与PVC绑定,Released为PVC删除PV未释放,Failed状态异常。

\4. 查看PV详细信息,呈现的信息会更详细

 1[root@node-1 ~]# kubectl describe persistentvolumes pv-nfs-storage 
 2Name:            pv-nfs-storage
 3Labels:          storage=nfs
 4Annotations:     kubectl.kubernetes.io/last-applied-configuration:
 5                   {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{"kubernetes.io.description":"pv-storage"},"labels":{"storage":"nfs...
 6                 kubernetes.io.description: pv-storage
 7Finalizers:      [kubernetes.io/pv-protection]
 8StorageClass:    nfs
 9Status:          Available
10Claim:           
11Reclaim Policy:  Retain
12Access Modes:    RWO
13VolumeMode:      Filesystem
14Capacity:        10Gi
15Node Affinity:   <none>
16Message:         
17Source:
18    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
19    Server:    10.254.100.101
20    Path:      /mnt/data
21    ReadOnly:  false
22Events:        <none>

1.3. PVC引用PV #

\1. 通过定义PVC,通过selector和PV实现关联,指定到相同的StorageClass

 1[root@node-1 happylau]# cat pvc-nfs-storage.yaml 
 2apiVersion: v1
 3kind: PersistentVolumeClaim
 4metadata:
 5  name: pvc-nfs-storage
 6  labels:
 7    storage: pvc
 8  annotations:
 9    kubernetes.io/description: "PersistentVolumeClaim for PV"
10spec:
11  accessModes:
12    - ReadWriteOnce
13  volumeMode: Filesystem
14  storageClassName: nfs
15  resources:
16    requests:
17      storage: 1Gi
18    limits:
19      storage: 10Gi
20  selector:
21    matchLabels:
22      storage: nfs

\2. 生成PersistentVolumeClaim

1[root@node-1 happylau]# kubectl apply -f pvc-nfs-storage.yaml 
2persistentvolumeclaim/pvc-nfs-storage created

\3. 查看PersistentVolumeClaim列表,通过STATUS可以知道,当前PVC和PV已经Bond关联

 1[root@node-1 happylau]# kubectl get persistentvolumeclaims 
 2NAME              STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
 3pvc-nfs-storage   Bound    pv-nfs-storage   10Gi       RWO            nfs   
 4
 5查看PVC详情
 6[root@node-1 happylau]# kubectl describe persistentvolumeclaims pvc-nfs-storage 
 7Name:          pvc-nfs-storage
 8Namespace:     default
 9StorageClass:  nfs
10Status:        Bound
11Volume:        pv-nfs-storage
12Labels:        storage=pvc
13Annotations:   kubectl.kubernetes.io/last-applied-configuration:
14                 {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"kubernetes.io/description":"PersistentVolumeClaim for PV"},"...
15               kubernetes.io/description: PersistentVolumeClaim for PV
16               pv.kubernetes.io/bind-completed: yes
17               pv.kubernetes.io/bound-by-controller: yes
18Finalizers:    [kubernetes.io/pvc-protection]
19Capacity:      10Gi
20Access Modes:  RWO
21VolumeMode:    Filesystem
22Mounted By:    <none>
23Events:        <none>        

\4. 再次查看PV的状态,此时状态为Bond,和default命名空间下的PVC pvc-nfs-storage关联,此时PVC已经定义好

PV和PVC绑定状态详情

1.4 Pod引用PVC #

PV和PVC定义好后,需要在Pod中引用定义的存储,引用方式和之前定义的类似,spec.containers.volumeMounts在Pod中引用定义的存储,前面的文章中我们直接通过Pod调用,本文案例通过将Pod以Template的形式定义封装在Deployment的控制器中,下篇文章我们再深入介绍Deployment,ReplicaSet,StatefulSet等副本控制器。

\1. 定义一个Deployments,通过deployment.spec.template.spec应用Pod,在volumes中调用PVC存储,volumeMounts将存储挂载到指定目录。

 1[root@node-1 happylau]# cat pvc-nfs-deployments.yaml 
 2apiVersion: apps/v1 
 3kind: Deployment
 4metadata:  #deployment的元数据
 5  name: pvc-nfs-deployment
 6  labels:
 7    app: pvc-nfs-deployment
 8spec:      #deployment的属性信息
 9  replicas: 1  #副本控制数
10  selector:
11    matchLabels:
12      app: pvc-nfs-deployment
13  template:    #通过定义模板引用Podtemplate中的信息和Pod定义的信息一致包含metadata,spec信息
14    metadata:  #定义Pod的labels
15      labels:
16        app: pvc-nfs-deployment
17    spec:
18      containers:
19      - name: nginx-web 
20        image: nginx:latest
21        imagePullPolicy: IfNotPresent
22        ports:
23        - name: nginx-http-80
24          protocol: TCP
25          containerPort: 80
26        volumeMounts:  #将PVC存储挂载到目录
27        - name: pvc-nfs-storage
28          mountPath: /usr/share/nginx/html 
29      volumes:    #通过volumes引用persistentVolumeClaim存储
30      - name: pvc-nfs-storage
31        persistentVolumeClaim:
32          claimName: pvc-nfs-storage

\2. 创建Deployments并查看创建情况和Pod情况

 1创建Deployments
 2[root@node-1 happylau]# kubectl apply -f pvc-nfs-deployments.yaml 
 3deployment.apps/pvc-nfs-deployment created
 4
 5查看Deployments列表
 6[root@node-1 happylau]# kubectl get deployments
 7NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
 8pvc-nfs-deployment   1/1     1            1           16s
 9
10查看Deployments中的Pod
11[root@node-1 happylau]# kubectl get pods -l app=pvc-nfs-deployment -o wide 
12NAME                                  READY   STATUS    RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES
13pvc-nfs-deployment-7467b9fbfc-xwdpr   1/1     Running   0          106s   10.244.1.29   node-2   <none>           <none>

\3. Pod中查看存储挂载信息,并做数据读写。

 1[root@node-1 happylau]# kubectl exec -it pvc-nfs-deployment-7467b9fbfc-xwdpr  /bin/bash
 2root@pvc-nfs-deployment-7467b9fbfc-xwdpr:/# df -h
 3Filesystem                Size  Used Avail Use% Mounted on
 4overlay                    50G  4.3G   43G  10% /
 5tmpfs                      64M     0   64M   0% /dev
 6tmpfs                     920M     0  920M   0% /sys/fs/cgroup
 7/dev/vda1                  50G  4.3G   43G  10% /etc/hosts
 8shm                        64M     0   64M   0% /dev/shm
 910.254.100.101:/mnt/data   50G  9.9G   37G  22% /usr/share/nginx/html #挂载成功
10tmpfs                     920M   12K  920M   1% /run/secrets/kubernetes.io/serviceaccount
11tmpfs                     920M     0  920M   0% /proc/acpi
12tmpfs                     920M     0  920M   0% /proc/scsi
13tmpfs                     920M     0  920M   0% /sys/firmware
14
15写入站点数据内容
16root@pvc-nfs-deployment-7467b9fbfc-xwdpr:~# echo "pvc index by happylau" >/usr/share/nginx/html/index.html 
17root@pvc-nfs-deployment-7467b9fbfc-xwdpr:~# ls -l /usr/share/nginx/html/
18total 4
19-rw-r--r-- 1 nobody nogroup 22 Oct 12 02:00 index.html

\4. 测试访问,直接访问Pod的IP,一般通过service来调用,后续再介绍service

1[root@node-1 ~]# kubectl get pods -l app=pvc-nfs-deployment -o wide 
2NAME                                  READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
3pvc-nfs-deployment-7467b9fbfc-xwdpr   1/1     Running   0          14m   10.244.1.29   node-2   <none>           <none>
4[root@node-1 ~]# curl http://10.244.1.29
5pvc index by happylau

写在最后 #

本文通过介绍了持久化存储PV和持久化存储声明PVC的使用场景和相关概念,并通过实例演示PV和PVC的使用,由于PV需要管理员预先定义,对于大规模环境下使用不便利,因此有了动态PV,即通过StorageClass实现,下章节我们将介绍StorageClass的使用。

参考文献 #

PV和PVC介绍:https://kubernetes.io/docs/concepts/storage/persistent-volumes/

有状态化应用:https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/

『 转载 』该文章来源于网络,侵删。