在 kubernetes 中使用 CrashLoopBackOff 状态重新部署 statefulset

问题描述

这就是我所做的:

  1. 部署有状态集。 pod 将始终退出并出现错误,以引发状态为 CrashLoopBackOff 的失败 pod:kubectl apply -f error.yaml
  2. 更改 error.yaml (echo a => echo b) 并重新部署有状态集:kubectl apply -f error.yaml
  3. 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):

  • 在重新部署之前杀死 pod
  • 在重新部署之前缩小规模
  • 在重新部署之前删除 statefulset

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

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

解决方法

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

Parallel pod management 告诉 StatefulSet 控制器并行启动或终止所有 Pod,而不是在启动或终止另一个 Pod 之前等待 Pod 变为 Running 和 Ready 或完全终止。

请记住,默认的 podManagementPolicy 是 OrderedReady

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...