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

v09wglhw  于 2023-11-17  发布在  Kubernetes
关注(0)|答案(5)|浏览(174)

我有一个StatefulSet,有两个Pod,它有一个无头服务,每个Pod都有一个LoadBalancer服务,可以向全世界提供。
假设pod的名称是pod-0和pod-1。
如果我想删除pod-0但保持pod-1活动,我无法做到这一点。
我试

kubectl delete pod pod-0

字符串
这会删除它,但随后会重新启动它,因为StatefulSet replica设置为2。
所以我试

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


这会删除pod-0,删除pod-1,然后重新启动pod-0。我猜是因为当replica设置为1时,StatefulSet希望保持pod-0活动,而不是pod-1。
但我如何保持pod-1活动并删除pod-0?

t8e9dugd

t8e9dugd1#

StatefulSet控制器不支持这种情况。也许你能做的最好的事情就是尝试使用sleep shim自己创建pod,也许你可以更快。但是这样sts控制器就会永远不高兴。

oiopk7p5

oiopk7p52#

您可以尝试使用自定义控制器,如: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
删除deploymentStatefulSet的特定pod的问题已经存在多年,没有解决方案:https://github.com/kubernetes/kubernetes/issues/45509

nlejzf6q

nlejzf6q3#

  • Statefulset总是创建索引为0..(replica-1)的pod。
  • 如果你真的想更好地控制单个pod,我猜你需要创建单独的STS对象(replica = 1)
zazmityj

zazmityj4#

K8s 1.21+中的ReplicaSet将有PodDeletionCost POD注解来解决Deployment的问题,但到目前为止还没有解决STS的问题。

z9gpfhce

z9gpfhce5#

如果您kubectl delete了StatefulSet,但添加了--cascade=orphan选项,则StatefulSet将被删除,但Pod将保留。然后您可以按照任何顺序杀死它们。当您重新创建StatefulSet时,它应该采用剩余的Pod并创建新的Pod来替换丢失的Pod。

相关问题