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

Kubernetes:如何在不重新创建的情况下删除由StatefulSet管理的特定pod?,kubernetes,kubernetes-pod,kubernetes-statefulset,Kubernetes,Kubernetes Pod,Kubernetes Statefulset,我有一套有两个豆荚的大礼包。它有一个无头服务,每个吊舱都有一个负载平衡器服务,使它可以向全世界提供 假设吊舱的名称是吊舱0和吊舱1 如果我想删除pod-0,但保持pod-1处于活动状态,我无法执行此操作 我试过了 kubectl delete pod pod-0 这会删除它,但会重新启动它,因为StatefulSet replica设置为2 所以我试过了 kubectl delete pod pod-0 kubectl scale statefulset some-name --replica

我有一套有两个豆荚的大礼包。它有一个无头服务,每个吊舱都有一个负载平衡器服务,使它可以向全世界提供

假设吊舱的名称是吊舱0和吊舱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?

状态集控制器不支持此操作。也许你能做的最好的事情就是试着用睡眠垫片自己制作一个豆荚,也许你可以更快。但是sts控制器将永远不快乐。

这是StatefulSet控制器不支持的。也许你能做的最好的事情就是试着用睡眠垫片自己制作一个豆荚,也许你可以更快。但是sts控制器将永远不快乐。

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

      您可以尝试使用自定义控制器,如:

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

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

      移除
      部署
      状态集
      的特定POD的问题多年来一直没有解决:

      您可以尝试使用自定义控制器,如:

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

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

      移除
      部署
      状态集
      的特定POD的问题多年来一直没有解决:

      你为什么要这么做?为什么“pod-0”不存在真的很重要?每个pod都包含用户创建的特定数据。因此有状态集。我想存储用户创建的所有数据,并在下次用户需要时将其返回。当一个用户创建了许多pod或许多用户创建了许多pod时,我希望能够根据用户请求关闭任意pod。解决方法之一是为每个pod创建一个副本计数为1的状态集。这将确保可以根据用户请求删除任何pod,并且仍然保留其后面的持久卷。但这将意味着要管理大量的statefulset..我认为效率有点低。一种方法是使用持久卷设置它,另一种方法是设置Redis或其他缓存解决方案。所以你不介意丢失任何豆荚。你为什么要这么做?为什么“pod-0”不存在真的很重要?每个pod都包含用户创建的特定数据。因此有状态集。我想存储用户创建的所有数据,并在下次用户需要时将其返回。当一个用户创建了许多pod或许多用户创建了许多pod时,我希望能够根据用户请求关闭任意pod。解决方法之一是为每个pod创建一个副本计数为1的状态集。这将确保可以根据用户请求删除任何pod,并且仍然保留其后面的持久卷。但这将意味着要管理大量的statefulset..我认为效率有点低。一种方法是使用持久卷设置它,另一种方法是设置Redis或其他缓存解决方案。所以你不介意丢失任何豆荚。什么是睡眠垫片?创建一个副本计数为1的新状态集来承载每个pod怎么样?这样,任何pod都可以独立删除。但它不能很好地扩展。太多statefulsets听起来您的用例与statefulsets不匹配。1副本的部署和Sts之间没有太大区别。什么是睡眠垫片?创建一个副本计数为1的新状态集来承载每个pod怎么样?这样,任何pod都可以独立删除。但它不能很好地扩展。太多statefulsets听起来您的用例与statefulsets不匹配。对于1个副本,部署和Sts之间没有太大区别。