我的应用程序在 google kubernetes 引擎上运行,目前使用 pvc 进行数据存储。我只是无法决定我们应该使用 PVC 还是磁盘存储选项?
在 PVC 的情况下,我们不能有快照,除此之外,我们有任何强烈的理由应该选择基于磁盘的存储。什么是可取的?在哪些情况下我们应该考虑使用磁盘而不是 pvc
我的应用程序在 google kubernetes 引擎上运行,目前使用 pvc 进行数据存储。我只是无法决定我们应该使用 PVC 还是磁盘存储选项?
在 PVC 的情况下,我们不能有快照,除此之外,我们有任何强烈的理由应该选择基于磁盘的存储。什么是可取的?在哪些情况下我们应该考虑使用磁盘而不是 pvc
您在这里混合了两个不同但相互关联的概念。持久卷声明和卷。
持久卷声明不是存储设备/服务。它是需要存储特定特性的声明。在某种程度上,您可以说它相当于异步编程承诺。它应该在某个时刻以满足声明要求的持久卷的形式“返回”一个存储。你不知道它什么时候会(通常尽快)或者它是否会(错误)。
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 重新调度时丢失存储的数据不是问题,那么本地存储可能是一个很好且快速的解决方案(即我会考虑将其用于缓存存储),如果不是......那么你就不能使用本地存储。但这超出了问题的初始界限。
在 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,磁盘也会被删除。