使用 Persistent Volume Claim 时是否必须显式创建 Persistent Volume?

Do I have to explicitly create Persistent Volume when I am using Persistent Volume Claim?

我是 Kubernetes 的新手,我很难理解 Kubernetes 中持久存储背后的整个想法。

这就足够了吗,或者我必须创建持久卷,如果我只部署这两个对象而不创建 PV 会怎样?

存储应该在本地机器上。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  name: nginx-logs
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: app-web
  name: app-web
spec:
  selector:
    matchLabels:
      app: app-web
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: app-web
    spec:
      containers:
        image: nginx:1.14.2
        imagePullPolicy: Always
        name: app-web
        volumeMounts:
        - mountPath: /var/log/nginx
          name: nginx-logs
      restartPolicy: Always
      volumes:
      - name: nginx-logs
        persistentVolumeClaim:
          claimName: nginx-logs

capacity(100Mi)accessModes(ReadWriteOnce) 方面与 PVC 匹配的 PV 是 needed.If 你没有 PV 你得到错误 pod has unbound immediate PersistentVolumeClaims。因此,您要么手动创建 PV(称为静态配置),要么依靠存储 class 和卷驱动程序自动创建(称为动态配置)。

PV 是卷的 kubernetes 表示。实际卷仍然需要 provisioned.If 你使用 dynamic volume provisioning 并且你的云提供商有卷驱动程序,驱动程序在内部自动配置,无需手动创建 PV。

在本地非云系统中,您可以使用 local path provisioner to use dynamic provisioning. Configure a default storage class 并且可以避免手动创建 PV。

I struggle to understand whole idea behind Persistent Storage in Kubernetes

想法是将应用需要的存储请求与物理存储分开,这样应用就可以移动到例如其他具有不同存储系统的云提供商 - 但不需要对应用程序进行任何更改。它还分离了“请求存储”和管理底层存储的责任,例如开发人员与运营人员。

So is this enough or I have to create Persistent Volume and what will happen if I deploy only these two object without creating PV?

这取决于您的环境。大多数环境通常有 Dynamic Volume Provisioning,例如大型云提供商现在也支持 Minikube。

使用动态卷配置时,开发人员只需创建 PersistentVolumeClaim - 而无需创建 PersistentVolume,而是动态配置。

您可以在 the doc 中看到它提到了一种配置持久卷的动态方式。

When none of the static PVs the administrator created match a user's PersistentVolumeClaim, the cluster may try to dynamically provision a volume specially for the PVC. This provisioning is based on StorageClasses: the PVC must request a storage class and the administrator must have created and configured that class for dynamic provisioning to occur. Claims that request the class "" effectively disable dynamic provisioning for themselves.

当我应用你的 pvc 时,它会创建一个 gp2 卷,因为这是我的默认存储 class。

$kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nginx-logs   Bound    pvc-b95a9d0c-ef46-4ff0-a034-d2dde1ac1f96   1Gi        RWO            gp2            6s

您可以像这样查看您的默认存储 class

$kubectl get storageclass
NAME            PROVISIONER                                           AGE
gp2 (default)   kubernetes.io/aws-ebs                                 355d

您还可以包含特定的存储空间 class。您可以阅读更多相关信息 here

Users request dynamically provisioned storage by including a storage class in their PersistentVolumeClaim

简而言之,您当前的 pvc 文件将使用您的默认存储 class 创建一个持久卷,然后您通过 Deployment 中的持久卷声明将该卷装载到您的 pod 中。