我正在创建一个有3个副本的StatefulSet based on this yaml。我希望3个pod中的每一个都连接到不同的PersistentVolume。
对于持久性卷我使用3个看起来像这样的对象,只更改名称(pvvolume,pvvolume2,pvvolume3):
kind: PersistentVolume
apiVersion: v1
metadata:
name: pvvolume
labels:
type: local
spec:
storageClassName: standard
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/nfs"
claimRef:
kind: PersistentVolumeClaim
namespace: default
name: mongo-persistent-storage-mongo-0
StatefulSet中的3个pod中的第一个似乎没有问题。
第二个失败,错误为pod has unbound PersistentVolumeClaims
Back-off restarting failed container
。
然而,如果我转到显示PersistentVolumeClaims的标签,那么创建的第二个似乎已经成功。
如果成功,为什么pod认为它失败了?
答案 0 :(得分:1)
我希望3个pod中的每一个都连接到不同的PersistentVolume。
为了使其正常工作,您需要:
而不是声明清单中提到的任何要求,而是使用hostPath(指向/ nfs)并将其设置为ReadWriteOnce(只有一个可以使用它)。你也使用'标准'作为存储类,在你给出的url中有快速和慢速的,所以你可能也创建了你的存储类。
第二个失败,错误pod具有未绑定的PersistentVolumeClaims 退回重启失败的容器
如果成功,为什么pod认为它失败了?
由于您将/ nfs作为主机路径引用,因此可以安全地假设您正在使用某种NFS支持的文件系统,因此这里有一个备用设置可以让您通过nfs将动态配置的持久卷挂载到尽可能多的有状态的豆荚
为此,您首先需要从此处安装nfs provisioner:
存储类清单:
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: sc-nfs-persistent-volume
# if you changed this during provisioner installation, update also here
provisioner: example.com/nfs
有状态集(仅限重要摘录):
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: ss-my-app
spec:
replicas: 3
...
selector:
matchLabels:
app: my-app
tier: my-mongo-db
...
template:
metadata:
labels:
app: my-app
tier: my-mongo-db
spec:
...
containers:
- image: ...
...
volumeMounts:
- name: persistent-storage-mount
mountPath: /wherever/on/container/you/want/it/mounted
...
...
volumeClaimTemplates:
- metadata:
name: persistent-storage-mount
spec:
storageClassName: sc-nfs-persistent-volume
accessModes: [ ReadWriteOnce ]
resources:
requests:
storage: 10Gi
...