在 kubernetes 中重新部署具有 CrashLoopBackOff 状态的 statefulset
Redeploy statefulset with CrashLoopBackOff status in kubernetes
我就是这么做的:
- 部署有状态集。 pod 将始终以错误退出,以引发处于状态
CrashLoopBackOff
: kubectl apply -f error.yaml
的失败 pod
- 更改 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
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),我也遇到过 pods 从未重新部署的情况。不幸的是,我无法在一个简单的示例中重现此行为。
你可以设置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
如果您的应用程序需要有序更新,那么您无能为力。
我就是这么做的:
- 部署有状态集。 pod 将始终以错误退出,以引发处于状态
CrashLoopBackOff
:kubectl apply -f error.yaml
的失败 pod
- 更改 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
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),我也遇到过 pods 从未重新部署的情况。不幸的是,我无法在一个简单的示例中重现此行为。
你可以设置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
如果您的应用程序需要有序更新,那么您无能为力。