2

我的应用程序在 google kubernetes 引擎上运行,目前使用 pvc 进行数据存储。我只是无法决定我们应该使用 PVC 还是磁盘存储选项?

在 PVC 的情况下,我们不能有快照,除此之外,我们有任何强烈的理由应该选择基于磁盘的存储。什么是可取的?在哪些情况下我们应该考虑使用磁盘而不是 pvc

4

2 回答 2

5

您在这里混合了两个不同但相互关联的概念。持久卷声明和卷。

持久卷声明不是存储设备/服务。它是需要存储特定特性的声明。在某种程度上,您可以说它相当于异步编程承诺。它应该在某个时刻以满足声明要求的持久卷的形式“返回”一个存储。你不知道它什么时候会(通常尽快)或者它是否会(错误)。

Persistent Volume 反过来又是 Volume 的一个实例,使用典型的 Volume 定义(即 AWS EBS id、NFS 服务器详细信息、GlusterFS 等)进行定义和实例化。

卷是定义一些不属于它自己的映像/容器的一部分的存储的方法。

现在,有时您可能会将 PVC 与 PV/Volume 混淆的事实是,如果 PV 具有匹配的存储类(即默认值,但不仅如此),则可以由云提供商或第 3 方供应商自动创建 PV。

在大多数情况下,当您需要为您的 pod 提供持久存储,但您希望声明与集群无关时,您将使用 PVC 并依赖于自动配置,或者以对给定基础设施可行的方式创建匹配的 PV。例如,您可以通过hostPath卷在开发集群上支持 PVC,但在产品上使用中央GlusterFS服务器。

也就是说,PVC 或磁盘的问题没有相关性,因为 PVC 实际上可以是磁盘。这更像是“本地存储(hostPart 或emptyDir)与网络存储(云块设备、文件服务器等)之类的问题。这个问题的答案是......“这取决于”。

如果在 pod 重新调度时丢失存储的数据不是问题,那么本地存储可能是一个很好且快速的解决方案(即我会考虑将其用于缓存存储),如果不是......那么你就不能使用本地存储。但这超出了问题的初始界限。

于 2018-02-22T16:41:06.540 回答
3

在 GKE 当前的实现方式中,当您创建 PVC 时会自动配置永久磁盘。PVC 在概念上与磁盘不同,PersistentVolumeClaim 表示磁盘上的声明,它绑定到 PersistentVolume,将由集群自动配置。

这是 PostgreSQL 的示例清单,StatefulSet它使用创建的 PVC、PV 以及间接使用永久磁盘。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-claim
spec:
  storageClassName: ssd
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
---
kind: Service
apiVersion: v1
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres
  ports:
  - protocol: TCP
    port: 5432
---
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: postgres-set
spec:
  serviceName: postgres-service
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  updateStrategy:
    type: RollingUpdate

  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:10.1-alpine
        volumeMounts:
        - name: pg-data
          mountPath: /var/lib/postgresql/data
        env:
        - name: POSTGRES_USER
          value: wollner
        - name: PGDATA
          value: /var/lib/postgresql/data/pgdata

      volumes:
        - name: pg-data
          persistentVolumeClaim:
            claimName: postgres-claim

一旦应用此清单,就会在集群中创建一个新的 PVC 和一个 PV。之后,集群会提供一个新的持久磁盘来支持 PV。您将能够看到kubectl get pv新 PV 出现的位置。您还将在gcloud compute instances disks list. 默认情况下,如果删除此 PVC,磁盘也会被删除。

于 2018-02-22T15:36:36.650 回答