前提条件:
为了满足pod调度规则(例如高可用pod分布不同节点)的同时满足该节点有足够的资源来创建存储,csi通过调用GetCapacity(csi node driver接口)接口来实现特定节点中可用的容量赋值给csistoragecapacities.storage.k8s.io 资源
参考:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/config-and-storage-resources/csi-storage-capacity-v1/
https://github.com/kubernetes-csi/external-provisioner/tree/v3.5.0?tab=readme-ov-file#storage-capacity-arguments
问题记录:当前环境使用openebs-lvm 0.8.0版本,当升级k8s为1.27后,发现存储会调度在没有存储资源的节点上,而storageclass已经设置为WaitForFirstConsumer,且当前使用csi支持 容量csistoragecapacities,按理会正常按照GetCapacity获取对应有存储资源的节点的调度策略。
发现当前csi其中使用的csi-provisioner 版本为3.0.0,在升级kubernetes后发现csistoragecapacities资源的capacity 不能正确更新,排查openebs-lvm代码测试未发现错误,在对应的csi-controller中发现报错:
Failed to watch *v1beta1.CSIStorageCapacity: failed to list *v1beta1.CSIStorageCapacity: the server could not find the requested resource
这里发现CSIStorageCapacity版本不兼容,在对应官方库中找到离当前版本最近且版本支持v1的provisioner为3.5.0,于是更新openebs csi provisioner版本:
kubectl set image sts/openebs-lvm-controller -n kube-system csi-provisioner=registry.k8s.io/sig-storage/csi-provisioner:v3.5.0
更新后,CSIStorageCapacity正常更新,pvc可以正常创建