Kubernetes 持久卷在挂起状态下无限期声明
Kubernetes Persistent Volume Claim Indefinitely in Pending State
我创建了一个源自 Google Compute Engine 永久磁盘的 PersistentVolume,我已经格式化并配置了数据。 Kubernetes 表示 PersistentVolume 可用。
kind: PersistentVolume
apiVersion: v1
metadata:
name: models-1-0-0
labels:
name: models-1-0-0
spec:
capacity:
storage: 200Gi
accessModes:
- ReadOnlyMany
gcePersistentDisk:
pdName: models-1-0-0
fsType: ext4
readOnly: true
然后我创建了一个 PersistentVolumeClaim,这样我就可以将这个卷附加到多个 pods 跨多个节点。但是,kubernetes 无限期地表示它处于 pending 状态。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: models-1-0-0-claim
spec:
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 200Gi
selector:
matchLabels:
name: models-1-0-0
有什么见解吗?我感觉选择器可能有问题...
是否有可能预先配置一个包含数据的永久性磁盘并让 pods 跨多个节点都能够从中读取数据?
我很快意识到 PersistentVolumeClaim 在未指定时将 storageClassName
字段默认为 standard
。但是,在创建 PersistentVolume 时,storageClassName
没有默认值,因此选择器找不到匹配项。
以下对我有用:
kind: PersistentVolume
apiVersion: v1
metadata:
name: models-1-0-0
labels:
name: models-1-0-0
spec:
capacity:
storage: 200Gi
storageClassName: standard
accessModes:
- ReadOnlyMany
gcePersistentDisk:
pdName: models-1-0-0
fsType: ext4
readOnly: true
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: models-1-0-0-claim
spec:
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 200Gi
selector:
matchLabels:
name: models-1-0-0
使用动态配置,您不必单独创建 PV 和 PVC。在 Kubernetes 1.6+ 中,有针对 GKE 和其他一些云环境的默认供应商,它应该让您只需创建一个 PVC 并让它自动为您供应一个 PV 和一个底层永久磁盘。
有关动态配置的更多信息,请参阅:
https://kubernetes.io/blog/2017/03/dynamic-provisioning-and-storage-classes-kubernetes/
我遇到了同样的问题,其中 PersistentVolumeClaim 无限期地处于待定阶段,我尝试在 PersistentVolume 中提供 storageClassName 作为 'default' 就像我为 PersistentVolumeClaim 所做的那样,但它没有解决这个问题。
我在 persistentvolume.yml 中进行了一项更改,将 PersistentVolumeClaim 配置移到文件顶部,然后将 PersistentVolume 作为 yml 文件中的第二个配置。它已解决该问题。
我们需要确保先创建 PersistentVolumeClaim,然后再创建 PersistentVolume,以解决此 'Pending' 阶段问题。
我在测试了几次后发布了这个答案,希望它能帮助那些苦苦挣扎的人。
我在 microk8s
1.14.1 中看到过这种行为,当时两个 PersistentVolume
对 spec/hostPath/path
具有相同的值,例如
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-name
labels:
type: local
app: app
spec:
storageClassName: standard
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/k8s-app-data"
似乎 microk8s 是基于事件的(这在单节点集群上不是必需的)并且会丢弃有关任何失败操作的信息,从而导致几乎所有失败的不必要的可怕反馈。
确保您的 VM 也有足够的磁盘 space。
如果您使用的是 Microk8s,则必须先启用存储,然后才能成功启动 PersistentVolumeClaim。
就这样:
microk8s.enable storage
您需要删除部署并重新开始。
您可能还需要手动删除 "pending" PersistentVolumeClaims,因为我发现卸载创建它们的 Helm chart 并没有清除 PVC。
您可以先找到一个姓名列表:
kubectl get pvc --all-namespaces
然后删除每个名称:
kubectl delete pvc name1 name2 etc...
启用存储后,重新应用您的部署应该可以正常进行。
有同样的问题,但这是我在这里分享它以帮助社区的另一个原因。
如果你删除了PersistentVolumeClaim
,然后用相同的定义重新创建,它会永远处于Pending状态,为什么?
persistentVolumeReclaimPolicy
在 PersistentVolume
中默认为 Retain
。如果我们删除了 PersistentVolumeClaim
,PersistentVolume
仍然存在并且该卷被视为已释放。但它还不能用于另一个索赔,因为前一个索赔人的数据仍在该卷上。
因此您需要通过以下步骤手动回收卷:
删除 PersistentVolume(关联的底层存储 asset/resource,如 EBS、GCE PD、Azure 磁盘等不会被删除,仍然存在)
(可选)相应地手动清理关联存储资产上的数据
(可选)手动删除关联的存储资产(EBS、GCE PD、Azure 磁盘等)
如果您仍然需要相同的数据,您可以跳过清理和删除关联的存储资产(上面的第 2 步和第 3 步),因此只需重新创建一个具有相同存储资产定义的新 PersistentVolume
然后您应该可以重新创建 PersistentVolumeClaim
。
最后要提的是,Retain
不是 persistentVolumeReclaimPolicy
的唯一选项,以下是您可能需要使用或根据用例场景尝试的其他一些选项:
回收:对卷执行基本清理(例如,rm -rf //*
)- 使其再次可用于新的声明。只有 NFS
和 HostPath
支持回收。
删除:关联的存储资产如AWS EBS, GCE PD, Azure Disk, or OpenStack Cinder...etc
卷被删除
更多信息,请查看kubernetes documentation。
仍然需要更多说明或有任何疑问,请随时发表评论,我将非常乐意提供说明和帮助。
我遇到了同样的问题,意识到 k8s 实际上做了一个即时供应,即
- 创建pvc时,处于PENDING状态,没有创建对应的pv
- 只有在您创建了使用 pvc 的部署后,才会创建 pvc 和 pv(EBS 卷)。
我正在使用带有 kubernetes 版本 1.16
的 EKS,行为由 StorageClass Volume Binding Mode 控制。
我在使用 apache airflow(稳定)的 helmchart 时遇到了这个问题,将 storageClass 设置为 azurefile 有帮助。在这种情况下,您应该如何处理云提供商?只需搜索支持所需访问模式的存储 类。 ReadWriteMany 意味着许多进程将同时读取和写入存储。在这种情况下(天蓝色)它是 azurefile。
path: /opt/airflow/logs
## configs for the logs PVC
##
persistence:
## if a persistent volume is mounted at `logs.path`
##
enabled: true
## the name of an existing PVC to use
##
existingClaim: ""
## sub-path under `logs.persistence.existingClaim` to use
##
subPath: ""
## the name of the StorageClass used by the PVC
##
## NOTE:
## - if set to "", then `PersistentVolumeClaim/spec.storageClassName` is omitted
## - if set to "-", then `PersistentVolumeClaim/spec.storageClassName` is set to ""
##
storageClass: "azurefile"
## the access mode of the PVC
##
## WARNING:
## - must be: `ReadWriteMany`
##
## NOTE:
## - different StorageClass support different access modes:
## https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
##
accessMode: ReadWriteMany
## the size of PVC to request
##
size: 1Gi
我正在使用 microk8s
已通过 运行 下面的命令解决了问题
systemctl start open-iscsi.service
(之前使用 apt install open-iscsi
安装了 open-iscsi 但尚未启动)
然后启用存储如下
microk8s.enable storage
然后,从 Lens 中删除了 Stateful Sets 和未决的 Persistence Volume Claims,这样我就可以重新开始了。
之后工作得很好。
当您想手动将 PVC 绑定到具有现有磁盘的 PV 时,不应指定 storageClassName
...但是...云提供商已默认设置“标准”StorageClass使它总是在修补 PVC/PV.
时输入任何内容
您可以在执行 kubectl get storageclass
时检查您的提供商是否将其设置为默认值(它将被写为“(默认值”))。
要解决此问题,最好的方法是获取现有的 StorageClass YAML 并添加此注释:
annotations:
storageclass.kubernetes.io/is-default-class: "false"
申请成功:)
我创建了一个源自 Google Compute Engine 永久磁盘的 PersistentVolume,我已经格式化并配置了数据。 Kubernetes 表示 PersistentVolume 可用。
kind: PersistentVolume
apiVersion: v1
metadata:
name: models-1-0-0
labels:
name: models-1-0-0
spec:
capacity:
storage: 200Gi
accessModes:
- ReadOnlyMany
gcePersistentDisk:
pdName: models-1-0-0
fsType: ext4
readOnly: true
然后我创建了一个 PersistentVolumeClaim,这样我就可以将这个卷附加到多个 pods 跨多个节点。但是,kubernetes 无限期地表示它处于 pending 状态。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: models-1-0-0-claim
spec:
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 200Gi
selector:
matchLabels:
name: models-1-0-0
有什么见解吗?我感觉选择器可能有问题...
是否有可能预先配置一个包含数据的永久性磁盘并让 pods 跨多个节点都能够从中读取数据?
我很快意识到 PersistentVolumeClaim 在未指定时将 storageClassName
字段默认为 standard
。但是,在创建 PersistentVolume 时,storageClassName
没有默认值,因此选择器找不到匹配项。
以下对我有用:
kind: PersistentVolume
apiVersion: v1
metadata:
name: models-1-0-0
labels:
name: models-1-0-0
spec:
capacity:
storage: 200Gi
storageClassName: standard
accessModes:
- ReadOnlyMany
gcePersistentDisk:
pdName: models-1-0-0
fsType: ext4
readOnly: true
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: models-1-0-0-claim
spec:
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 200Gi
selector:
matchLabels:
name: models-1-0-0
使用动态配置,您不必单独创建 PV 和 PVC。在 Kubernetes 1.6+ 中,有针对 GKE 和其他一些云环境的默认供应商,它应该让您只需创建一个 PVC 并让它自动为您供应一个 PV 和一个底层永久磁盘。
有关动态配置的更多信息,请参阅:
https://kubernetes.io/blog/2017/03/dynamic-provisioning-and-storage-classes-kubernetes/
我遇到了同样的问题,其中 PersistentVolumeClaim 无限期地处于待定阶段,我尝试在 PersistentVolume 中提供 storageClassName 作为 'default' 就像我为 PersistentVolumeClaim 所做的那样,但它没有解决这个问题。
我在 persistentvolume.yml 中进行了一项更改,将 PersistentVolumeClaim 配置移到文件顶部,然后将 PersistentVolume 作为 yml 文件中的第二个配置。它已解决该问题。
我们需要确保先创建 PersistentVolumeClaim,然后再创建 PersistentVolume,以解决此 'Pending' 阶段问题。
我在测试了几次后发布了这个答案,希望它能帮助那些苦苦挣扎的人。
我在 microk8s
1.14.1 中看到过这种行为,当时两个 PersistentVolume
对 spec/hostPath/path
具有相同的值,例如
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-name
labels:
type: local
app: app
spec:
storageClassName: standard
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/k8s-app-data"
似乎 microk8s 是基于事件的(这在单节点集群上不是必需的)并且会丢弃有关任何失败操作的信息,从而导致几乎所有失败的不必要的可怕反馈。
确保您的 VM 也有足够的磁盘 space。
如果您使用的是 Microk8s,则必须先启用存储,然后才能成功启动 PersistentVolumeClaim。
就这样:
microk8s.enable storage
您需要删除部署并重新开始。
您可能还需要手动删除 "pending" PersistentVolumeClaims,因为我发现卸载创建它们的 Helm chart 并没有清除 PVC。
您可以先找到一个姓名列表:
kubectl get pvc --all-namespaces
然后删除每个名称:
kubectl delete pvc name1 name2 etc...
启用存储后,重新应用您的部署应该可以正常进行。
有同样的问题,但这是我在这里分享它以帮助社区的另一个原因。
如果你删除了PersistentVolumeClaim
,然后用相同的定义重新创建,它会永远处于Pending状态,为什么?
persistentVolumeReclaimPolicy
在 PersistentVolume
中默认为 Retain
。如果我们删除了 PersistentVolumeClaim
,PersistentVolume
仍然存在并且该卷被视为已释放。但它还不能用于另一个索赔,因为前一个索赔人的数据仍在该卷上。
因此您需要通过以下步骤手动回收卷:
删除 PersistentVolume(关联的底层存储 asset/resource,如 EBS、GCE PD、Azure 磁盘等不会被删除,仍然存在)
(可选)相应地手动清理关联存储资产上的数据
(可选)手动删除关联的存储资产(EBS、GCE PD、Azure 磁盘等)
如果您仍然需要相同的数据,您可以跳过清理和删除关联的存储资产(上面的第 2 步和第 3 步),因此只需重新创建一个具有相同存储资产定义的新 PersistentVolume
然后您应该可以重新创建 PersistentVolumeClaim
。
最后要提的是,Retain
不是 persistentVolumeReclaimPolicy
的唯一选项,以下是您可能需要使用或根据用例场景尝试的其他一些选项:
回收:对卷执行基本清理(例如,rm -rf //*
)- 使其再次可用于新的声明。只有 NFS
和 HostPath
支持回收。
删除:关联的存储资产如AWS EBS, GCE PD, Azure Disk, or OpenStack Cinder...etc
卷被删除
更多信息,请查看kubernetes documentation。
仍然需要更多说明或有任何疑问,请随时发表评论,我将非常乐意提供说明和帮助。
我遇到了同样的问题,意识到 k8s 实际上做了一个即时供应,即
- 创建pvc时,处于PENDING状态,没有创建对应的pv
- 只有在您创建了使用 pvc 的部署后,才会创建 pvc 和 pv(EBS 卷)。
我正在使用带有 kubernetes 版本 1.16
的 EKS,行为由 StorageClass Volume Binding Mode 控制。
我在使用 apache airflow(稳定)的 helmchart 时遇到了这个问题,将 storageClass 设置为 azurefile 有帮助。在这种情况下,您应该如何处理云提供商?只需搜索支持所需访问模式的存储 类。 ReadWriteMany 意味着许多进程将同时读取和写入存储。在这种情况下(天蓝色)它是 azurefile。
path: /opt/airflow/logs
## configs for the logs PVC
##
persistence:
## if a persistent volume is mounted at `logs.path`
##
enabled: true
## the name of an existing PVC to use
##
existingClaim: ""
## sub-path under `logs.persistence.existingClaim` to use
##
subPath: ""
## the name of the StorageClass used by the PVC
##
## NOTE:
## - if set to "", then `PersistentVolumeClaim/spec.storageClassName` is omitted
## - if set to "-", then `PersistentVolumeClaim/spec.storageClassName` is set to ""
##
storageClass: "azurefile"
## the access mode of the PVC
##
## WARNING:
## - must be: `ReadWriteMany`
##
## NOTE:
## - different StorageClass support different access modes:
## https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
##
accessMode: ReadWriteMany
## the size of PVC to request
##
size: 1Gi
我正在使用 microk8s
已通过 运行 下面的命令解决了问题
systemctl start open-iscsi.service
(之前使用 apt install open-iscsi
安装了 open-iscsi 但尚未启动)
然后启用存储如下
microk8s.enable storage
然后,从 Lens 中删除了 Stateful Sets 和未决的 Persistence Volume Claims,这样我就可以重新开始了。
之后工作得很好。
当您想手动将 PVC 绑定到具有现有磁盘的 PV 时,不应指定 storageClassName
...但是...云提供商已默认设置“标准”StorageClass使它总是在修补 PVC/PV.
您可以在执行 kubectl get storageclass
时检查您的提供商是否将其设置为默认值(它将被写为“(默认值”))。
要解决此问题,最好的方法是获取现有的 StorageClass YAML 并添加此注释:
annotations:
storageclass.kubernetes.io/is-default-class: "false"
申请成功:)