k8s StatefulSet从1/1变为0/0无变更记录原因排查
问题根因
StatefulSet的副本数被人通过kubectl手动改成了0,控制器自动回收了所有关联Pod,导致就绪状态变为0/0。这类手动扩缩容操作不会触发Helm版本更新,也不会生成新的rollout修订版本,所以你查不到变更记录。
核心证据
- 你导出的StatefulSet YAML里
spec.replicas明确写的是0,K8s控制器的逻辑就是始终让实际运行Pod数和replicas声明值对齐,声明为0自然会清空所有Pod。 - 资源的
managedFields字段直接记录了操作来源和时间:
这段记录说明2022-06-24 11:37:22,有人通过kubectl客户端直接修改了这个StatefulSet的replicas字段,和你发现故障的时间完全匹配。- apiVersion: apps/v1 fieldsType: FieldsV1 fieldsV1: f:spec: f:replicas: {} manager: kubectl operation: Update time: "2022-06-24T11:37:22Z"
为什么查不到变更历史
kubectl rollout history只会记录**Pod模板(spec.template)**变更触发的滚动更新版本,单纯修改replicas属于扩缩容操作,不会改动Pod模板,因此不会生成新的修订版本,所以你查询只会看到最初的REVISION 1。- 这次修改是直接操作StatefulSet资源,没有走
helm upgrade/helm rollback流程,Helm的发布历史里自然也不会留记录。后续如果执行helm upgrade操作,replicas值会被Chart里定义的默认值覆盖。
修复方法
直接把副本数改回你预期的数值即可,比如原本是1副本就执行:
kubectl scale sts sts-test -n proxy --replicas=1
如果要避免后续再出现这类问题:
- 可以给Helm管理的资源加上
"helm.sh/resource-policy": keep注解,避免手动调整被后续Helm操作覆盖 - 收敛集群操作权限,禁止无关人员直接通过kubectl修改Helm托管的资源
内容的提问来源于stack exchange,提问作者moluzhui
相关产品推荐
相关产品推荐

