【问题标题】:How to restart a failed pod in kubernetes deployment如何在 Kubernetes 部署中重新启动失败的 pod
【发布时间】:2018-08-30 13:10:20
【问题描述】:

我在 Kubernetes 集群中有 3 个节点。我创建了一个daemonset 并将其部署在所有 3 台设备中。这个daemonset 创建了 3 个 pod 并且它们成功运行。但由于某些原因,其中一个吊舱失败了。

我需要知道如何在不影响守护进程集中其他 pod 的情况下重新启动这个 pod,同时又不创建任何其他守护进程集部署?

谢谢

【问题讨论】:

  • 我对“在所有 3 台设备中部署它”有点困惑。通常,您使用例如创建一个守护程序集。 kubectl 通过 API 服务器,然后 kubernetes 负责在每个节点(设备)上创建 pod。失败的 Pod 也应该自动被新的 Pod 替换。您能否将您的守护程序集的 yaml 定义添加到此问题中?对于失败的 pod,kubectl describe pod 的输出会有所帮助。您可以使用 kubectl get pod -a 列出已终止的 pod

标签: kubernetes


【解决方案1】:

kubectl delete pod <podname> 它将删除这个 pod,Deployment/StatefulSet/ReplicaSet/DaemonSet 将重新安排一个新的 pod

【讨论】:

  • 您可以使用选择器删除所有 pod:kubectl delete pod -l app=my-app
  • 如果你得到Error from server (NotFound): pods <podname> not found 我意识到我还需要添加命名空间kubectl delete pod <podname> -n <namespace>
【解决方案2】:

仅供阅读本文的其他人使用...

更好的解决方案(恕我直言)是实现一个liveness prob,如果它未能通过探测测试,它将强制 pod 重新启动容器。

这是 K8s 开箱即用的一个很棒的功能。这是自动修复。

同时查看 pod lifecycle docs

【讨论】:

  • 它会重启一个容器,但不会重启一个 pod。
【解决方案3】:

kubectl -n <namespace> delete pods --field-selector=status.phase=Failed

我认为当你想重启 1 个或多个失败的 pod 时,上面的命令非常有用:D

而且我们不需要关心失败的 pod 的名称。

【讨论】:

    【解决方案4】:

    还有其他可能实现您想要的:

    • 只需使用rollout 命令

      kubectl rollout restart deployment mydeploy

    • 您可以设置一些环境变量来强制您的部署 pod 重新启动:

      kubectl set env deployment mydeploy DEPLOY_DATE="$(date)"

    • 您可以将部署规模缩小到零,然后恢复到某个正值

        kubectl scale deployment mydeploy --replicas=0
        kubectl scale deployment mydeploy --replicas=1
    

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 2020-07-05
      • 2020-05-26
      • 2020-08-03
      相关资源
      最近更新 更多