kubernetes系列教程(十)深入学习持久化存储PV和PVC

视频教程连接kubernetes快速入门


写在前面

上一篇文章中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即PersistentVolume持久化存储,是管理员定义的一块存储空间,能抽象化底层存储细节,和node类似,PV是集群级别的资源,生命周期独立于Pod,支持静态创建和动态创建,动态创建需通过StorageClass。
  • PVC即PersistentVolumeClaim持久化存储申明,作为PV资源的使用方,可以指定请求存储容量大小和访问模式
  • StorageClass,存储类型支持创建PV,通过在PVC中指定StorageClass可动态创建PV,且支持指定不同的存储
PV/PVC概念介绍

PV支持设置字段介绍:

  • Capacity 存储的特性,当前只支持通过capacity指定存储大小,未来会支持IOPS,吞吐量等指标
  • VolumeMode 存储卷的类型,默认为filesystem,如果是块设备指定为block
  • Class 通过storageClassName指定静态StorageClass的名称
  • Reclaim Policy 回收策略,支持Retain保留,Recycle回收,DELETE删除
  • Volume驱动类型,和上一篇文章介绍的类似,支持不同的plugin驱动如RBD,NFS
  • Mount Options 挂载模式,支持管理员定义不同的挂载选项
  • AccessMode 访问模式,指定node的挂载方式,支持ReadWriteOnce读写挂载一次,ReadOnlyMany多个节点挂载只读模式,ReadWriteMany多个节点挂载读写模式,不同的volume驱动类型支持的模式有所不同,如下
PV支持的不同AccessMode

1.2 定义PV存储

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

PV和PVC使用过程
  1. 定义一个PV,指定大小为10G,读写模式为单个node读写,回收模式为Retain,后端驱动plugin为NFS
[root@node-1 happylau]# cat pv-nfs-storage.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-storage 
  labels:
    storage: nfs
  annotations:
    kubernetes.io.description: pv-storage
spec:
  storageClassName: nfs  #静态指定存储类StorageClass名称
  capacity:              #capacity指定存储容量大小
    storage: 10Gi        
  accessModes:           #访问模式为单个节点读写模式
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain  #回收模式为保留
  nfs:                  #后端plugin驱动类型为NFS,指定server和path路径
    server: 10.254.100.101
    path: /mnt/data
  1. 创建PersistentVolumes
[root@node-1 happylau]# kubectl apply -f pv-nfs-storage.yaml 
persistentvolume/pv-nfs-storage unchanged
  1. 查看PersistentVolumes列表
[root@node-1 happylau]# kubectl get persistentvolumes 
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-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状态异常。

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

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

1.3. PVC引用PV

  1. 通过定义PVC,通过selector和PV实现关联,指定到相同的StorageClass
[root@node-1 happylau]# cat pvc-nfs-storage.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs-storage
  labels:
    storage: pvc
  annotations:
    kubernetes.io/description: "PersistentVolumeClaim for PV"
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  storageClassName: nfs
  resources:
    requests:
      storage: 1Gi
    limits:
      storage: 10Gi
  selector:
    matchLabels:
      storage: nfs
  1. 生成PersistentVolumeClaim
[root@node-1 happylau]# kubectl apply -f pvc-nfs-storage.yaml 
persistentvolumeclaim/pvc-nfs-storage created
  1. 查看PersistentVolumeClaim列表,通过STATUS可以知道,当前PVC和PV已经Bond关联
[root@node-1 happylau]# kubectl get persistentvolumeclaims 
NAME              STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs-storage   Bound    pv-nfs-storage   10Gi       RWO            nfs   

查看PVC详情:
[root@node-1 happylau]# kubectl describe persistentvolumeclaims pvc-nfs-storage 
Name:          pvc-nfs-storage
Namespace:     default
StorageClass:  nfs
Status:        Bound
Volume:        pv-nfs-storage
Labels:        storage=pvc
Annotations:   kubectl.kubernetes.io/last-applied-configuration:
                 {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"kubernetes.io/description":"PersistentVolumeClaim for PV"},"...
               kubernetes.io/description: PersistentVolumeClaim for PV
               pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      10Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Mounted By:    <none>
Events:        <none>        
  1. 再次查看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将存储挂载到指定目录。
