背景:
ACK1.16集群升级到1.18版本时,CSI Block Volume出现一个不兼容的问题需要处理;
即:需要将1.16版本的节点(Kubelet)上使用Block Volume的Pod先迁移到1.18版本的节点上,然后再升级1.16版本节点;
什么是Block Volume:https://kubernetes.io/zh/docs/concepts/storage/persistent-volumes/#raw-block-volume-support
原因:
Kubernetes在1.17版本中对Block Volume的GlobalPath目录结构做了修改,这样就导致在1.16版本挂载的Block Volume在1.18版本上无法识别。
所以需要遵循:在一个版本挂载的Block Volume必须在相同版本上进行卸载;问题详见:
https://github.com/kubernetes/kubernetes/pull/74026
ACK解决方案:
ACK在1.18 Kubernetes(kubelet)做了兼容,即让1.18版本kubelet在卸载block volume时,也认识1.16版本的目录结构;
但此问题在不同场景的行为有区别,目前对以下场景具有不同的兼容性。
- 兼容直接升级:
以下场景在升级1.18集群,可以直接升级:
通过StatefulSet部署的应用挂载了Block Volume,
通过单个Pod部署的应用挂载了Block Volume,
- 不兼容直接升级:
以下场景还不兼容,您升级时需要遵循社区的Drain方案,进行排水或者先将挂载Block Volume的pod停掉:
单个Block Volume被同一个节点的多个Pod同时挂载的场景;
通过Deployment部署pod,并挂载了Block Volume;
升级注意:
对于不兼容的场景,您不要对进群进行升级,除非使用社区排水方案,或者联系我们一起看一下具体场景并给出升级方案;