Skip to main content
 首页 » 编程设计

kubernetes之kubectl replace -f 在 Pending 状态下无限期地创建 pod

2024年12月31日19bluestorm

我有一个 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