在得知我们应该使用StatefulSet
而不是Deployment
以便能够将相同的持久卷附加到多个容器(尤其是不同节点上的容器)之后,我尝试更改配置相应地。
但是,即使对卷声明使用与以前相同的名称,它似乎仍在创建一个全新的卷,而不是使用我们现有的卷,因此当以{{1 }}。
以下是我们当前StatefulSet
配置中的批量声明部分:
Deployment
这将导致具有相同名称的索赔。
这是apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitea-server-data
labels:
app: gitea
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
的模板:
StatefulSet
这会导致每个吊舱都有新的声明,并具有每个声明的吊舱名称和ID,例如 volumeClaimTemplates:
- metadata:
name: gitea-server-data
labels:
app: gitea
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
。
新的声明现在使用的是新卷,而不是现有的卷。因此,我尝试显式指定现有卷,例如:
gitea-server-data-gitea-server-0
但是,这会导致无法安排广告连播,并且新声明会无限期“待处理”:
pod具有未绑定的立即PersistentVolumeClaims(重复次数)
问题是:我们如何以一种允许我们使用现有持久卷并从新 volumeClaimTemplates:
- metadata:
name: gitea-server-data
labels:
app: gitea
spec:
accessModes:
- ReadWriteOnce
volumeName: pvc-c87ff507-fd77-11e8-9a7b-420101234567
resources:
requests:
storage: 20Gi
而不是当前{{ 1}}?
(如果相关,我们将在GKE上使用Kubernetes。)
答案 0 :(得分:0)
在StatefulSet中,当您尝试使用PVC存储数据时,实际上是通过使用volumeClaimTemplates
来定义PVC的,例如:
volumeClaimTemplates:
- metadata:
name: gitea-server-data
labels:
app: gitea
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
在这种情况下,可能会发生以下情况:
gitea-server
,副本为1
,则
StatefulSet的唯一Pod将使用名为gitea-server-data-gitea-server-0
的PVC(如果集群中已经存在)或创建一个名为gitea-server-data-gitea-server-0
的PVC(如果集群中不存在)。gitea-server
,副本为2
,则
StatefulSet的两个Pod将分别使用名为gitea-server-data-gitea-server-0
和gitea-server-data-gitea-server-1
的PVC(如果集群中已经存在)或创建名为gitea-server-data-gitea-server-0
和gitea-server-data-gitea-server-1
的新PVC(如果没有在集群中不存在)等等。通常,在StatefulSet中,生成的PVC名称遵循以下约定:
<volumeClaimTemplates name>-<StatefulSet name>-<Pod ordinal>
现在,如果您创建一个名为gitea-server-data-gitea-server-0
的PVC,其他情况如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitea-server-data
labels:
app: gitea
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
然后,在创建PVC之后,如果尝试使用副本1
和volumeClaimTemplates
中定义的上述配置创建一个StatefulSet,则SatefulSet将使用此PVC(gitea-server-data-gitea-server-0
)
您还可以通过将字段spec.accessmodes
指定为ReadWriteMany
在其他工作负载(如部署)中使用此PVC。
答案 1 :(得分:0)
好的,所以我花了很多时间尝试各种不同的配置,直到最终得知GCE永久性磁盘根本不支持ReadWriteMany
。
GKE docs竭尽所能,从未明确提及您无法在多个Pod /节点上实际安装任何普通GKE持久卷。
显然,在容器之间获取共享文件存储的唯一方法是部署自己的NFS / Gluster / etc。或掏出一大笔钱和use Google Cloud Filestore,为此有一个GKE存储类别,并且确实可以安装在多个吊舱上。
不幸的是,这不是此应用程序的选择,因为文件存储的定价从1TB的最小容量开始,每月每GB高达$ 0.20,这意味着最便宜的可用选项的价格约为每月$ 205 。我们目前每月需要支付约60美元,所以这将使我们的账单增加三倍多,仅仅是为了确保无错误地滚动部署。