Kubernetes:将本地文件夹挂载到Pod时出现问题 - “0/1个节点可用:1个节点存在卷节点亲和性冲突。”

3
我将尝试将本地文件夹挂载为持久卷,并在其中一个Pod中使用它,但似乎这个过程存在问题,导致该Pod状态一直处于“挂起”状态。
以下是我的pv yaml文件:
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

以及PVC Yaml文件:

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

部署的yaml文件如下:

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

我发现该Pod一直处于"pending"状态:
web-deployment-d498c7f57-4cfbg                                0/1     Pending   0          26m

当我使用 "kubectl describe" 检查 Pod 状态时,结果如下:

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.

我发现的错误消息是:
  Warning  FailedScheduling  30s (x2 over 30s)  default-scheduler  0/1 nodes are available: 1 node(s) had volume node affinity conflict.

您知道我的问题出在哪里吗?非常感谢!

2个回答

4

您似乎没有符合亲和性要求的节点。

在您的PersistentVolume上取消亲和性要求:

删除此部分:

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

只使用(将local更改为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/

这类似于使用Minikube的为存储配置Pod使用PersistentVolume示例。


谢谢Jonas,当我移除亲和性后,我遇到了以下问题: PersistentVolume“pv-web”无效:spec.nodeAffinity:必需值:本地卷需要节点亲和性。 - Ken Tsoi
2
我将 "local:" 更改为 "hostPath:" 并将路径更改为绝对路径,然后它就可以工作了,非常感谢 Jonas! - Ken Tsoi
2
啊,根据你的评论,我更新了我的答案,很好的指出。 - Jonas

0
我遇到了类似的问题。根据上面的注释@ken Tsoi,问题已经解决了。以下是我的更改:
新的: kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-pv-volume labels: type: local spec: storageClassName: local-storage claimRef: name: jenkins-pv-claim namespace: devops-tools capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/jenkis_volume 我创建了路径mkdir /mnt/jenkis_volume,并更新了文件。
旧的:
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-pv-volume labels: type: local spec: storageClassName: local-storage claimRef: name: jenkins-pv-claim namespace: devops-tools capacity: storage: 10Gi accessModes: - ReadWriteOnce local: path: /mnt nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8-worker1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接