Kubernetes:如何在不重新创建StatefulSet的情况下删除特定Pod?

时间:2020-01-22 23:57:26

标签: kubernetes kubernetes-pod kubernetes-statefulset

我有一个带有2个吊舱的StatefulSet。它具有无头服务,每个吊舱都具有LoadBalancer服务,该服务可向世界各地提供。

比方说,窗格名称是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?

3 个答案:

答案 0 :(得分:1)

StatefulSet控制器不支持此功能。可能最好的办法就是尝试使用睡眠垫片自己创建该Pod,也许您可​​能会更快。但是,然后sts控制器将永远不高兴。

答案 1 :(得分:0)

  • Statefulset始终创建索引为0 ..(副本1)的Pod。
  • 如果您真的想更好地控制各个Pod,我想您需要创建单独的STS对象(副本= 1)

答案 2 :(得分:0)

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

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

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

移除deploymentStatefulSet的特定吊舱的问题已经提出多年,但一直没有解决: https://github.com/kubernetes/kubernetes/issues/45509