【问题标题】:Kubernetes : How to delete a specific pod managed by StatefulSet without it being recreated?Kubernetes:如何删除 StatefulSet 管理的特定 pod 而无需重新创建它?
【发布时间】:2020-01-22 23:57:26
【问题描述】:

我有一个有 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?

【问题讨论】:

  • 你为什么要这样做?为什么“pod-0”不存在真的很重要?
  • 每个 pod 都包含用户创建的特定数据。因此有状态集。我想存储用户创建的所有数据,并在用户下次需要时将其返回。当一个用户创建了许多 Pod 或许多用户创建了许多 Pod 时,我希望能够根据用户请求关闭任意 Pod。
  • 解决这个问题的一种方法是为每个 pod 创建一个副本数为 1 的 StatefulSet。这将确保可以根据用户请求删除任何 pod,并且仍然保留其后面的持久卷。但这意味着要管理很多 StatefulSet ......我认为效率有点低。
  • 一种方式是设置持久化卷,另一种方式是设置Redis或其他缓存方案。因此,您不必介意丢失任何豆荚。

标签: kubernetes kubernetes-pod kubernetes-statefulset


【解决方案1】:

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

【讨论】:

  • 什么是睡眠垫片?如何创建一个副本数为 1 的新 StatefulSet 来托管每个 pod?这样任何 pod 都可以独立删除。但它不能很好地扩展。状态集太多
  • 听起来您的用例与有状态集的用例不匹配。 1 个副本的 Deployment 和 Sts 之间没有太大区别。
【解决方案2】:

您可以尝试使用自定义控制器,例如: 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

【讨论】:

    【解决方案3】:
    • Statefulset 始终创建索引为 0..(replica-1) 的 pod。
    • 如果您真的想更好地控制单个 pod,我想您需要创建单独的 STS 对象(副本 = 1)

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 2017-04-02
      • 2019-11-30
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 2018-08-17
      • 2020-10-23
      • 1970-01-01
      相关资源
      最近更新 更多