什么是 Kubernetes PVC?

PVC(PersistentVolumeClaim)是 Kubernetes 中用于请求存储卷的对象。它与 PersistentVolume 配合使用,可以实现存储的动态分配与管理。

PVC 的主要作用是:

  1. 请求特定大小和访问模式(如读写权限)的存储卷。
  2. 将请求关联到存储卷,存储卷满足请求要求才能绑定。
  3. 存储卷的动态分配与管理:解决 PersistentVolume 需要预先分配但部分未使用的问题。

PVC 的定义主要包括以下字段:

  • metadata:名称、Label 等元数据。
  • spec:请求存储卷的参数
  • accessModes:存储卷的访问模式,如 ReadWriteOnce(RWO)、ReadOnlyMany(ROX)、ReadWriteMany(RWX)等。
  • resources:存储卷的大小,如 1Gi。
  • selector:选择器,用于筛选匹配的 PersistentVolume。
  • storageClassName:存储类,用于动态分配存储卷。
  • status:PVC 的状态,如 Pending、Bound、Lost 等。

例如,我们可以定义一个请求 10Gi 大小、ReadWriteOnce 访问模式的存储卷的 PVC:

yaml
apiVersion: v1 
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec: 
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

然后 Kubernetes 会根据这一请求选择或者动态分配一个满足要求的 PersistentVolume 绑定到这个 PVC。

我们也可以通过 StorageClass 来请求动态分配的存储卷:

yaml
kind: StorageClass 
apiVersion: storage.k8s.io/v1
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs 
parameters:
  type: gp2

--- 
kind: PersistentVolumeClaim 
apiVersion: v1
metadata:
  name: myclaim 
spec:
  accessModes:
    - ReadWriteOnce 
  storageClassName: standard 
  resources:
    requests:
      storage: 30Gi

这里我们定义了一个 StorageClass,然后 PVC 通过设置 storageClassName 使用这个 StorageClass 请求动态分配的存储卷。

当 PVC 成功绑定到 PersistentVolume 后,我们就可以在 Pod 中以 Volume 的形式挂载这个 PVC 来使用存储卷:

yaml
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 的主要作用是:

  1. 请求存储卷的大小与访问模式。
  2. 将请求与满足要求的存储卷绑定。
  3. 通过 StorageClass 实现存储卷的动态分配。
  4. 在 Pod 中以 Volume 的形式挂载使用。