0

我有一个有 2 个 pod 的 StatefulSet。它有一个无头服务,每个 pod 都有一个 LoadBalancer 服务,可以让全世界都使用它。

假设 pod 名称是 pod-0 和 pod-1。

如果我想删除 pod-0 但保持 pod-1 处于活动状态,我无法做到这一点。

我试过了

kubectl delete pod pod-0

这会删除它,但随后会重新启动它,因为 StatefulSet 副本设置为 2。

所以我尝试了

kubectl delete pod pod-0
kubectl scale statefulset some-name --replicas=1

这将删除 pod-0,删除 pod-1,然后重新启动 pod-0。我猜是因为当副本设置为 1 时,StatefulSet 想要保持 pod-0 处于活动状态而不是 pod-1。

但是如何保持 pod-1 处于活动状态并删除 pod-0?

4

3 回答 3

1

您可以尝试使用自定义控制器,例如: https ://github.com/openkruise/kruise/

如果您使用CloneSet自定义资源,则可以通过选择性移除 pod 来进行更精细的粒度控制。

apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
spec:
  # ...
  replicas: 4
  scaleStrategy:
    podsToDelete:
    - sample-9m4hp # you select which pod to remove

https://openkruise.io/en-us/docs/cloneset.html

deployment删除 a or的特定 pod 的问题StatefulSet已经打开多年没有解决: https ://github.com/kubernetes/kubernetes/issues/45509

于 2020-10-27T16:35:43.620 回答
1

StatefulSet 控制器不支持此功能。可能您能做的最好的事情就是尝试使用 sleep shim 自己创建该 pod,也许您可​​以更快。但随后 sts 控制器将永远不开心。

于 2020-01-23T03:03:57.617 回答
0
  • Statefulset 总是创建索引为 0..(replica-1) 的 pod。
  • 如果您真的想更好地控制单个 pod,我想您需要创建单独的 STS 对象(副本 = 1)
于 2020-01-23T03:52:22.207 回答