【发布时间】:2019-12-21 13:02:01
【问题描述】:
在得知我们应该使用 StatefulSet 而不是 Deployment 以便能够将相同的持久卷附加到多个 pod,尤其是不同节点上的 pod 之后,我尝试相应地更改我们的配置。
但是,即使在卷声明中使用与以前相同的名称时,它似乎是在创建一个全新的卷而不是使用我们现有的卷,因此应用程序在以 StatefulSet 运行时无法访问现有数据.
这是我们当前Deployment 配置的音量声明部分:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitea-server-data
labels:
app: gitea
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
这会导致使用相同名称的声明。
这是StatefulSet的模板:
volumeClaimTemplates:
- metadata:
name: gitea-server-data
labels:
app: gitea
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
这会为每个 pod 生成新的声明,每个声明带有 pod 名称和 ID,例如gitea-server-data-gitea-server-0.
新的声明现在使用新卷而不是现有卷。所以我尝试明确指定现有卷,如下所示:
volumeClaimTemplates:
- metadata:
name: gitea-server-data
labels:
app: gitea
spec:
accessModes:
- ReadWriteOnce
volumeName: pvc-c87ff507-fd77-11e8-9a7b-420101234567
resources:
requests:
storage: 20Gi
但是,这会导致 pod 无法被调度并且新的声明被无限期地“等待”:
pod 有未绑定的即时 PersistentVolumeClaims(重复次数)
所以问题是:我们如何迁移卷声明以允许我们使用现有的持久卷并从新的StatefulSet 而不是当前的Deployment 访问当前的应用程序数据?
(如果相关,我们在 GKE 上使用 Kubernetes。)
【问题讨论】:
标签: kubernetes google-kubernetes-engine