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

Mat*_*s M 5 kubernetes kubectl kubernetes-helm

我就是做这个的:

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

请求 Pod 状态:

$ kubectl get pod errordemo-0
NAME          READY   STATUS             RESTARTS   AGE
errordemo-0   0/1     CrashLoopBackOff   15         59m
Run Code Online (Sandbox Code Playgroud)

错误.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
Run Code Online (Sandbox Code Playgroud)

问题

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

  • 在重新部署之前杀死 Pod
  • 重新部署之前缩小规模
  • 重新部署之前删除有状态集

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

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

Mat*_*att 2

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

并行 Pod 管理告诉 StatefulSet 控制器并行启动或终止所有 Pod,而不是等待 Pod 变为“正在运行”和“就绪”或完全终止后再启动或终止另一个 Pod。

请记住,默认的 podManagementPolicy 是OrderedReady

OrderedReady Pod 管理是 StatefulSet 的默认设置。它告诉 StatefulSet 控制器遵守上面演示的排序保证

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