Kubernees PV、PVC
Persistent Volumes
PersistentVolume 为用户和管理员提供了一组 API, 将存储如何控制的细节从其如何被使用中抽象出来。
为此,k8s 引入了两个新的 API 资源,PersistentVolume 和 PersistentVolumeClaim
PersistentVolume
无 Namespace 隔离
PersistentVolume(PV) 是集群中的一块存储,可以由管理员事先创建,配置。拥有独立于任何使用 PV 的 Pod 的生命周期,抽象了存储细节,PV 可能由NFS、iSCSI 或者特定于云平台的存储系统组成。
PersistentVolumeClaim
Namespace 隔离
PersistentVolumeClaim(PVC) 表达是用户对存储的请求, PVC 也可以请求特定的大小和访问模式的 PV 资源(要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载)。
NFS 类型的 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
回收策略
persistentVolumeReclaimPolicy
- Retain 保留 PV 内容
- Recycle 回收,Pod 删除之后会回收PV,清除 PV 的内容,目前只有 NFS 和 HostPath 支持
- Delete 删除 PVC 后,绑定的 PV 会被删除(PV需要支持,动态存储默认方式)
PV 状态
- Available:空闲的PV,没有被任何PVC绑定。
- Bound:已经被PVC绑定
- Released:PVC被删除,但是资源未被重新使用
- Failed:自动回收失败。
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]}
- resources 不能比需要绑定的 PV 大
- storageClassName 需要与 PV 相同
- accessModes 需要与 PV 相同
- selector 筛选 PV 标签
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
常见问题
-
创建 PVC 之后,一直绑定不上 PV(Pending):
- PVC 的空间申请大小大于 PV 的大小
- PVC 的 storageClassName 没有和 PV 的一致
- PVC 的 accessModes 和 PV 的不一致
-
创建挂载了 PVC 的 Pod 之后,一直处于 Pending 状态:
- PVC 没有被创建成功,或者被创建
- PVC 和 Pod 不在同一个 Namespace
-
删除 PVC 后 K8S 会创建一个用于回收的 Pod 根据 PV 的回收策略进行PV 的回收。 回收完以后 PV 的状态就会变成可被绑定的状态,也就是空闲状态。 其他的 Pending 状态的 PVC 如果匹配到了这个 PV,就能和这个 PV 进行绑定。