GKE集群中RabbitMQ StatefulSet镜像更新无法滚动发布问题求助
排查项1:是否直接修改了自动生成的StatefulSet配置
通过rabbitmq-plugin创建的实例由RabbitMQ Cluster Operator管理,RabbitmqCluster自定义资源(CR)是唯一的配置真值来源,直接修改下层自动生成的StatefulSet镜像会被Operator自动回滚,不会触发滚动发布。
验证命令:kubectl get rabbitmqcluster -n <命名空间> <实例名> -o yaml
查看返回结果中spec.image字段是否仍为custom-image:v1,如果是则属于该问题。
解决方法:通过官方支持的方式更新CR配置即可:
方法1:使用rabbitmq-plugin命令直接更新kubectl rabbitmq -n <命名空间> update instance <实例名> --image=custom-image:v2
方法2:直接编辑CR配置kubectl edit rabbitmqcluster -n <命名空间> <实例名>
修改spec.image值为custom-image:v2后保存,Operator会自动触发StatefulSet的滚动更新。排查项2:StatefulSet滚动更新策略配置错误
执行命令查看StatefulSet的更新策略:kubectl get statefulset -n <命名空间> <实例名>-server -o jsonpath='{.spec.updateStrategy.type}'若返回结果为
OnDelete,则必须手动删除旧Pod才会触发镜像更新,只有返回RollingUpdate时才会自动执行滚动发布。
解决方法:修改RabbitmqClusterCR的spec.statefulSet.spec.updateStrategy.type字段为RollingUpdate,Operator会自动同步StatefulSet的策略配置。排查项3:RabbitMQ Cluster Operator运行异常
Operator本身故障会导致无法同步CR的配置变更,执行命令查看Operator状态:kubectl get pods -n rabbitmq-system
若Operator Pod未处于Running状态,执行以下命令查看日志排查故障:kubectl logs -n rabbitmq-system <Operator Pod名称>
解决方法:根据日志修复Operator异常(如权限不足、APIServer连通性失败等),Operator恢复正常后会自动同步未处理的配置变更。排查项4:RabbitMQ实例健康状态异常
若RabbitMQ实例本身处于不健康状态,Operator会暂停滚动更新避免集群不可用。执行命令查看实例状态:kubectl get rabbitmqcluster -n <命名空间>
若实例STATUS不是Running,执行以下命令查看事件定位异常:kubectl describe rabbitmqcluster -n <命名空间> <实例名>kubectl describe statefulset -n <命名空间> <实例名>-server
解决方法:先修复实例异常(如持久卷挂载失败、资源配额不足、配置参数非法等),实例恢复健康后滚动更新会自动继续。补充排查(滚动更新触发后中途卡住)
若已触发滚动更新但未完成,可查看新启动Pod的事件确认是否为镜像拉取问题,比如GKE节点无对应镜像仓库的拉取权限、v2镜像标签不存在等:kubectl describe pod -n <命名空间> <实例名>-server-0
内容的提问来源于stack exchange,提问作者Robin Antony

