Strimzi部署的Kafka集群无法扩容Azure托管磁盘PV问题求助
问题根因
你遇到的报错是两个限制叠加导致的:
- 你当前使用的Openshift 3.11内置Kubernetes v1.11版本,对应的in-tree
kubernetes.io/azure-disk存储驱动不支持在线扩容Azure托管磁盘,必须先将磁盘从运行的VM上卸载,才能执行扩容操作。 - Strimzi Cluster Operator为了保障Kafka集群的可用性,默认会维持Kafka StatefulSet的副本数符合CR配置的副本数,因此你手动缩副本到0的操作会被Operator自动回滚。
可行解决方案
方案1:短暂停机扩容(操作简单,适合开发测试环境)
- 临时暂停Strimzi Operator对集群的 reconcile 管控,避免手动操作被回滚:
oc annotate kafka <你的Kafka集群CR名称> strimzi.io/pause-reconciliation="true"
- 手动将Kafka StatefulSet副本数缩为0,等待所有Kafka Pod完全终止,此时关联的Azure磁盘会自动从节点卸载:
oc scale sts <Kafka StatefulSet名称> --replicas=0
- 批量编辑所有Kafka数据PVC,将
spec.resources.requests.storage修改为目标容量(如257Gi)。 - 等待扩容完成,执行
oc get pvc查看PVC状态,当status.capacity.storage更新为目标容量、且Resizing状态消失时,说明扩容完成。 - 将Kafka StatefulSet副本数恢复为原始值,等待所有Pod启动正常:
oc scale sts <Kafka StatefulSet名称> --replicas=<原始副本数>
- 验证Kafka集群读写正常、所有副本同步完成后,移除暂停注解恢复Operator管控:
oc annotate kafka <你的Kafka集群CR名称> strimzi.io/pause-reconciliation-
- 最后更新Kafka CR中
spec.kafka.storage.size为扩容后的容量,避免后续Operator reconcile时出现配置不一致。
方案2:滚动扩容(集群无停机,适合生产环境)
适合Kafka集群副本数≥2、不能接受停机的场景:
- 先修改Kafka CR中
spec.kafka.storage.size为目标容量,触发Operator滚动更新流程,首次扩容会报你遇到的磁盘挂载报错,无需处理。 - 查看第一个扩容失败的PVC对应的挂载节点:
oc describe pvc <扩容失败的PVC名称> | grep 'Mounted By:' -A1
- 排空该节点,将节点上的所有Pod(包括Kafka Pod)驱逐到其他节点,此时对应磁盘会被卸载:
oc adm drain <节点名称> --ignore-daemonsets --delete-local-data
- 等待该PVC扩容完成后,恢复节点的调度权限:
oc adm uncordon <节点名称>
- 等待Operator自动滚动到下一个Kafka副本,重复上述步骤2-4,直到所有PVC扩容完成。
注意事项
- 操作前务必对Kafka所有Topic数据做全量备份,避免操作异常导致数据丢失。
- 扩容完成后需验证所有PVC容量正确、Kafka集群所有副本处于ISR同步状态。
内容的提问来源于stack exchange,提问作者veerendra2
相关产品推荐
相关产品推荐

