PVC(持久卷)

PVC 是一种 Kubernetes 原生资源,是对存储的需求声明,它抽象了底层存储细节,允许用户请求特定大小和访问模式的存储,而不必关心存储的具体实现。

创建 PVC

下面是一个基本的 PVC 配置示例:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: cephfs-hdd

在该例中:

  • spec.resources.requests.storage 字段定义了所申请的存储空间容量大小为 1Gi
  • spec.accessModes 字段定义了访问模式为 ReadWriteMany,表示该 PVC 能够同时被多个节点上的 Pod 使用。
  • spec.storageClassName 字段定义了所使用的存储类名称为 cephfs-hdd,集群中可用的存储类由管理员提供。

使用 PVC

下面是在 Pod 中使用 PVC 的示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
spec:
  containers:
  - name: myfrontend
    image: nginx
    volumeMounts:
    - mountPath: "/var/www/html"
      name: data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: pvc-demo

在该例中,pod-demopvc-demo 作为一个数据卷(volume)来使用,其中容器 myfrontend 将该数据卷挂载到 /var/www/html 目录下。

在 TensorStack AI 平台中,PVC 是通用的持久化存储资源,你在 NotebookJobMLServiceWorkflow 等 TensorStack 资源中都可以使用 PVC。以 Notebook 为例:

apiVersion: tensorstack.dev/v1beta1
kind: Notebook
metadata:
  name: notebook-demo
spec:
  type: jupyter
  template:
    spec:
      containers:
      - image: t9kpublic/torch-2.0.0-notebook:1.72.0
        name: notebook
        resources:
          limits:
            cpu: "4"
            memory: 4Gi
          requests:
            cpu: "0.5"
            memory: 500Mi
        volumeMounts:
        - name: workingdir
          mountPath: /t9k/mnt
      volumes:
      - name: workingdir
        persistentVolumeClaim:
          claimName: pvc-demo

在该例中,notebook-demopvc-demo 作为一个数据卷(volume)来使用,其中容器 notebook 将该数据卷挂载到 /t9k/mnt 目录下。

生命周期

PVC 有以下几种状态:

  • Pending:PVC 正在由对应的存储类处理。
  • Bound:PVC 创建成功,可以被使用。
  • Unknown:无法获取 PVC 状态。

PVC 与 Pod

PVC 的生命周期独立于 Pod。一个 PVC 可以被多个 Pod 使用。当 PVC 正在被 Pod 使用时,它无法被删除。

PVC 与 StorageShim

在 TensorStack AI 平台中,你可以:

  1. 创建一个独立的 PVC,申请全新的存储空间。
  2. 创建一个 StorageShim,将已有存储系统的某个子目录挂载为一个 PVC。此时 StorageShim 控制器将为所创建的 StorageShim 创建一个同名的 PVC,此 PVC 的生命周期由 StorageShim 管理。

容量请求

创建 PVC 时,spec.resources.requests.storage 字段用于指定 PVC 的容量,你无法在 PVC 中存储超过此容量限制的文件。

访问模式

创建 PVC 时,spec.accessModes 字段用于指定 PVC 的访问模式,可选择以下几种访问模式:

  • ReadWriteMany:PVC 能被多个节点上的 Pod 读写。
  • ReadWriteOnce:PVC 只能被一个节点上的 Pod 读写。
  • ReadOnlyMany:PVC 只能被多个节点上的 Pod 读。

一般选择 ReadWriteMany 即可。

存储类

创建 PVC 时,spec.storageClassName 字段用于指定 PVC 的存储类,集群中可用的存储类由管理员提供。

例如,一个集群可能提供两个存储类,名为 cephfs-hddcephfs-ssd,分别提供基于 HDD 机械硬盘和 SSD 固态硬盘的存储空间,用于不同的数据存储目的。

下一步