[root@node-1 happylau]# cat pvc-nfs-deployments.yaml 
apiVersion: apps/v1 
kind: Deployment
metadata:  #deployment的元数据
  name: pvc-nfs-deployment
  labels:
    app: pvc-nfs-deployment
spec:      #deployment的属性信息
  replicas: 1  #副本控制数
  selector:
    matchLabels:
      app: pvc-nfs-deployment
  template:    #通过定义模板引用Pod,template中的信息和Pod定义的信息一致,包含metadata,spec信息
    metadata:  #定义Pod的labels
      labels:
        app: pvc-nfs-deployment
    spec:
      containers:
      - name: nginx-web 
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - name: nginx-http-80
          protocol: TCP
          containerPort: 80
        volumeMounts:  #将PVC存储挂载到目录
        - name: pvc-nfs-storage
          mountPath: /usr/share/nginx/html 
      volumes:    #通过volumes引用persistentVolumeClaim存储
      - name: pvc-nfs-storage
        persistentVolumeClaim:
          claimName: pvc-nfs-storage
  1. 创建Deployments并查看创建情况和Pod情况
创建Deployments
[root@node-1 happylau]# kubectl apply -f pvc-nfs-deployments.yaml 
deployment.apps/pvc-nfs-deployment created

查看Deployments列表
[root@node-1 happylau]# kubectl get deployments
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
pvc-nfs-deployment   1/1     1            1           16s

查看Deployments中的Pod
[root@node-1 happylau]# kubectl get pods -l app=pvc-nfs-deployment -o wide 
NAME                                  READY   STATUS    RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES
pvc-nfs-deployment-7467b9fbfc-xwdpr   1/1     Running   0          106s   10.244.1.29   node-2   <none>           <none>
  1. Pod中查看存储挂载信息,并做数据读写。
[root@node-1 happylau]# kubectl exec -it pvc-nfs-deployment-7467b9fbfc-xwdpr  /bin/bash
root@pvc-nfs-deployment-7467b9fbfc-xwdpr:/# df -h
Filesystem                Size  Used Avail Use% Mounted on
overlay                    50G  4.3G   43G  10% /
tmpfs                      64M     0   64M   0% /dev
tmpfs                     920M     0  920M   0% /sys/fs/cgroup
/dev/vda1                  50G  4.3G   43G  10% /etc/hosts
shm                        64M     0   64M   0% /dev/shm
10.254.100.101:/mnt/data   50G  9.9G   37G  22% /usr/share/nginx/html #挂载成功
tmpfs                     920M   12K  920M   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                     920M     0  920M   0% /proc/acpi
tmpfs                     920M     0  920M   0% /proc/scsi
tmpfs                     920M     0  920M   0% /sys/firmware

写入站点数据内容
root@pvc-nfs-deployment-7467b9fbfc-xwdpr:~# echo "pvc index by happylau" >/usr/share/nginx/html/index.html 
root@pvc-nfs-deployment-7467b9fbfc-xwdpr:~# ls -l /usr/share/nginx/html/
total 4
-rw-r--r-- 1 nobody nogroup 22 Oct 12 02:00 index.html
  1. 测试访问,直接访问Pod的IP,一般通过service来调用,后续再介绍service
[root@node-1 ~]# kubectl get pods -l app=pvc-nfs-deployment -o wide 
NAME                                  READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
pvc-nfs-deployment-7467b9fbfc-xwdpr   1/1     Running   0          14m   10.244.1.29   node-2   <none>           <none>
[root@node-1 ~]# curl http://10.244.1.29
pvc 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/


当你的才华撑不起你的野心时,你就应该静下心来学习

返回kubernetes系列教程目录

如果觉得文章对您有帮助,请订阅专栏,分享给有需要的朋友吧😊

关于作者 刘海平(HappyLau )云计算高级顾问 目前在腾讯云从事公有云相关工作,曾就职于酷狗,EasyStack,拥有多年公有云+私有云计算架构设计,运维,交付相关经验,参与了酷狗,南方电网,国泰君安等大型私有云平台建设,精通Linux,Kubernetes,OpenStack,Ceph等开源技术,在云计算领域具有丰富实战经验,拥有RHCA/OpenStack/Linux授课经验。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容