基本概念
PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的两种API资源,用于抽象存储细节,用于实现持久化存储.
Persistent Volume(PV)是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统
PersistentVolumeClaim(PVC)是用户存储的请求。它与 Pod 相似。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。PVC声明可以请求特定的大小和访问模式(如:读写或只读)
PV支持的类型 https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes
PV的回收策略(persistentVolumeReclaimPolicy)
- pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)
- 保留策略:允许人工处理保留的数据.
- 删除策略:将删除pv和外部关联的存储资源,需要插件支持.
- 回收策略:将执行清除操作,之后可以被新的pvc使用,需要插件支.
参考: https://kubernetes.io/zh/docs/tasks/administer-cluster/change-pv-reclaim-policy/
PVC阶段状态(STATUS)
- Available – 资源尚未被claim使用
- Bound – 卷已经被绑定到claim了
- Released – claim被删除,卷处于释放状态,但未被集群回收
- Failed – 卷自动回收失败
目前只有NFS和HostPath类型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持删除(Delete)策略。
访问模式(accessModes)
- ReadWriteOnce - PV以 read-write 挂载到一个节点
- ReadWriteMany – PV以read-write方式挂载到多个节点
- ReadOnlyMany – PV以read-only方式挂载到多个节点
Pod Volume的类型(非持久存储)
emptryDir
emptyDir类型的Volume在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。
emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。
apiVersion: v1
kind: Pod
metadata:
name: pod-emptydir
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nginx-log
mountPath: /var/log/nginx
volumes:
- name: nginx-log
emptyDir: {}
hostPath
hostPath Volume为Pod挂载宿主机上的目录或文件。 hostPath Volume的使得容器可以使用宿主机的高速文件系统进行存储。
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nginx-log
mountPath: /var/log/nginx
volumes:
- name: nginx-log
hostPath:
path: /data/nginx/log
PV/PVC结合NFS使用实践(持久存储)
安装NFS
安装参考: https://baiyongjie.com/?p=545
# 创建一个/data/pvdata的共享目录
# mkdir /data/pvdata
# chown nfsnobody:nfsnobody /data/pvdata
# cat /etc/exports
/data/pvdata 172.22.22.0/24(rw,async,all_squash)
建立PV
# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data #pv的名称
spec:
capacity: #容量
storage: 10Gi #pv可用的大小
accessModes: #访问模式
- ReadWriteOnce #PV以read-write挂载到一个节点
persistentVolumeReclaimPolicy: Recycle #持久卷回收策略
storageClassName: nfs #存储类名称
nfs:
path: /data/pvdata #NFS的路径
server: 172.22.22.215 #NFS的IP地址
# kubectl apply -f pv.yaml
persistentvolume/pv-data created
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-data 10Gi RWO Recycle Available 29s
建立PVC
# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-log #PVC的名称
spec:
accessModes:
- ReadWriteOnce #PVC以read-write挂载到一个节点
resources:
requests:
storage: 10Gi #PVC允许申请的大小
# kubectl apply -f pvc.yaml
persistentvolumeclaim/pvdata created
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nginx-log Bound pv-data 10Gi RWO 18m
创建Deployment
# cat nginx.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: nginx #申请pvc的名称,要和spec.volumes.name匹配
mountPath: /var/log/nginx/ #pod内部的目录
subPath: logs/nginx #挂载到pv目录下的logs/nginx,如不指定此参数则挂在到pv的/目录下
volumes:
- name: nginx #申请的名称,要和spec.spec.containers.volumes.name匹配
persistentVolumeClaim: #PVC方式
claimName: nginx-log #PVC的名称
# ll /data/pvdata/log/nginx/
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Mar 25 04:48 access.log
-rw-r--r--. 1 nfsnobody nfsnobody 0 Mar 25 04:48 error.log
网友评论