PersistentVolume(PV)和PersistentVolumeClaim(PVC)
这两个概念用于pod和volume之间解耦。Pod根据自己的需要提出数据卷的申请,k8s系统将符合条件的数据卷返回给pod。这样一来pod就无需直接和数据卷本身强绑定了。Pod无需知道数据卷的细节信息,比如具体用的是什么存储。
Pod中对数据卷的申请为PVC,用来和PVC绑定的数据卷称为PV。
PV可以有多种存储方式,比如NFS,iSCSI等。
PVC是使用PV资源的声明。
PV和PVC的生命周期
供应阶段
PV有两种供应方式
- static 静态方式由系统管理员创建PV
- dynamic 如果没有静态的PV。系统会动态创建出PV来满足PVC。PV的提供者为StorageClass。要使用动态供应,PVC必须要指定一个StorageClass。如果StorageClass设置为空,那么针对这个PVC的动态供应特性会被禁用。
绑定阶段
这个阶段指的是PV和PVC绑定的过程。系统有一个机制,循环检查新创建的PVC,然后找到一个符合条件的PV,把他们绑定到一起。如果有多个满足要求的PV可以绑定,会使用消耗资源最小的那个。PV和PVC之间是一对一的关系。如果找不到符合条件的PV,PVC会一致保持未绑定状态。
使用阶段
PVC绑定合适的PV之后,Pod使用这个PV。和PVC绑定并处于使用状态的PV不会被系统删除,防止数据丢失。
如果用户删除了Pod正在使用的PVC,这个PVC不会被立即移除。直到这个PVC不被任何Pod时候的时候,才会被真正的删除。
重新声明阶段
当PV不再使用的时候,k8s根据不同的策略来回收这些PV。
Retain
Retain策略在volume不再使用的时候,不删除旧的数据,等待管理员处理。
Delete
Delete策略会删除不再使用的PV,同时删除这些PV对应真实存储的资源。
Recycle(已废弃)
删除volume内的内容,使得volume可供下次使用。
PV描述文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
PV的属性
Capacity
PV的容量
VolumeMode
可以使用Filesystem或者Block。Filesystem为默认值。
AccessModes
具有如下可选值:
- ReadWriteOnce:可以被一个node读写。缩写为RWO。
- ReadOnlyMany:可以被多个node读取。缩写为ROX。
- ReadWriteMany:可以摆多个node读写。缩写为RWX。
Class
配置storageClassName。
Reclaim Policy
可以使用如下回收策略:
- Retain 手工回收
- Recycle (rm -rf /thevolume/*)
- Delete 删除相关Volume
Mount Options
可以指定存储的类型。
Node Affinity
Local volume必须要设定这个属性。该属性规定了volume可以通过哪些node访问。
PV的阶段(Phase)
- Available:可用状态,没有被任何PVC绑定。
- Bound:已绑定到了PVC。
- Released:PVC已删除,但是资源没有被集群回收。
- Failed:PV自动回收失败。
PVC的描述文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: slow
selector:
matchLabels:
release: "stable"
matchExpressions:
- {key: environment, operator: In, values: [dev]}
PVC的配置参数
AccessModes
访问模式。和PV相同。
VolumeMode
volume的挂载模式,可以为Filesystem或block。
Resources
约定声明PV的大小等参数。
Selector
用于限制volume,只有label匹配的volume才能绑定到PVC上。可以使用matchLabels
或者matchExpressions
来约束。
Class
用于实现动态供给。只有StorageClassName相同的PV和PVC才能够绑定到一起。如果PVC的StorageClassName设置为"",那么它只会和StorageClassName也为""的PV绑定到一起。
创建StorageClass的时候如果将它的storageclass.kubernetes.io/is-default-class
annotation设置为true,那么此StorageClass会成为默认的StorageClass。如果PVC没有指定StorageClassName,那么它会和StorageClassName为默认StorageClass的PV绑定到一起。当然,使用这个特性必须要开启DefaultStorageClass的admission plugin。
如果没有启动这个admission plugin。没有指定StorageClass的PVC只能和没有指定StorageClass的PV绑定在一起。没有指定StorageClass和设置StorageClass的值为"",含义是相同的。
在Pod中使用PVC
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
LocalPersistentVolume
这种类型的PV把数据储存在集群中某个节点上。
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 100Gi
# volumeMode field requires BlockVolume Alpha feature gate to be enabled.
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- example-node
注意:nodeAffinity属性是必须要指定的,因为local模式一定要确定数据保存在哪个机器。
对应StorageClass如下:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
网友评论