首页 > 解决方案 > 无法附加或挂载卷:等待条件超时

问题描述

我的本地集群中的一个 pod 无法启动,因为Unable to attach or mount volumes: unmounted volumes=[nats-data-volume], unattached volumes=[nats-data-volume nats-initdb-volume kube-api-access-5b5cz]: timed out waiting for the condition出现错误。

$ kubectl get pods
NAME                                        READY   STATUS              RESTARTS   AGE
deployment-nats-db-5f5f9fd6d5-wrcpk         0/1     ContainerCreating   0          19m
deployment-nats-server-57bbc76d44-tz5zj     1/1     Running             0          19m

$ kubectl describe pods deployment-nats-db-5f5f9fd6d5-wrcpk
Name:           deployment-nats-db-5f5f9fd6d5-wrcpk
Namespace:      default
Priority:       0
Node:           docker-desktop/192.168.65.4
Start Time:     Tue, 12 Oct 2021 21:42:23 +0600
Labels:         app=nats-db
                pod-template-hash=5f5f9fd6d5
                skaffold.dev/run-id=1f5421ae-6e0a-44d6-aa09-706a1d1aa011
Annotations:    <none>
Status:         Pending
IP:
IPs:            <none>
Controlled By:  ReplicaSet/deployment-nats-db-5f5f9fd6d5
Containers:
  nats-db:
    Container ID:
    Image:          postgres:latest
    Image ID:
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Limits:
      cpu:     1
      memory:  256Mi
    Requests:
      cpu:     250m
      memory:  128Mi
    Environment Variables from:
      nats-db-secrets  Secret  Optional: false
    Environment:       <none>
    Mounts:
      /docker-entrypoint-initdb.d from nats-initdb-volume (rw)
      /var/lib/postgresql/data from nats-data-volume (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5b5cz (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  nats-data-volume:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  nats-pvc
    ReadOnly:   false
  nats-initdb-volume:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  nats-pvc
    ReadOnly:   false
  kube-api-access-5b5cz:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason       Age                 From               Message
  ----     ------       ----                ----               -------
  Normal   Scheduled    19m                 default-scheduler  Successfully assigned default/deployment-nats-db-5f5f9fd6d5-wrcpk to docker-desktop
  Warning  FailedMount  4m9s (x2 over 17m)  kubelet            Unable to attach or mount volumes: unmounted volumes=[nats-data-volume], unattached volumes=[nats-initdb-volume kube-api-access-5b5cz nats-data-volume]: timed out waiting for the condition
  Warning  FailedMount  112s (x6 over 15m)  kubelet            Unable to attach or mount volumes: unmounted volumes=[nats-data-volume], unattached volumes=[nats-data-volume nats-initdb-volume kube-api-access-5b5cz]: timed out waiting for the condition

我不知道问题出在哪里。PVs 和 PVCs 似乎都被成功应用了。

$ kubectl get pv,pvc
NAME                            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS             REASON   AGE
persistentvolume/nats-pv        50Mi       RWO            Retain           Bound    default/nats-pvc        local-hostpath-storage            21m

NAME                                  STATUS   VOLUME         CAPACITY   ACCESS MODES   STORAGECLASS             AGE
persistentvolumeclaim/nats-pvc        Bound    nats-pv        50Mi       RWO            local-hostpath-storage   21m

以下是 SC、PV 和 PVC 的配置:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-hostpath-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nats-pv
spec:
  capacity:
    storage: 50Mi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  storageClassName: local-hostpath-storage
  hostPath:
    path: /mnt/wsl/nats-pv
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nats-pvc
spec:
  volumeName: nats-pv
  resources:
    requests:
      storage: 50Mi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  storageClassName: local-hostpath-storage
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nats-db
spec:
  selector:
    matchLabels:
      app: nats-db
  template:
    metadata:
      labels:
        app: nats-db
    spec:
      containers:
        - name: nats-db
          image: postgres:latest
          envFrom:
            - secretRef:
                name: nats-db-secrets
          volumeMounts:
            - name: nats-data-volume
              mountPath: /var/lib/postgresql/data
            - name: nats-initdb-volume
              mountPath: /docker-entrypoint-initdb.d
          resources:
            requests:
              cpu: 250m
              memory: 128Mi
            limits:
              cpu: 1000m
              memory: 256Mi
      volumes:
        - name: nats-data-volume
          persistentVolumeClaim:
            claimName: nats-pvc
        - name: nats-initdb-volume
          persistentVolumeClaim:
            claimName: nats-pvc

如果我注释掉volumeMountsvolumes键,这个 pod 将成功启动。它专门针对这/var/lib/postgresql/data条路径。就像我删除nats-data-volume并保留一样nats-initdb-volume,它已成功启动。

谁能帮我我到底错在哪里?提前致谢并致以最诚挚的问候。

标签: kubernetes

解决方案


...if I remove nats-data-volume and keep nats-initdb-volume, it's started successfully.

这个PVC不能安装两次,那就是不能满足条件的地方。

查看您的规范,您似乎不介意哪个工作节点将运行您的 postgress pod。在这种情况下你不需要 PV/PVC,你可以像这样直接挂载 hostPath:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nats-db
spec:
  selector:
    matchLabels:
      app: nats-db
  template:
    metadata:
      labels:
        app: nats-db
    spec:
      containers:
        - name: nats-db
          image: postgres:latest
          envFrom:
            - secretRef:
                name: nats-db-secrets
          volumeMounts:
            - name: nats-data-volume
              mountPath: /var/lib/postgresql/data
            - name: nats-data-volume
              mountPath: /docker-entrypoint-initdb.d
          resources:
            requests:
              cpu: 250m
              memory: 128Mi
            limits:
              cpu: 1000m
              memory: 256Mi
      volumes:
        - name: nats-data-volume
          hostPath:
            path: /mnt/wsl/nats-pv
            type: DirectoryOrCreate

推荐阅读