• NFS PersistentVolume


    NFS PersistentVolume

     

    一、部署nfs服务端:

     
    在k8s的部署节点上搭建了 NFS 服务器
    (1)安装nfs服务:
    yum install -y nfs-utils rpcbind
     
    然后将/opt/nfsshare/目录共享出去
    vim /etc/exports
    /opt/nfsshare *(rw,no_root_squash,no_all_squash,sync)
     
     
    (2)保存配置文件后,执行如下操作:
    在服务端创建对应的目录和赋予权限:
    [root@cicd opt]# ls
    harbor  nfsshare
    [root@cicd opt]# chmod -R 777 nfsshare/

     
    (3) 启动rpcbind和nfs服务,并设置自启动
    systemctl start rpcbind && systemctl enable rpcbind
    systemctl start nfs && systemctl enable nfs
     
    (4)每个node节点都安装nfs工具,并且重启nfs服务
     yum install -y nfs-utils 
     
    (5) 每个node查询NFS服务器
    showmount -e nfs-ip
    [root@node1 network-scripts]# showmount -e 192.168.253.9
    Export list for 192.168.253.9:
    /opt/nfsshare *
     
     
     

    二、 NFS PersistentVolume :

     

    创建 PV 

    (1)下面创建一个 PV mypv1,配置文件 nfs-pv1.yml 如下:
     
     
    ① capacity 指定 PV 的容量为 1G。
     
    ② accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:
    ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。
     
    ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。
     
    ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。
     
    ③ persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:
    Retain – 需要管理员手工回收。
     
    Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
     
    Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。
     
    ④ storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。
     
    ⑤ 指定 PV 在 NFS 服务器上对应的目录。
    注意要做storage-provider段要提前建好文件夹
     
     
     

    (2)创建 mypv1

    [root@cicd yml]# kubectl apply -f  nfs-pv1.yml
    persistentvolume "mypv1" created
    [root@cicd yml]# kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
    mypv1     1G         RWO            Recycle          Available             nfs                      2m
    STATUS 为 Available,表示 mypv1 就绪,可以被 PVC 申请。
     
     

    创建 PVC

     
    (1)接下来创建 PVC mypvc1,配置文件 nfs-pvc1.yml 如下:
     
     
    PVC 就很简单了,只需要指定 PV 的容量,访问模式和 class。
     
     

    (2)创建 mypvc1

     
    [root@cicd yml]# kubectl apply -f nfs-pvc1.yml 
    persistentvolumeclaim "mypvc1" created
    [root@cicd yml]# kubectl get pvc
    NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    mypvc1    Bound     mypv1     1G         RWO            nfs            9s
     
     
    从 kubectl get pvc 和 kubectl get pv 的输出可以看到 mypvc1 已经 Bound 到 mypv1申请成功。
     
     

    Pod使用pvc

     
    (1)接下来就可以在 Pod 中使用存储了,Pod 配置文件 pod1.yml 如下:
     值得注意的是mountpath也就是挂载目录与宿主机的映射目录是/opt/nfsshare/pv1.
     
    与使用普通 Volume 的格式类似,在 volumes 中通过 persistentVolumeClaim 指定使用 mypvc1 申请的 Volume。
    (2)创建 mypod1
    [root@cicd yml]# kubectl apply -f pod1.yml 
    pod "mypod1" created
    [root@cicd yml]# kubectl get pod -o wide
    NAME                                READY     STATUS              RESTARTS   AGE       IP              NODE
    httpd-deployment-67b8d86468-9bz57   1/1       Running             1          19h       172.20.104.9    192.168.253.11
    httpd-deployment-67b8d86468-skw2n   1/1       Running             0          19h       172.20.135.28   192.168.253.10
    httpd-deployment-67b8d86468-zmr75   1/1       Running             1          19h       172.20.104.7    192.168.253.11
    mypod11/1       running             8s        19         172.20.135.33   192.168.253.10
    (3)验证 PV 是否可用:
     
      1、进入mypod1中的mydata目录下创建hello文件
    [root@cicd yml]# kubectl exec -it mypod1 /bin/sh
    / # ls
    bin     etc     mydata  root    tmp     var
    dev     home    proc    sys     usr
    / # cd mydata/mydata # touch hello

    2、cd到与宿主机映射的目录下查看是否映射成功。

    [root@cicd yml]# cd /opt/nfsshare/
    [root@cicd nfsshare]# ls
    pv1
    [root@cicd nfsshare]# cd pv1/
    [root@cicd pv1]# ls
    hello 
     
    可见,在 Pod 中创建的文件 /mydata/hello 确实已经保存到了 NFS 服务器目录 /nfsdata/pv1 中。
    如果不再需要使用 PV,可用删除 PVC 回收 PV。
     
     
     

    三、 回收 PV  :

    通过pvc回收pv

     
    (1)当 PV 不再需要时,可通过删除 PVC 回收,执行:
     
      kubectl delete pvc mypvc1
    [root@cicd pv1]# kubectl get pvc

    No resources found.
    当 PVC mypvc1 被删除后,我们发现 Kubernetes 启动了一个新 Pod这个 Pod 的作用就是清除 PV mypv1 的数据。这个时候我们再看 NFS 服务器目录 /nfsdata/pv1 中已经没有数据了。
    [root@cicd pv1]# cd /opt/nfsshare/pv1/
    [root@cicd pv1]# ls
    [root@cicd pv1]# 
    (2)当数据清除完毕,mypv1 的状态重新变为 Available,此时则可以被新的 PVC 申请。
    [root@cicd pv1]# kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
    mypv1     1G         RWO            Recycle          Available             nfs                      23m
    (3)因为 PV 的回收策略设置为 Recycle,所以数据会被清除,但这可能不是我们想要的结果。如果我们希望保留数据,可以将策略设置为 Retain。
     
      persistentVolumeReclaimPolicy: Retain

     
    (4)通过 kubectl apply 更新 PV:
    [root@cicd yml]# kubectl apply -f nfs-pv1.yml 
    persistentvolume "mypv1" configured
    (5)回收策略已经变为 Retain,通过下面步骤验证其效果:
    [root@cicd yml]# kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
    mypv1     1G         RWO            Retain           Available             nfs      
     
    ① 重新创建 mypvc1。
    kubectl exec -it  mypod1 /bin/sh

    ② 在 mypv1 中创建文件 hello。
    /mydata # touch hello
     
    ③ 执行删除pvc-mypv1, 发现pv状态变为 Released。
    [root@cicd pv1]# kubectl delete  pvc mypvc1
    persistentvolumeclaim "mypvc1" deleted
    
    [root@cicd pv1]# kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM            STORAGECLASS   REASON    AGE
    mypv1     1G         RWO            Retain           Released   default/mypvc1   nfs                      37m
     
    可以发现Kubernetes 并没有启动 Pod recycler-for-mypv1。
     
     
    (6)我们再看 NFS 服务器目录 /nfsdata/pv1 中数据还保留。
    [root@cicd pv1]# cd /opt/nfsshare/pv1/
    [root@cicd pv1]# ls
    hello
     
    (7)虽然 mypv1 中的数据得到了保留,但其 PV 状态会一直处于 Released,不能被其他 PVC 申请。
     
     
    (8)为了重新使用存储资源,可以删除并重新创建 mypv1。删除操作只是删除了 PV 对象,存储空间中的数据并不会被删除。
    新建的 mypv1 状态为 Available,已经可以被 PVC 申请。
    [root@cicd yml]# kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
    mypv1     1G         RWO            Retain           Available             nfs                      49s
    PV 还支持 Delete 的回收策略,会删除 PV 在 Storage Provider 上对应存储空间。NFS 的 PV 不支持 Delete,支持 Delete 的 Provider 有 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。
     
     
     

     

    四、 PV的动态供给:

    pv的供给方式

     
    前面的例子中,我们提前创建了 PV,然后通过 PVC 申请 PV 并在 Pod 中使用,这种方式叫做静态供给(Static Provision)。
     
    与之对应的是动态供给(Dynamical Provision),即如果没有满足 PVC 条件的 PV,会动态创建 PV。相比静态供给,动态供给有明显的优势:不需要提前创建 PV,减少了管理员的工作量,效率高。
     
    动态供给是通过 StorageClass 实现的,StorageClass 定义了如何创建 PV
     
     
    pv动态供给举例
     
    StorageClass standard:
     
     
    StorageClass slow:
     
     
    这两个 StorageClass 都会动态创建 AWS EBS,不同在于 standard 创建的是 gp2 类型的 EBS,而 slow 创建的是 io1 类型的 EBS。不同类型的 EBS 支持的参数可参考 AWS 官方文档。
    StorageClass 支持 Delete 和 Retain 两种 reclaimPolicy,默认是 Delete。
    与之前一样,PVC 在申请 PV 时,只需要指定 StorageClass 和容量以及访问模式。
     
     
     

     一些报错:

    [root@cicd ~]# kubectl apply -f httpd.yml
    error: error validating "httpd.yml": error validating data: apiVersion not set; if you choose to ignore these errors, turn validation off with --validate=false
    这是因为配置内容错误apiVersion键值对错误

    [root@cicd yml]# kubectl apply -f nfs-pvc1.yml
    error: error converting YAML to JSON: yaml: line 1: mapping values are not allowed in this context
    这是因为yaml文件中含有不是键值对格式的内容

    [root@cicd yml]# kubectl apply -f pod1.yml
    error: error converting YAML to JSON: yaml: line 15: did not find expected key
    [root@cicd yml]# vim pod1.yml
    这是因为没有对齐,也就是空格问题。
  • 相关阅读:
    HADOOP docker(六):hive简易使用指南
    HADOOP docker(四):安装hive
    HADOOP docker(二):HDFS 高可用原理
    Python 自用代码(调整日期格式)
    Python 自用代码(某方标准类网页源代码清洗)
    python合并多个csv文件并去重
    Python连接MySQL乱码(中文变问号)
    Shell实现循环执行curl向Solr导入json文件
    Python 自用代码(拆分txt文件)
    shell报错:未预期的符号***附近有语法错误
  • 原文地址:https://www.cnblogs.com/zzzynx/p/11064769.html
Copyright © 2020-2023  润新知