【发布时间】:2021-05-10 15:18:41
【问题描述】:
我就是这样做的:
- 部署有状态集。 pod 将始终以错误退出以引发状态为
CrashLoopBackOff的失败 pod: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
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 的情况。不幸的是,我无法在一个简单的示例中重现此行为。
【问题讨论】:
-
您可以在部署模板中添加新注释,例如修订或类似内容,添加变量 {{ .Release.Revision }}。如果您运行 helm upgrade,这应该会强制使用新版本进行部署......希望这会有所帮助。如果没有,那么也许我没有明白你的意思。
标签: kubernetes kubernetes-helm kubectl