我正在集群中运行一个 statefulset,并尝试分配每个副本(总共 3 个)以分配它们自己的 PVC。不幸的是,我只能提供一个名称作为 claimName。如何确保每个启动 pod 都抓取它自己的 pvc?我使用的 pod 目前称为 test,pvc 也是如此。因此,当我启动容器时,我有一个名为 test-0、test-1 和 test-2 的 pod。我的 PCV 称为 claim-0、claim-1 和 claim-2。我有什么选项可以告诉 pod test-0 抓取 claim-0 pvc,pod-1 抓取 claim-1,等等?感谢您的意见。
答案1
如果 StatefulSet 中的每个 pod 都需要其关闭的 PV,则应使用部分创建 StatefulSet volumeClaimTemplates
,如下所示文档:
对于 StatefulSet 中定义的每个 VolumeClaimTemplate 条目,每个 Pod 都会收到一个 PersistentVolumeClaim。在上面的 nginx 示例中,每个 Pod 都会收到一个具有 my-storage-class 存储类和 1 Gib 预置存储的单个 PersistentVolume。如果未指定 StorageClass,则将使用默认 StorageClass。当 Pod 被(重新)调度到节点上时,其 volumeMounts 会挂载与其 PersistentVolume Claims 关联的 PersistentVolumes。请注意,当 Pod 或 StatefulSet 被删除时,与 Pod 的 PersistentVolume Claims 关联的 PersistentVolumes 不会被删除。这必须手动完成。
因此如果你创建一个这样的 StatefulSet:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: example
spec:
replicas: 3
template:
spec:
containers:
- name: whoami
image: docker.io/containous/whoami:latest
ports:
- name: http
containerPort: 80
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
然后你就会得到三个 pod:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
example-0 1/1 Running 0 78s
example-1 1/1 Running 0 73s
example-2 1/1 Running 0 68s
还有三张 PVC:
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-example-0 Bound pvc-b31c564d-65fb-43ef-af5d-64faeaae6897 1Gi RWO standard 53s
data-example-1 Bound pvc-28f83158-d10d-450b-a723-954fc113eb92 1Gi RWO standard 48s
data-example-2 Bound pvc-55ae7f94-7ea9-4690-9e27-01e8a09cc3da 1Gi RWO standard 43s
每个都链接到一个特定的 pod。