K8s 1.20.4(kubeadm+Flannel)使用Hetzner CSI存储时PVC挂载失败报fsGroupPolicy为空
故障根因
- Pod事件里的核心报错
expected valid fsGroupPolicy, received nil value or empty string已经把问题说的很明白了:kubelet在初始化CSI卷挂载器时,校验CSI驱动返回的节点信息失败,驱动没有提供合法的fsGroupPolicy枚举值。 - 你之前花时间调整PodSecurityPolicy、修改Pod安全上下文的操作完全没命中故障点——这个报错和权限、安全策略没有任何关系,真正的根因是版本错配:你跑的K8s集群是1.20.4版本,但是部署的Hetzner CSI直接用了master分支的开发构建版。当时那个分支的代码是面向K8s 1.22+的CSI规范开发的,其NodeGetInfo接口的返回结构和1.20版本kubelet的校验逻辑完全不兼容,才会导致挂载初始化直接失败。
修复步骤
- 先彻底卸载当前集群中运行的master版本Hetzner CSI全量组件,包括controller Deployment、节点DaemonSet、对应的RBAC资源、已注册的CSIDriver对象,避免残留的旧版本逻辑干扰新组件运行。
- 部署和K8s 1.20完全兼容的Hetzner CSI稳定正式版(即适配K8s 1.19~1.21的v1.5.4版本),不要在生产、测试环境直接拉取master分支的未发布代码。
- 手动修正集群内的CSIDriver资源定义,显式声明fsGroupPolicy规则,绕开kubelet动态从CSI驱动拉取该配置的校验逻辑:
执行配置生效后,kubelet会直接从集群的CSIDriver资源读取fsGroupPolicy配置,不会再因为驱动返回空值抛出初始化错误。apiVersion: storage.k8s.io/v1 kind: CSIDriver metadata: name: csi.hetzner.cloud spec: attachRequired: true podInfoOnMount: false fsGroupPolicy: ReadWriteOnceWithFSType volumeLifecycleModes: - Persistent - 清理之前故障产生的残留测试资源:删除调试用的
debug-pvc和对应的PV,重新创建测试PVC和Pod,验证卷挂载流程是否正常。
后续部署Kafka的注意事项
- 现有
hcloud-volumesStorageClass本身支持WaitForFirstConsumer绑定模式,和Kafka StatefulSet需要的RWO存储模式完全匹配,不需要额外调整存储类参数。 - 部署Kafka时要注意节点和存储卷的可用区亲和性,确保Pod和对应的Hetzner云盘处于同一地域(你的集群当前在nbg1可用区),避免出现卷跨区无法挂载的问题。
- 后续升级CSI驱动时,始终匹配对应K8s大版本的稳定发布版本,不要直接使用上游开发分支的构建产物,避免出现类似的接口兼容问题。
内容的提问来源于stack exchange,提问作者joel_muehlena
相关产品推荐
相关产品推荐

