使用“持久卷声明”时是否必须显式创建“持久卷”?

时间:2020-10-06 16:00:13

标签: kubernetes persistent-volumes persistent-volume-claims

我是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

3 个答案:

答案 0 :(得分:2)

需要一个与PVC相匹配的PV,capacity(100Mi)accessModes(ReadWriteOnce)。如果没有PV,则会出现错误pod has unbound immediate PersistentVolumeClaims。因此,您可以手动创建PV(称为静态配置),也可以依靠存储类和卷驱动程序自动创建PV(称为动态配置)。

PV是容量的kubernetes表示。仍然需要供应实际的卷。如果您使用dynamic volume provisioning并且您的云提供商具有卷驱动程序,则该驱动程序将在内部自动进行配置,而无需手动创建PV。

在本地非云系统中,您可以使用local path provisioner来使用动态配置。配置默认的storage class,可以避免手动创建PV。

答案 1 :(得分:2)

我很难理解Kubernetes中持久存储背后的整个想法

这个想法是将应用所需的存储请求与物理存储区分开-这样就可以将应用移至其他具有不同存储系统的云提供商-无需在应用程序中进行任何更改。它还将“请求存储”和管理基础存储(例如,存储)的责任分开。开发人员与运营。

这足够了吗?还是我必须创建持久卷,如果仅部署这两个对象而不创建PV会发生什么?

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

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

答案 2 :(得分:2)

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

当管理员创建的所有静态PV均与用户的静态PV不匹配时 PersistentVolumeClaim,群集可能会尝试动态配置 体积专门用于PVC。此设置基于 StorageClasses:PVC必须请求一个存储类,并且 管理员必须已经为动态创建并配置了该类 置备发生。要求有效地要求“”类的要求 自行禁用动态配置。

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

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

您可以看到这样的默认存储类

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

您还可以包括特定的存储类。您可以了解有关here的更多信息。

用户通过包含存储来请求动态预配置存储 他们的PersistentVolumeClaim中的类

简而言之,您当前的pvc文件将使用默认的存储类创建一个持久卷,然后通过部署中的“持久卷声明”将该卷安装到Pod中。