我有一个 k8s 部署 - 我经常将一个新版本部署到 docker repo - 更改图像标签 - 并尝试使用 kubectl replace -f file.yaml
替换部署.我的副本设置为 1 - 我一次只有 1 个部署的 pod 正在运行。
当我更改图像标签(例如,将 v1 更改为 v2)并尝试替换它时 - 它会创建一个新的 pod,但它会无限期地保持在“pending”状态,而旧的 pod 保持在“Running”状态。
我认为新 pod 会等待旧 pod 终止 - 但它不会自行终止。我需要由 k8s 删除它,以便新的 pod 可以取代它。
使用 replace --force
修复了这个问题 - 但我希望它只使用 replace -f
就能工作.任何想法如何实现这一目标?
请您参考如下方法:
您看到的问题与 kubectl 替换/应用无关。真正的原因是部署默认使用 RollingUpdate 策略,默认情况下等待新 pod 运行,然后才杀死旧 pod。从您的问题中不清楚新 pod 处于 Pending 状态的原因,但在大多数情况下,这表明新 pod 缺乏计算资源。
你可以做两种不同的事情:
使用 maxUnavailable=1 的 RollingUpdate 策略。这会做你想做的 - 它会杀死旧的 pod 然后创建一个新的。
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
或者您可以指定有效执行相同操作的重新创建策略:
spec:
strategy:
type: Recreate
在此处阅读有关部署策略的更多信息: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy