pod 具有未绑定的 PersistentVolumeClaims

pod has unbound PersistentVolumeClaims

当我推送我的部署时,出于某种原因,我在 pods:

上收到错误

pod has unbound PersistentVolumeClaims

下面是我的 YAML:

这是 运行 本地的,而不是在任何云解决方案上。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.16.0 ()
  creationTimestamp: null
  labels:
    io.kompose.service: ckan
  name: ckan
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: ckan
    spec:
      containers:
        image: slckan/docker_ckan
        name: ckan
        ports:
        - containerPort: 5000
        resources: {}
        volumeMounts:
            - name: ckan-home
              mountPath: /usr/lib/ckan/
              subPath: ckan
      volumes:
      - name: ckan-home
        persistentVolumeClaim:
          claimName: ckan-pv-home-claim
      restartPolicy: Always
status: {}

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ckan-pv-home-claim
  labels:
    io.kompose.service: ckan
spec:
  storageClassName: ckan-home-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
  volumeMode: Filesystem
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: ckan-home-sc
provisioner: kubernetes.io/no-provisioner
mountOptions:
  - dir_mode=0755
  - file_mode=0755
  - uid=1000
  - gid=1000

您必须定义一个 PersistentVolume 提供磁盘 space 以供 PersistentVolumeClaim.

使用

使用 storageClass 时,Kubernetes 将启用 “动态卷配置”,它不适用于本地文件系统。


解决您的问题:

  • 提供满足声明约束的PersistentVolume(大小 >= 100Mi)
  • PersistentVolumeClaim 中删除 storageClass 或为其提供一个空值 ("")
  • 从集群中删除 StorageClass

这些曲子如何组合在一起演奏?

在创建部署状态描述时,通常知道应用程序需要哪种存储(数量、速度...)。
为了使部署具有通用性,您希望避免对存储的硬依赖。 Kubernetes 的卷抽象允许您以标准化方式提供和使用存储。

PersistentVolumeClaim 用于在部署应用程序的同时提供存储约束。

PersistentVolume 提供集群范围的卷实例,随时可供使用 ("bound")。一个 PersistentVolume 将绑定到 一个 声明。但是由于该声明的多个实例可能在多个节点上 运行,因此该卷可能被多个节点 accessed

没有 StorageClass 的 PersistentVolume 被认为是 static

"Dynamic Volume Provisioning"with 一起 StorageClass 允许集群按需提供 PersistentVolumes。 为了使其工作,给定的存储提供程序必须支持 provisioning - 这允许集群在不满足 PersistentVolumeClaim 弹出。


持久卷示例

要了解如何指定内容,建议您查看 API for your Kubernetes version, so the following example is build from the API-Reference of K8S 1.17:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: ckan-pv-home
  labels:
    type: local
spec:
  capacity:
    storage: 100Mi
  hostPath:
    path: "/mnt/data/ckan"

PersistentVolumeSpec 允许我们定义多个属性。 我选择了一个 hostPath 卷,它将本地目录映射为卷的内容。该容量允许资源调度程序根据资源需求将此卷识别为适用。


其他资源:

我 运行 解决了这个问题,但我意识到我正在使用“手动”StorageClass 类型创建我的 PV。

你的连播 期望什么样的存储 class?

您的 PVC 定义 volumeClaimTemplates --> storageClassName : "standard"

PV 规格 --> storageClassName : "standard"

如果您使用 rancher k3s kubernetes 发行版,请按照 doc

中的说明将 storageClassName 设置为 local-path
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-path-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 2Gi

要在其他发行版上使用它,请使用 https://github.com/rancher/local-path-provisioner