Loading

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 进行绑定。

posted @ 2023-01-16 22:59  平凡键客  阅读(52)  评论(0编辑  收藏  举报