NFS PersistentVolume

 

 

NFS PersistentVolume

 

1、部署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 *
 
 
 

2、 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 是否可用:
 
  一、进入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

 

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

[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。
 
 
 

3、 回收 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 等。
 
 
 

 

4、 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 这是由于没有对齐,也就是空格问题。
相关文章
相关标签/搜索