Kubernetes WaitForFirstConsumer PersistentVolumeClaim在绑定前等待创建第一个使用者

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

我在一个节点中设置了一个新的k8s,它被污染了。但是当我试图创建一个简单的PostgreSQL时,
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
值。此值是不可变的,因此您必须:

  • 获取存储类yaml:

    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
    重新创建它

  • 注意:EKS clsuter可能需要创建诸如EBS或EFS之类的云资源。假设使用EBS,您应该擅长使用
    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