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

Yan*_*ong 3 kubernetes persistent-volumes

我在单个节点上设置了一个新的k8,这很麻烦。但是PersistentVolume,当我尝试创建简单的PostgreSQL时,不能成功创建。

以下是一些详细信息。


StorageClass从官方网页复制:https://kubernetes.io/docs/concepts/storage/storage-classes/#local

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

关于跑步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>
Run Code Online (Sandbox Code Playgroud)

关于跑步PersistentVolumeClaim

$ kubectl describe pvc
Name:          postgres-data-postgres-0
Namespace:     default
StorageClass:  local-storage
Status:        Pending
Volume:
Labels:        app=postgres
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode:    Filesystem
Events:
  Type       Reason                Age                            From                         Message
  ----       ------                ----                           ----                         -------
  Normal     WaitForFirstConsumer  <invalid> (x2 over <invalid>)  persistentvolume-controller  waiting for first consumer to be created before binding
Run Code Online (Sandbox Code Playgroud)

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"}
Run Code Online (Sandbox Code Playgroud)

Rob*_*t J 16

我自己就遇到了这个问题,完全陷入了困境,直到我意识到 的StorageClass设置VolumeBindingModeWaitForFirstConsumer我的预期值相反Immediate。该值是不可变的,因此您必须:

  1. 获取存储类yaml:

    kubectl get storageclasses.storage.k8s.io gp2 -o yaml > gp2.yaml
    
    Run Code Online (Sandbox Code Playgroud)

    或者您也可以从此处的文档复制示例(确保元数据名称匹配)。这是我的配置:

    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
    
    Run Code Online (Sandbox Code Playgroud)
  2. StorageClass并在将新volumeBindingMode设置为 重新创建之前删除旧的Immediate

注意: EKS clsuter 可能需要权限来创建 EBS 或 EFS 等云资源。假设 EBS 你应该擅长使用arn:aws:iam::aws:policy/AmazonEKSClusterPolicy.

完成此操作后,创建和使用动态配置的 PV应该没有问题。


Yan*_*ong 6

应用程序正在等待Pod,而Pod正在等待PersistentVolumea PersistentVolumeClaim。但是,PersistentVolume使用前应由用户准备。

我以前的YAML缺少PersistentVolume这样的代码:

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
Run Code Online (Sandbox Code Playgroud)

/data/postgres使用前应准备好本地路径。Kubernetes不会自动创建它。

  • 对于“本地存储”,我认为“nodeAffinity”是必要的。我不希望将 PersistentVolume 安排到任何地方。 (2认同)

vla*_*ror 5

对我来说,问题是accessModesPV 和 PVC 中的字段不匹配。PVC 正在请求RWX/ ReadWriteMany,而 PV 正在提供RWO/ ReadWriteOnce