长久卷应用(nfs存储数据)

Kubernetes 为了使应用程序及其开发人员可能失常申请存储资源,防止解决存储设施细节,引入了 PV 和 PVC。创立 PV 有两种形式:

  • 集群管理员通过手动形式动态创立利用所须要的 PV;
  • 用户手动创立 PVC 并由 Provisioner 组件动态创建对应的 PV。

搭建nfs服务器(ip:192.168.0.29)

找一台服务器搭建nfs服务端, 我以centos7为例

装置nfsyum -y install nfs-utils#创立nfs目录mkdir -p /nfs/data/#批改权限chmod -R 777 /nfs/data#编辑export文件vim /etc/exports/nfs/data *(rw,no_root_squash,sync)  (“*“代表所有人都能连贯,倡议换成具体ip或ip段,如192.168.20.0/24)#配置失效exportfs -r#查看失效exportfs#启动rpcbind、nfs服务systemctl restart rpcbind && systemctl enable rpcbindsystemctl restart nfs && systemctl enable nfs#查看 RPC 服务的注册情况rpcinfo -p localhost#showmount测试showmount -e 192.168.92.56#所有node节点装置nfs客户端yum -y install nfs-utilssystemctl start nfs && systemctl enable nfs

1.动态创立PV卷

增加pv卷对应目录,这里创立2个pv卷,则增加2个pv卷的目录作为挂载点。

#nfs服务器操作#创立pv卷对应的目录mkdir -p /nfs/data/pv001mkdir -p /nfs/data/pv002#配置exportrsvim /etc/exports/nfs/data *(rw,no_root_squash,sync)/nfs/data/pv001 *(rw,no_root_squash,sync)/nfs/data/pv002 *(rw,no_root_squash,sync)#配置失效exportfs -r#重启rpcbind、nfs服务systemctl restart rpcbind && systemctl restart nfs

第一步:集群管理员创立 NFS PV,NFS 属于 K8s 原生反对的 in-tree 存储类型。yaml 文件如下:

# cat nfs-pv1.yamlapiVersion: v1kind: PersistentVolumemetadata:  name: nfs-pv001  labels:    pv: nfs-pv001spec:  capacity:    storage: 1Gi  accessModes:    - ReadWriteOnce  persistentVolumeReclaimPolicy: Recycle  storageClassName: nfs  nfs:    path: /nfs/data/pv001    server: 192.168.0.29# cat nfs-pv2.yamlapiVersion: v1kind: PersistentVolumemetadata:  name: nfs-pv002  labels:    pv: nfs-pv002spec:  capacity:    storage: 1Gi  accessModes:    - ReadWriteOnce  persistentVolumeReclaimPolicy: Recycle  storageClassName: nfs  nfs:    path: /nfs/data/pv002    server: 192.168.0.29

配置阐明

配置阐明:① 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 服务器上对应的目录。
[root@vm192-168-0-79 ~]# kubectl apply -f pv1.yamlpersistentvolume/nfs-pv001 created[root@vm192-168-0-79 ~]# kubectl apply -f pv2.yamlpersistentvolume/nfs-pv002 created[root@vm192-168-0-79 ~]# kubectl get pvNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGEnfs-pv001   1Gi        RWO            Recycle          Available           nfs                     10mnfs-pv002   1Gi        RWO            Recycle          Available           nfs                     3m2s# STATUS 为 Available,示意 pv就绪,能够被 PVC 申请。

第二步:用户创立 PVC,yaml 文件如下:

接下来创立一个名为pvc001,pvc002的pvc

# cat nfs-pvc1.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:  name: nfs-pvc001spec:  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 1Gi  storageClassName: nfs  selector:    matchLabels:      pv: nfs-pv001# cat nfs-pvc2.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:  name: nfs-pvc002spec:  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 1Gi  storageClassName: nfs  selector:    matchLabels:      pv: nfs-pv002
[root@vm192-168-0-79 ~]# kubectl apply -f pvc1.yamlpersistentvolumeclaim/nfs-pvc001 created[root@vm192-168-0-79 ~]# kubectl apply -f pvc2.yamlpersistentvolumeclaim/nfs-pvc002 created[root@vm192-168-0-79 ~]# kubectl get pvNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGEnfs-pv001   1Gi        RWO            Recycle          Bound    default/nfs-pvc001   nfs                     12mnfs-pv002   1Gi        RWO            Recycle          Bound    default/nfs-pvc002   nfs                     5m[root@vm192-168-0-79 ~]# kubectl get pvcNAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGEnfs-pvc001   Bound    nfs-pv001   1Gi        RWO            nfs            15snfs-pvc002   Bound    nfs-pv002   1Gi        RWO            nfs            15s

