kubernetesminikubepersistent-volumespersistent-volume-claims

Kubernetes: problem mounting local folder to pods - "0/1 nodes are available: 1 node(s) had volume node affinity conflict."


I try to mount a local folder as PersistentVolume and use it in one of the pods, but seems there is problem with the process and the pod stays on the status "pending".

The following is my pv yaml file:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-web
  labels:
    type: local
spec:
  storageClassName: mlo-web
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  local:
    path: ${MLO_REPO_DIR}/web/
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - mlo-node

and pvc yaml file:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-web
  namespace: mlo-dev
  labels:
    type: local
spec:
  storageClassName: mlo-web
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

and the deployment yaml file :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
  namespace: mlo-dev
  labels:
    app: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: xxxxxx/web:latest
        ports:
          - containerPort: 3000
        volumeMounts:
          - name: webdir
            mountPath: /service
...
      volumes:
        - name: webdir
          persistentVolumeClaim:
            claimName: pvc-web

I found that the pod is alway in "pending" status:

web-deployment-d498c7f57-4cfbg                                0/1     Pending   0          26m

and when I check the pod status using "kubectl describe", the following is the result:

Name:           web-deployment-d498c7f57-4cfbg
Namespace:      mlo-dev
Priority:       0
Node:           <none>
Labels:         app=web
                pod-template-hash=d498c7f57
Annotations:    <none>
Status:         Pending
IP:             
IPs:            <none>
Controlled By:  ReplicaSet/web-deployment-d498c7f57
Containers:
  web:
    Image:      xxxxxx/web:latest
    Port:       3000/TCP
    Host Port:  0/TCP
    Command:
      npm
      run
      mlo-start
    Environment:
      NODE_ENV:              <set to the key 'NODE_ENV' of config map 'env-config'>              Optional: false
      WEBPACK_DEV_SERVER:    <set to the key 'webpack_dev_server' of config map 'env-config'>    Optional: false
      REDIS_URL_SESSION:     <set to the key 'REDIS_URL' of config map 'env-config'>             Optional: false
      WORKSHOP_ADDRESS:      <set to the key 'WORKSHOP_ADDRESS' of config map 'env-config'>      Optional: false
      USER_API_ADDRESS:      <set to the key 'USER_API_ADDRESS' of config map 'env-config'>      Optional: false
      ENVCUR_API_ADDRESS:    <set to the key 'ENVCUR_API_ADDRESS' of config map 'env-config'>    Optional: false
      WIDGETS_API_ADDRESS:   <set to the key 'WIDGETS_API_ADDRESS' of config map 'env-config'>   Optional: false
      PROGRAM_BULL_URL:      <set to the key 'REDIS_URL' of config map 'env-config'>             Optional: false
      PROGRAM_PUBSUB:        <set to the key 'REDIS_URL' of config map 'env-config'>             Optional: false
      PROGRAM_API_ADDRESS:   <set to the key 'PROGRAM_API_ADDRESS' of config map 'env-config'>   Optional: false
      MARATHON_BULL_URL:     <set to the key 'REDIS_URL' of config map 'env-config'>             Optional: false
      MARATHON_API_ADDRESS:  <set to the key 'MARATHON_API_ADDRESS' of config map 'env-config'>  Optional: false
      GIT_API_ADDRESS:       <set to the key 'GIT_API_ADDRESS' of config map 'env-config'>       Optional: false
      GIT_HTTP_ADDRESS:      <set to the key 'GIT_HTTP_ADDRESS' of config map 'env-config'>      Optional: false
      LOG_URL:               <set to the key 'LOG_URL' of config map 'env-config'>               Optional: false
      LOGGER_PUBSUB:         <set to the key 'REDIS_URL' of config map 'env-config'>             Optional: false
      AUTH0_CLIENT_ID:       <set to the key 'AUTH0_CLIENT_ID' of config map 'env-config'>       Optional: false
      AUTH0_DOMAIN:          <set to the key 'AUTH0_DOMAIN' of config map 'env-config'>          Optional: false
      AUTH0_CALLBACK_URL:    <set to the key 'AUTH0_CALLBACK_URL' of config map 'env-config'>    Optional: false
      AUTH0_LOGOOUT_RETURN:  <set to the key 'AUTH0_LOGOOUT_RETURN' of config map 'env-config'>  Optional: false
      AUTH0_CLIENT_SECRET:   <set to the key 'auth0-client-secret' in secret 'env-secret'>       Optional: false
      SESSION_SECRET:        <set to the key 'session-secret' in secret 'env-secret'>            Optional: false
    Mounts:
      /service from webdir (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-w9v7j (ro)
Conditions:
  Type           Status
  PodScheduled   False 
Volumes:
  webdir:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  pvc-web
    ReadOnly:   false
  default-token-w9v7j:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-w9v7j
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  30s (x2 over 30s)  default-scheduler  0/1 nodes are available: 1 node(s) had volume node affinity conflict.

The error message I found is :

  Warning  FailedScheduling  30s (x2 over 30s)  default-scheduler  0/1 nodes are available: 1 node(s) had volume node affinity conflict.

Do you know where my problem is? Many Thanks!


Solution

  • You doesn't seem to have a Node that match your affinity requirement.

    Remove the affinity requirement on your PersistentVolume:

    Remove this part:

      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - mlo-node
    

    and only use (and change local to hostPath):

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: pv-web
      labels:
        type: local
    spec:
      storageClassName: mlo-web
      capacity:
        storage: 1Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: /absolute-path/web/
    

    This is similar to the Configure a Pod to Use a PersistentVolume for Storage example, also using Minikube.