在kubernetes中重新部署状态为CrashLoopBackOff的statefulset

在kubernetes中重新部署状态为CrashLoopBackOff的statefulset,kubernetes,kubernetes-helm,kubectl,Kubernetes,Kubernetes Helm,Kubectl,我就是这么做的: 部署一个有状态集。pod将始终以错误退出,以引发状态为的失败podCrashLoopBackOff:kubectl apply-f error.yaml 更改error.yaml(echo a=>echo b)并重新部署有状态集:kubectl apply-f error.yaml Pod保持错误状态,不会立即重新部署,而是等待一段时间后Pod重新启动 请求pod状态: $ kubectl get pod errordemo-0 NAME READY ST

我就是这么做的:

  • 部署一个有状态集。pod将始终以错误退出,以引发状态为的失败pod
    CrashLoopBackOff
    kubectl apply-f error.yaml
  • 更改error.yaml(
    echo a
    =>
    echo b
    )并重新部署有状态集:
    kubectl apply-f error.yaml
  • Pod保持错误状态,不会立即重新部署,而是等待一段时间后Pod重新启动
  • 请求pod状态:

    $ kubectl get pod errordemo-0
    NAME          READY   STATUS             RESTARTS   AGE
    errordemo-0   0/1     CrashLoopBackOff   15         59m
    
    错误。yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: errordemo
      labels:
        app.kubernetes.io/name: errordemo
    spec:
      serviceName: errordemo
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: errordemo
      template:
        metadata:
          labels:
            app.kubernetes.io/name: errordemo
        spec:
          containers:
            - name: demox
              image: busybox:1.28.2
              command: ['sh', '-c', 'echo a; sleep 5; exit 1']
          terminationGracePeriodSeconds: 1
    
    问题

    即使pod处于错误状态,我如何实现立即重新部署? 我找到了这些解决方案,但我想用一个命令来实现这一点(在现实生活中,我正在使用helm,我只想为我的部署调用
    helm upgrade
    ):

    • 在重新部署前杀死吊舱
    • 在重新部署之前缩小规模
    • 在重新部署之前删除statefulset
    为什么库伯内特斯不立即重新部署吊舱

    • 在我的演示示例中,我必须等到kubernetes在等待一段时间后尝试重新启动pod
    • 没有错误的pod(例如,
      echo A;sleep 10000;
      )将立即重新启动。这就是为什么我设置了
      terminationGracePeriodSeconds:1
    • 但在我的实际部署中(在我使用头盔的地方),我也遇到了这样的情况:吊舱从未重新部署过。不幸的是,我不能在一个简单的例子中重现这种行为

    您可以设置
    spec.podManagementPolicy:“并行”

    通知StatefulSet控制器并行启动或终止所有Pod,在启动或终止另一个Pod之前,不要等待Pod运行、准备就绪或完全终止

    请记住,默认的podManagementPolicy是
    OrderedReady

    是statefulset的默认值。它告诉StatefulSet控制器遵守上面演示的排序保证


    如果您的应用程序需要有序更新,那么您将无能为力。

    您可以向部署模板添加一个新注释,如修订版或类似的内容,添加变量{{.Release.revision}。如果您运行helm升级,这将强制部署新版本。。。希望这有帮助。如果没有,那也许我没有明白你的意思。谢谢,这很有帮助!我的州里只有一个吊舱。我使用statefulset是因为我需要一个单例。还有一个问题:我的用例是一个严格的单例。并行选项是否影响在创建新pod之前必须关闭pod的规则?“等待……完全终止”到底是什么意思?在我的测试中,一切似乎都按预期进行。也就是说,pod在创建新pod之前首先关闭。如果订购的pod已准备好,当有例如3个pod-0、pod-1、pod-2时,k8s将首先移除pod-2,并确保在开始移除pod-1之前终止。当pod-1完全终止时,并且只有在那时它才开始终止pod-0。在它们全部终止后,它将开始生产新的吊舱。一个接一个。在并行策略的情况下,k8s仍然在开始旋转之前等待POD终止。现在,POD在它们的位置上,但在并行中这样做。这意味着当有3个pod时,它们都可以一次终止,一旦一个pod完全终止,k8s将在其位置上旋转一个新的pod。这很好,因为正如名称所示,StareSets是有状态的-这意味着您很可能在某个地方使用持久卷来持久化状态。在这种情况下,升级时,您很可能希望新pod在旧pds之后继承此数据卷,但为了实现这一点,旧pod必须释放该卷,这就是k8s等待旧pod完全终止的原因,以释放卷,以便将其装入新pod中。我希望这是有意义的