Kubernetes WaitForFirstConsumer PersistentVolumeClaim在绑定前等待创建第一个使用者
我在一个节点中设置了一个新的k8s,它被污染了。但是当我试图创建一个简单的PostgreSQL时,Kubernetes WaitForFirstConsumer PersistentVolumeClaim在绑定前等待创建第一个使用者,kubernetes,persistent-volumes,Kubernetes,Persistent Volumes,我在一个节点中设置了一个新的k8s,它被污染了。但是当我试图创建一个简单的PostgreSQL时,PersistentVolume无法成功创建 下面有一些详细信息 StorageClass是从官方页面复制的: StatefulSet是: kind: StatefulSet apiVersion: apps/v1beta1 metadata: name: postgres spec: serviceName: postgres replicas: 1 ... volumeCl
PersistentVolume
无法成功创建
下面有一些详细信息
StorageClass
是从官方页面复制的:
StatefulSet
是:
kind: StatefulSet
apiVersion: apps/v1beta1
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 1
...
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
关于运行的StorageClass
:
$ kubectl describe storageclasses.storage.k8s.io
Name: local-storage
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"local-storage"},"provisioner":"kubernetes.io/no-provisioner","volumeBindingMode":"WaitForFirstConsumer"}
Provisioner: kubernetes.io/no-provisioner
Parameters: <none>
AllowVolumeExpansion: <unset>
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: WaitForFirstConsumer
Events: <none>
K8s版本:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.4", GitCommit:"c27b913fddd1a6c480c229191a087698aa92f0b1", GitTreeState:"clean", BuildDate:"2019-02-28T13:37:52Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9ba98609a46fee712359c7b5b365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:31:33Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
应用程序正在等待Pod,而Pod正在等待由
PersistentVolumeClaim
生成的PersistentVolumeClaim
。
但是,用户应在使用前准备好PersistentVolume
我以前的YAML缺少这样的持久卷
:
kind: PersistentVolume
apiVersion: v1
metadata:
name: postgres-data
labels:
type: local
spec:
storageClassName: local-storage
capacity:
storage: 1Gi
local:
path: /data/postgres
persistentVolumeReclaimPolicy: Retain
accessModes:
- ReadWriteOnce
storageClassName: local-storage
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: app
operator: In
values:
- postgres
使用前应准备好本地路径/data/postgres
。
Kubernetes不会自动创建它。接受的答案对我不起作用。我认为这是因为在部署状态集的POD之前不会设置应用程序密钥,从而阻止PersistentVolumeClaim与nodeSelector匹配(阻止POD以错误开始
未找到可绑定的持久卷。
)。为了修复此死锁,我为每个节点定义了一个PersistentVolume(这可能不太理想,但确实有效):
我自己也遇到了这个问题,完全陷入了一个循环,直到我意识到
StorageClass
的VolumeBindingMode
设置为WaitForFirstConsumer
而不是我预期的Immediate
值。此值是不可变的,因此您必须:
kubectl get storageclasses.storage.k8s.io gp2 -o yaml > gp2.yaml
或者,您也可以从中复制示例(确保元数据名称匹配)。以下是我所配置的:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp2
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- debug
volumeBindingMode: Immediate
StorageClass
,然后使用新的volumeBindingMode
设置为Immediate
重新创建它
arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
完成此操作后,您在创建和使用时应该没有问题。对于我来说,问题是PV和PVC中的
accessModes
字段不匹配。当PV提供RWO
/ReadWriteMany
时,PVC正在请求RWX
/ReadWriteOnce
等待第一个消费者的持久卷目标,即未计划需要此PVC的POD。描述豆荚可能会提供更多的线索。在我的例子中,节点无法调度此POD,因为节点中的POD限制为110,部署超过了它。希望这有助于更快地发现问题。增加了pod限制,重新启动节点中的kubelet即可解决此问题。是否需要nodeAffinity?对于本地存储
,我认为nodeAffinity
是必要的。我不想让PersistentVolume被安排在任何地方。@YanQiDong我无法解决它。我得到0/2个节点可用:1个节点未找到可用的持久卷进行绑定,1个节点存在pod在描述pod postgre时无法容忍的污染。你能告诉我吗?容器只能调度到本地存储PV所在的节点。
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-data-node1
labels:
type: local
spec:
[…]
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
kubectl get storageclasses.storage.k8s.io gp2 -o yaml > gp2.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp2
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- debug
volumeBindingMode: Immediate