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

Redeploy statefulset with CrashLoopBackOff status in kubernetes

我就是这么做的:

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

请求 pod 状态:

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

error.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):

为什么kubernetes不立即重新部署pod?

你可以设置spec.podManagementPolicy: "Parallel"

Parallel pod management tells the StatefulSet controller to launch or terminate all Pods in parallel, and not to wait for Pods to become Running and Ready or completely terminated prior to launching or terminating another Pod.

记住默认的 podManagementPolicy 是 OrderedReady

OrderedReady pod management is the default for StatefulSets. It tells the StatefulSet controller to respect the ordering guarantees demonstrated above

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