【问题标题】:persistentvolumeclaim not found in kubernetes在 kubernetes 中找不到 persistentvolumeclaim
【发布时间】:2018-12-06 04:29:06
【问题描述】:

目前我尝试在我的 yaml 文件中实现 PersistentVolume。 我在互联网上阅读了很多文档,但我不明白为什么当我转到仪表板窗格时,我会收到此消息

persistentvolumeclaim "karaf-conf" 未找到

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: karafpod
spec:
  containers:
  - name: karaf
    image: xxx/karaf:ids-1.1.0
    volumeMounts:
    - name: karaf-conf-storage
      mountPath: "/apps/karaf/etc"
  volumes:
    - name: karaf-conf-storage
      persistentVolumeClaim:
        claimName: karaf-conf-claim

PersistentVolumeClaimKaraf.yml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: karaf-conf-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi

PersistentVolume.yaml

kind: PersistentVolume
apiVersion: v1
metadata:
  name: karaf-conf
  labels:
    type: local
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/apps/karaf/etc"

你会在下面找到命令kubectl get pv

的结果
NAME                             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                         STORAGECLASS   REASON    AGE
karaf-conf                    100Mi      RWO            Retain           Terminating   default/karaf-conf-claim                            17h
karaf-conf-persistentvolume   100Mi      RWO            Retain           Released      default/karaf-conf                                  1h

kubectl 获取 pvc

NAME                  STATUS        VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
karaf-conf-claim   Terminating   karaf-conf   10Mi       RWO            manual         17h

【问题讨论】:

  • 你能用kubectl get pv karaf-conf-persistentvolume -o yaml的输出扩展问题吗?

标签: kubernetes google-kubernetes-engine


【解决方案1】:

使用 hostPath,您不需要 PersistentVolume 或 PersistentVolumeClaim 对象,因此根据您的需要,这可能会更容易:

# file: pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: karafpod
spec:
  containers:
  - name: karaf
    image: xxx/karaf:ids-1.1.0
    volumeMounts:
    - name: karaf-conf-storage
      mountPath: "/apps/karaf/etc"  # Path mounted in container

  # Use hostPath here
  volumes:
    - name: karaf-conf-storage
      hostPath:
        path: "/apps/karaf/etc" # Path from the host

然后删除另外两个.yaml文件PersistentVolumeClaimKaraf.ymlPersistentVolume.yml

官方文档见:https://kubernetes.io/docs/concepts/storage/volumes/#hostpath

编辑:注意到原始帖子中的 spec.containers.VolumeMounts.mountPath 和 spec.containers.volumes.hostPath.path 是相同的,因此在 yaml 中添加了 cmets 以阐明每个的目的。

【讨论】:

【解决方案2】:

pv/karaf-conf 处于终止状态,尝试删除它并使用type: DirectoryOrCreate 重新创建它。

kind: PersistentVolume
apiVersion: v1
metadata:
  name: karaf-conf
  labels:
    type: local
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/apps/karaf/etc"
    type: DirectoryOrCreate

【讨论】:

    【解决方案3】:

    我认为您的问题的根本原因与Terminating 状态有关。

    作为快速解决此问题的方法,您应该创建新的 PV 和 PVC(名称与 Terminating 状态中的名称不同。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: karaf-conf-new
      labels:
        type: local
    spec:
      capacity:
        storage: 100Mi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: "/apps/karaf/etc"
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: karaf-conf-newclaim
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Mi
      
    

    编辑您的Pod yaml 以使用新的claimName

      volumes:
        - name: karaf-conf-storage
          persistentVolumeClaim:
            claimName: karaf-conf-newclaim
    

    PersistentVolumeClaim 处于“Terminating”状态时,这表明您删除了某个 Pod 正在使用的PVC。 问题是你现在发现自己处于死锁状态,换句话说,除非引用的 PVC 处于绑定状态,否则你的 'karafpod' Pod 不会启动。

    从您的输出中,我可以看到有 karaf-conf-persistentvolume PV 被绑定到 PVC:karaf-conf。我猜你已经尝试删除PVCs

    由于您的PersistentVolumes 已将ReclaimPolicy 设置为Retain,因此PVC: karaf-conf 被删除而没有问题,因为它未被任何Pods 使用,并且由于该政策,PV: karaf-conf-persistentvolume 被保留。

    但是,您的 pod: karafpod 声称 PVC: karaf-conf-claim 绑定到 PV: karaf-conf。由于此 pod 正在运行,因此无法删除 PVCPV

    如果您想保持所有名称相同,请修复。

    1. 删除pod: karafpod,你可以使用--grace-period 将其放在前面。 kubectl delete pod <PODNAME> --grace-period=0 --force
    2. 删除PVC: karaf-conf-claimPV: karaf-conf
    3. 检查是否移除了 PV 和 PVC。 kubectl get pv,pvc

    您还可以检查正在积极使用 PVC 的 Pod。可以使用this thread的命令来实现

    kubectl get pods --all-namespaces -o=json | jq -c '.items[] | {name: .metadata.name, namespace: .metadata.namespace, claimName: .spec |  select( has ("volumes") ).volumes[] | select( has ("persistentVolumeClaim") ).persistentVolumeClaim.claimName }'
    
    1. 创建PVC: karaf-conf-claimPV: karaf-conf
    2. 部署pod: karafpod

    【讨论】:

      【解决方案4】:

      我的建议是重新创建 pvpvc,并确保在配置了 hostPath 的节点主机上运行 pod。

      【讨论】:

      • 当我尝试使用 kubectl delete pvc/XXX 删除 pv 或 pvc 时,它说 persistentvolume "karaf-conf" 已删除。但是当我运行 kubectl delete pvc/XXX 时,这里是钢铁 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 2020-01-12
      • 2019-04-27
      • 1970-01-01
      • 2016-04-23
      • 2020-11-08
      相关资源
      最近更新 更多