从Deployment迁移到StatefulSet,而不会丢失持久的卷访问权限

时间:2019-12-21 13:02:01

标签: kubernetes google-kubernetes-engine

在得知我们应该使用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。)

2 个答案:

答案 0 :(得分:0)

在StatefulSet中,当您尝试使用PVC存储数据时,实际上是通过使用volumeClaimTemplates来定义PVC的,例如:

volumeClaimTemplates:
    - metadata:
        name: gitea-server-data
        labels:
          app: gitea
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi

在这种情况下,可能会发生以下情况:

  • 如果StatefulSet名称为gitea-server,副本为1,则 StatefulSet的唯一Pod将使用名为gitea-server-data-gitea-server-0的PVC(如果集群中已经存在)或创建一个名为gitea-server-data-gitea-server-0的PVC(如果集群中不存在)。
  • 如果StatefulSet名称为gitea-server,副本为2,则 StatefulSet的两个Pod将分别使用名为gitea-server-data-gitea-server-0gitea-server-data-gitea-server-1的PVC(如果集群中已经存在)或创建名为gitea-server-data-gitea-server-0gitea-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之后,如果尝试使用副本1volumeClaimTemplates中定义的上述配置创建一个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美元,所以这将使我们的账单增加三倍多,仅仅是为了确保无错误地滚动部署。