你好。
我在尝试部署已配置为使用持久卷的 pod 时遇到问题。我的安装托管在 Hetzner Cloud 上,并且已根据提供商提供的说明配置了 Kubernetes。基本配置似乎没问题,因为我可以从提供的清单之一部署 Portainer:它正确安装 PVC 并运行。由于默认配置不会创建持久存储,因此每次我取消部署并重新部署 Portainer 时,所有数据都会丢失。
因此我继续创建PersistentVolume
,但最后一步不起作用。我无法判断问题是通用的 Kubernetes 问题还是与我与 Hetzner 的集成有关 - 但我认为首先检查第一个假设是有意义的。所以我在去 Hetzner 论坛之前先在这里问。
脚步:
我使用 Hetzner Cloud 用户界面创建了一个卷。
然后我部署了一个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
请注意,命名空间尚未定义...但我认为这不是一个严重的问题。也许我错了。
- 我从这里以及以下补丁:
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
- 但 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,因为他给了我一些有助于解决其他问题的提示。