Kubernetes:Pod 无法挂载 PVC,尽管后者似乎已正确绑定到 PV

Kubernetes:Pod 无法挂载 PVC,尽管后者似乎已正确绑定到 PV

你好。

我在尝试部署已配置为使用持久卷的 pod 时遇到问题。我的安装托管在 Hetzner Cloud 上,并且已根据提供商提供的说明配置了 Kubernetes。基本配置似乎没问题,因为我可以从提供的清单之一部署 Portainer:它正确安装 PVC 并运行。由于默认配置不会创建持久存储,因此每次我取消部署并重新部署 Portainer 时,所有数据都会丢失。

因此我继续创建PersistentVolume,但最后一步不起作用。我无法判断问题是通用的 Kubernetes 问题还是与我与 Hetzner 的集成有关 - 但我认为首先检查第一个假设是有意义的。所以我在去 Hetzner 论坛之前先在这里问。

脚步:

  1. 我使用 Hetzner Cloud 用户界面创建了一个卷。

  2. 然后我部署了一个PV:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: portainer
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-portainer-test
      namespace: portainer
      labels:
        env: test
    spec:
      storageClassName: portainer-test
      accessModes:
        - ReadWriteOnce
      capacity:
        storage: 10Gi
      persistentVolumeReclaimPolicy: Retain
      volumeMode: Filesystem
      csi:
        driver: csi.hetzner.cloud
        fsType: ext4
        volumeHandle: "pv_id"

pv_id是我可以通过 Hetzner 用户界面看到的卷 ID。

我可以通过以下方式查看 PV kubelet get pv -A

NAMESPACE   NAME                                 CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS     REASON   AGE
            persistentvolume/pv-portainer-test   10Gi       RWO            Retain           Available           portainer-test            71s

请注意,命名空间尚未定义...但我认为这不是一个严重的问题。也许我错了。

  1. 我从这里以及以下补丁:​
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: portainer
      namespace: portainer
    spec:
      storageClassName: portainer-test
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: "10Gi"

现在kubectl get pvc,pv -A我看到 PVC 已经绑定到 PV:

​NAMESPACE   NAME                              STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS     AGE
portainer   persistentvolumeclaim/portainer   Bound    pv-portainer-test   10Gi       RWO            portainer-test   16m

NAMESPACE   NAME                                 CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS     REASON   AGE
            persistentvolume/pv-portainer-test   10Gi       RWO            Retain           Bound    portainer/portainer   portainer-test            17m
  1. 但 Portainer 吊舱却永远处于该ContainerCreating状态。kubectl describe我看到了原因:

Warning  FailedAttachVolume  2s (x7 over 38s)  attachdetach-controller  AttachVolume.Attach failed for volume "pv-portainer-test" : rpc error: code = FailedPrecondition desc = failed to publish volume: volume is attached

因此看起来它在抱怨,因为 PV 已经连接上了......但事实上它应该精确地连接到那个吊舱上。

答案1

通常你不需要先创建 PV,当你创建 PVC 时,PV 会自动创建。但是,让我们保持原样,并且对你的存储类有一个疑问portainer-test,你是如何创建的?

如果您从头开始,我想您已经为 Hetzner 的 API 令牌创建了密钥并启用了 CSI 驱动程序,对吗?那么请求 PVC 和部署Pod应该不成问题,除非 Kubernetes 支持该驱动程序类型。我不知道您使用的是哪种类型,但请注意 Kubernetes支持csi.hetzner.cloud仅适用于v0.3, v1.0版本。

假设你之前所做的一切都正确无误,并且 Kubernetes 版本(1.13 或更新版本)和驱动程序版本都很好。那么,这里是指导关于如何手动创建 PersistentVolume 对象来表示现有卷:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-portainer-tes
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: csi.hetzner.cloud
    volumeHandle: portainer
    readOnly: false
    fsType: ext4
    volumeAttributes:
      foo: bar
    controllerPublishSecretRef:
      name: mysecret1
      namespace: mynamespace
    nodeStageSecretRef:
      name: mysecret2
      namespace: mynamespace
    nodePublishSecretRef
      name: mysecret3
      namespace: mynamespace

然后连接并安装通过部署 来管理卷Pod。当引用 CSI 卷的 pod 被调度时,Kubernetes 将针对外部 CSI 插件(ControllerPublishVolume、NodeStageVolume、NodePublishVolume 等)触发适当的操作,以确保指定的卷已连接、安装并可供 pod 中的容器使用。

注意:CSI 驱动程序数量限制为 16,请检查您的限制是否接近 16

答案2

这个问题与 k8s 无关,但特定于 Hetzner。在项目配置中,我将卷附加到固定服务器,这显然使其无法通过 CSI 驱动程序进行附加。Hetzner Cloud 论坛向我指出了这一点。

无论如何,我都要感谢 Bazhikov,因为他给了我一些有助于解决其他问题的提示。

相关内容