从 kubectl get pvc 和 kubectl get pv 的输入能够看到 pvc001 和pvc002别离绑定到pv001和pv002,申请胜利。留神pvc绑定到对应pv通过labels标签形式实现,也能够不指定,将随机绑定到pv。

第三步:用户创立利用,并应用第二步创立的 PVC。

# cat pod1.yamlkind: PodapiVersion: v1metadata:  name: nfs-pod001spec:  containers:    - name: myfrontend      image: nginx:latest      volumeMounts:      - mountPath: "/var/www/html"        name: nfs-pv001  volumes:    - name: nfs-pv001      persistentVolumeClaim:        claimName: nfs-pvc001# cat pod2.yamlkind: PodapiVersion: v1metadata:  name: nfs-pod002spec:  containers:    - name: myfrontend      image: nginx:latest      volumeMounts:      - mountPath: "/var/www/html"        name: nfs-pv002  volumes:    - name: nfs-pv002      persistentVolumeClaim:        claimName: nfs-pvc002

与应用一般 Volume 的格局相似,在 volumes 中通过 persistentVolumeClaim 指定应用nfs-pvc001和nfs-pvc002申请的 Volume。

[root@vm192-168-0-79 ~]# kubectl apply -f pod1.yamlpod/nfs-pod001 created[root@vm192-168-0-79 ~]# kubectl apply -f pod2.yamlpod/nfs-pod002 created[root@vm192-168-0-79 ~]# kubectl get poNAME         READY   STATUS    RESTARTS   AGEnfs-pod001   1/1     Running   0          62snfs-pod002   1/1     Running   0          7s[root@vm192-168-0-79 ~]# kubectl exec nfs-pod001 touch /var/www/html/index001.html[root@vm192-168-0-79 ~]# kubectl exec nfs-pod002 touch /var/www/html/index002.html# 在nfs服务器验证[root@vm192-168-0-29 pv001]# ls /nfs/data/pv001index001.html[root@vm192-168-0-29 pv001]# ls /nfs/data/pv002index002.html

进入pod查看挂载状况

[root@vm192-168-0-79 ~]#  kubectl exec -ti nfs-pod001 /bin/bashroot@nfs-pod001:/# df -h...192.168.0.29:/nfs/data/pv001  197G  2.8G  186G   2% /var/www/html...

删除pv

删除pod,pv和pvc不会被删除,nfs存储的数据不会被删除。

[root@vm192-168-0-79 ~]# kubectl delete -f pod1.yamlpod "nfs-pod001" deleted[root@vm192-168-0-79 ~]# kubectl get pvNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGEnfs-pv001   1Gi        RWO            Recycle          Bound    default/nfs-pvc001   nfs                     38mnfs-pv002   1Gi        RWO            Recycle          Bound    default/nfs-pvc002   nfs                     31m[root@vm192-168-0-79 ~]# kubectl get pvcNAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGEnfs-pvc001   Bound    nfs-pv001   1Gi        RWO            nfs            26mnfs-pvc002   Bound    nfs-pv002   1Gi        RWO            nfs            26m# nfs服务器查看[root@vm192-168-0-29 pv001]# ls /nfs/data/pv001index001.html

持续删除pvc,pv将被开释,处于 Available 可用状态,并且nfs存储中的数据被删除。

[root@vm192-168-0-79 ~]# kubectl delete -f pvc1.yamlpersistentvolumeclaim "nfs-pvc001" deleted[root@vm192-168-0-79 ~]# kubectl get pvNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                STORAGECLASS   REASON   AGEnfs-pv001   1Gi        RWO            Recycle          Available                        nfs                     40mnfs-pv002   1Gi        RWO            Recycle          Bound       default/nfs-pvc002   nfs                     32m# nfs服务器查看[root@vm192-168-0-29 pv001]# ls /nfs/data/pv001[root@vm192-168-0-29 pv001]#

持续删除pv

[root@vm192-168-0-79 ~]# kubectl delete -f pv1.yamlpersistentvolume "nfs-pv001" deleted

动态创建pv

我的项目地址:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client