首页 > 解决方案 > Kubernetes:节点找不到要绑定的可用持久卷

问题描述

我正在尝试按照此处(https://kubernetes.io/blog/2018/04/13/local-persistent-volumes-beta/)所述设置本地存储。我收到以下错误,即调度程序无法调度 pod。本地存储映射到工作节点之一。我尝试在主节点上设置本地存储,我得到了同样的错误。我哪里错了?

警告 FailedScheduling 24s (x2 over 24s) default-scheduler 0/3 个节点可用:1 个节点与节点选择器不匹配,2 个节点未找到要绑定的可用持久卷。

-------------------------------------------------------------------

kubectl get nodes -o wide
NAME                  STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION      CONTAINER-RUNTIME
rpi-k8-workernode-2   Ready    <none>   92d   v1.15.0   192.168.100.50   <none>        Raspbian GNU/Linux 9 (stretch)   4.19.42-v7+         docker://18.9.0
rpi-mon-k8-worker     Ready    <none>   91d   v1.15.0   192.168.100.22   <none>        Raspbian GNU/Linux 9 (stretch)   4.19.42-v7+         docker://18.9.0
udubuntu              Ready    master   92d   v1.15.1   192.168.100.24   <none>        Ubuntu 18.04.3 LTS               4.15.0-55-generic   docker://19.3.4

-------------------------------------------------------------------
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
------------------------------------------------------------------------

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-ghost
  namespace: ghost
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/mydrive/ghost-data/
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - rpi-mon-k8-worker
------------------------------------------------------------------------
apiVersion: v1

kind: PersistentVolumeClaim

metadata:
  name: pvc-ghost
  namespace: ghost
  labels:
    pv: pv-ghost

spec:
  accessModes:
    - ReadWriteOnce

  resources:
    requests:
      storage: 10Gi
  storageClassName: local-storage
  selector:
    matchLabels:
      name: pv-ghost
------------------------------------------------------------------------

apiVersion: apps/v1

kind: Deployment
metadata:
  name:
    deployment-ghost
  namespace: ghost
  labels:
    env: prod
    app: ghost-app

spec:
  template:
    metadata:
      name: ghost-app-pod
      labels:
        app:  ghost-app
        env:  production
    spec:
      containers:
        - name: ghost
          image: arm32v7/ghost
          imagePullPolicy: IfNotPresent
          volumeMounts:
           - mountPath: /var/lib/ghost/content
             name: ghost-blog-data
          securityContext:
            privileged: True
 volumes:
      - name: ghost-blog-data
        persistentVolumeClaim:
          claimName: pvc-ghost
      nodeSelector:
        beta.kubernetes.io/arch: arm

  replicas: 2
  selector:
    matchLabels:
      app: ghost-app


kubectl get nodes --show-labels
NAME                  STATUS   ROLES    AGE   VERSION   LABELS
rpi-k8-workernode-2   Ready    <none>   93d   v1.15.0   beta.kubernetes.io/arch=arm,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm,kubernetes.io/hostname=rpi-k8-workernode-2,kubernetes.io/os=linux
rpi-mon-k8-worker     Ready    <none>   93d   v1.15.0   beta.kubernetes.io/arch=arm,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm,kubernetes.io/hostname=rpi-mon-k8-worker,kubernetes.io/os=linux
udubuntu              Ready    master   93d   v1.15.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=udubuntu,kubernetes.io/os=linux,node-role.kubernetes.io/master=

-----------------------------------------------------------
ud@udubuntu:~/kube-files$ kubectl describe pvc pvc-ghost -n ghost
Name:          pvc-ghost
Namespace:     ghost
StorageClass:  manual
Status:        Pending
Volume:
Labels:        pv=pv-ghost
Annotations:   kubectl.kubernetes.io/last-applied-configuration:
                 {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"labels":{"pv":"pv-ghost"},"name":"pvc-ghost","namespace":"...
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode:    Filesystem
Mounted By:    <none>
Events:
  Type    Reason                Age               From                         Message
  ----    ------                ----              ----                         -------
  Normal  WaitForFirstConsumer  6s (x2 over 21s)  persistentvolume-controller  waiting for first consumer to be created before binding

标签: kubernetes

解决方案


从警告中可以看出1 node(s) didn't match node selector, 2 node(s) didn't find available persistent volumes to bind.,您在部署幽灵中设置了 a nodeSelector,因此您的一个工作节点与此选择器不匹配。如果您nodeSelector从该 .yaml 文件中删除该字段。通过这种方式,pod 将被部署到PV创建 pod 的节点。AFAIK,不可能将 pod 部署到PV曾经声称位于另一个工作节点中的工作人员。最后,在其他节点中,没有PV创建 s。您可以通过以下方式检查创建PV的 s 和PVCs:

kubectl get pv
kubectl get pvc -n <namespace>

并通过以下方式检查它们的详细信息:

kubectl describe pv <pv_name> 
kubectl describe pv <pv_name> -n <namespace>

您的问题在的官方文档中进行了解释,其中说:

声明可以指定标签选择器以进一步过滤卷集。只有标签与选择器匹配的卷才能绑定到声明。选择器可以包含两个字段:

1- matchLabels - 卷必须有一个带有这个值的标签

2- matchExpressions - 通过指定键、值列表和与键和值相关的运算符而提出的要求列表。有效的运算符包括 In、NotIn、Exists 和 DoesNotExist

因此,编辑 PersistentVolume 文件并添加标签字段,如下所示:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-ghost
  labels:
    name: pv-ghost
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/mydrive/ghost-data/
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - rpi-mon-k8-worker

没有必要添加命名空间字段,kind: persistantVolume因为PersistentVolumes绑定是独占的,并且PersistentVolumeClaims是命名空间对象。

我对其进行了测试,它对我有用。


推荐阅读