为什么匹配的持久卷不绑定到匹配的持久卷声明(使用 k3s)?

tib*_*bbe 7 kubernetes k3s

我有一个看起来简单的 PV 和 PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: www-pvc
spec:
  storageClassName: ""
  volumeName: www-pv
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: www-pv
spec:
  storageClassName: ""
  claimRef:
    name: www-pvc
  capacity:
    storage: 1Mi
  accessModes:
    - ReadOnlyMany
  nfs:
    server: 192.168.1.100
    path: "/www"
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它们不会相互绑定,并且 PVC 永远保持“挂起”状态:

$ kubectl get pv,pvc
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE
persistentvolume/www-pv   1Mi        ROX            Retain           Available   /www-pvc                           107m

NAME                            STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/www-pvc   Pending   www-pv   0                                        107m
Run Code Online (Sandbox Code Playgroud)

如何调试匹配?k3s中匹配的是哪个服务?我会查看 k3s 二进制文件的日志(在 Debian 下作为服务运行)吗?

Pjo*_*erS 13

在有关持久卷的 Kubernetes 文档中,您可以找到以下信息:

\n
\n

( PersistentVolumePV) 是集群中的一块存储,由管理员配置或使用 动态配置Storage Classes

\n

( PVC PersistentVolumeClaim)是用户的存储请求。它类似于 Pod。Pod 消耗节点资源,PVC 消耗 PV 资源。

\n
\n

绑定部分您有信息:

\n
\n

如果不存在匹配的卷,声明将无限期地保持不受约束。当匹配的数量变得可用时,索赔将受到约束。例如,配置有许多 50Gi PV 的集群与请求 100Gi 的 PVC 不匹配。当集群中添加100Gi PV时,即可绑定PVC。

\n
\n

Openshift 文档 - 卷和声明预绑定中,您可以找到在使用时pre-binding跳过某些匹配的信息。

\n
\n

如果您确切地知道希望 PersistentVolumeClaim 绑定到哪个 PersistentVolume,则可以使用 volumeName 字段在 PVC 中指定 PV。该方法跳过正常的匹配和绑定过程。PVC 只能绑定到具有在volumeName 中指定的相同名称的PV。如果具有该名称的 PV 存在且可用,则无论 PV 是否满足 PVC\xe2\x80\x99s 标签选择器、访问模式和资源请求,PV 和 PVC 都会绑定。

\n
\n

第1期

\n

在您的PV配置中设置

\n
  capacity:\n    storage: 1Mi\n
Run Code Online (Sandbox Code Playgroud)\n

这意味着您拥有 1Mi 的存储空间,即约 1.04 MB。

\n

您的PVC配置为请求 1Gi,即 ~ 1.07GB。

\n
  resources:\n    requests:\n      storage: 1Gi\n
Run Code Online (Sandbox Code Playgroud)\n

PV没有满足您的PVC要求。

\n

您可以拥有许多PV示例存储,但如果请求高于,5Gi则它们都不会受到绑定,例如。但是,如果存储较高而请求较低,则它会受到限制,但会被浪费。PVC5Gi6GiPV6GiPVC5Gi1Gi

\n

第2期

\n

如果您描述您的情况,PVC您会发现Warning以下内容:

\n
Events:\n  Type     Reason         Age               From                         Message\n  ----     ------         ----              ----                         -------\n  Warning  FailedBinding  2s (x2 over 17s)  persistentvolume-controller  volume "www-pv" already bound to a different claim.\n
Run Code Online (Sandbox Code Playgroud)\n

在您的配置中,您正在使用您在和中Pre-Binding指定的名称。volumeNamePVCclaimRefPV

\n

OpenShift 文档 - 使用持久卷中对此示例进行了详细描述。在您当前的设置中,您已使用claimRef.name但未指定claimRef.namespace.

\n
$ kubectl get pv,pvc\nNAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE\npersistentvolume/www-pv   1Gi        ROX            Retain           Available   /www-pvc                           4m28s\n\nNAME                            STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\npersistentvolumeclaim/www-pvc   Pending   www-pv   0                                        4m28s\n
Run Code Online (Sandbox Code Playgroud)\n

但当你添加claimRef.namespace它就会起作用。

\n
$ kubectl get pv,pvc\nNAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE\npersistentvolume/www-pv   1Gi        ROX            Retain           Bound    default/www-pvc                           7m3s\n\nNAME                            STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\npersistentvolumeclaim/www-pvc   Bound    www-pv   1Gi        ROX                           7m3s\n
Run Code Online (Sandbox Code Playgroud)\n

您应该在原样资源中指定PVC\'s名称空间。PV\'s spec.claimRef.namespacePVCnamespaced

\n
$ kubectl api-resources | grep pv\npersistentvolumeclaims            pvc                                         true         PersistentVolumeClaim\npersistentvolumes                 pv                                          false        PersistentVolume\n
Run Code Online (Sandbox Code Playgroud)\n

解决方案

\n

在您PV更改spec.capacity.storage1Gi.

\n

在您的PV添加中spec.claimRef.namespace: default,如下例所示:

\n
spec:\n  storageClassName: ""\n  claimRef:\n    name: www-pvc\n    namespace: default        # adding namespace: defaults\n  capacity:\n    storage: 1Gi              # changed storage size\n
Run Code Online (Sandbox Code Playgroud)\n

如果您能够绑定PV和,请告诉我PVC

\n


Kri*_*sia 0

我认为问题在于PVC正在尝试获得 aPV的大小1Gi,但你的PVis 的大小1M

因此,绑定失败。您可以通过增加PV大小或减小PVC大小来解决此问题。

用于kubectl describe pvc获取有关事件和失败原因的更多信息。

为了进一步澄清,aPVC是对存储的请求,因此如果您说您需要1G声明存储但您只提供1M实际存储,则 PVC 将保持状态Pending。基于此,中定义的大小PVC应始终小于或等于PV大小。