NFS

概念

一种网络文件系统,NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件 一样访问远端系统上的文件。

应用在K8S中

Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。Pod被删除时,Volume被卸载,内容被保留。这就意味着NFS能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间相互传递。

创建

yum  install  nfs-utils rpcbind  -y  
mkdir -p /data/{
   
     nfs1,nfs2,nfs3}
vi  /etc/exports
# 添加
/data/nfs1  *(rw,no_root_squash,no_all_squash,sync)
/data/nfs2  *(rw,no_root_squash,no_all_squash,sync)
/data/nfs3  *(rw,no_root_squash,no_all_squash,sync)
# 刷新配置
exportfs -r
# 重启
systemctl restart rpcbind  && systemctl restart nfs
systemctl enable  rpcbind  && systemctl enable  nfs

PV/PVC

简介

PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期。 该API对象捕获存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统。

PersistentVolumeClaim(PVC)是用户存储的请求。 它类似于pod。Pod消耗节点资源,PVC消耗存储资源。 pod可以请求特定级别的资源(CPU和内存)。 权限要求可以请求特定的大小和访问模式。

PV分类

静态Static:集群管理员创建一些PV。它们带有可供集群用户使用的实际存储的详细信息。存在于Kubernetes API中,可供使用。

动态Dynamic:当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,集群可能会尝试为PVC动态配置卷。 此配置基于StorageClasses:PVC必须请求一个类,并且管理员必须已创建并配置该类才能进行动态配置。 要求该类的声明有效地为自己禁用动态配置

生命周期

PV是集群中的资源。 PVC是对这些资源的请求,也是对资源的索赔检查。 PV和PVC之间的相互作用遵循这个生命周期:

创建=》绑定=》使用=》释放=》回收

支持类型

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • AzureFile
  • AzureDisk
  • FC (Fibre Channel)
  • FlexVolume
  • Flocker
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • CephFS
  • Cinder (OpenStack block storage)
  • Glusterfs
  • VsphereVolume
  • Quobyte Volumes
  • HostPath (single node testing only – local storage is not supported in any way and WILL - - NOT WORK in a multi-node cluster)
  • VMware Photon
  • Portworx Volumes
  • ScaleIO Volumes

创建PV示例

vim pvs.yml
# 内容
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  特定的存储容量
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  访问模式,ReadWriteOnce/ReadOnlyMany/ReadWriteMany,单node的读写/多node的只读/多node的读写
  accessModes:
    - ReadWriteOnce
  回收策略:Retain/Recycle/Delete,保留/回收/删除
  persistentVolumeReclaimPolicy: Recycle
  PV可以有一个类,通过将storageClassName属性设置为StorageClass的名称来指定。 特定类的PV只能绑定到请求该类的PVC。 没有storageClassName的PV没有类,只能绑定到不需要特定类的PVC。
  storageClassName: slow
  Kubernetes管理员可以指定在一个节点上挂载一个持久卷时的其他安装选项
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    nfs路径
    path: /data/nfs1
    nfs节点IP
    server: 192.168.58.103
# 创建
kubectl create -f pvs.yml
# 查看
kubectl get pv 

 

重要参数解析

CAPACITY:特定的存储容量
ACCESS MODES:访问模式
RECLAIM POLICY:回收策略
STATUS:状态(Available /Bound /Released /Failed 可用/已绑定/已释放/已失败)

案例

部署一个Mysql,并把数据目录挂载到pv中

1、 创建pvc,没有绑定PV时,K8S会自动根据PVC需要寻找PV;

vim mysql-pvc.yaml
# 添加
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-mysql-001
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
# 
kubectl apply  -f mysql-pvc.yaml
# 查看pvc 
kubectl get pvc 

1、 创建pod;

apiVersion: v1
kind: Pod
metadata:
 labels:
  app: mysql-001
 name: mysql-001
spec:
   restartPolicy: Never
   containers:
   - name: mysql-001
     image: daocloud.io/library/mysql:5.7.4
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 3306
       name: mysql-port
     env:
     - name: MYSQL_ROOT_PASSWORD
       value: admin123
     volumeMounts:
     - name: data
       mountPath: /var/lib/mysql
   volumes:
   - name: data
     persistentVolumeClaim:
       claimName: pvc-mysql-001

1、 验证,进入nfs目录,发现mysql数据已被挂载;