如何在 Kubernetes 中重启 Pod [Quick K8s Tip]

有时您可能会遇到需要重新启动 Pod 的情况。 为了 example,如果您的 Pod 处于错误状态。

根据重启策略,Kubernetes 本身会尝试重启并修复它。

但是,如果这不起作用并且您找不到错误的根源,那么手动重新启动 Kubernetes Pod 是让您的应用程序再次运行的最快方法。

如何在 Kubernetes 中重启 Pod

不幸的是,有 没有 kubectl restart pod 命令 以此目的。 您可以通过以下几种方式重新启动 Pod:

  1. Rollout Pod 重新启动
  2. 缩放副本数量

让我详细向您展示这两种方法。

方法一:Rollout Pod 重启

从 Kubernetes 版本 1.15 开始,您可以滚动重启部署。

控制器一次杀死一个 pod 并依赖 副本集 扩展新的 Pod,直到所有的 Pod 都比重新启动的时间新。 在我看来, 这是重新启动 pod 的最佳方式,因为您的应用程序不会关闭。

笔记: 单个 pod IP 将被更改。

让我们来一个 example. 您有一个名为 my-dep 的部署,其中包含两个 pod(因为副本设置为两个)。

[email protected]:~# kubectl get deployments
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep   2/2     2            2           13s

让我们获取 pod 详细信息:

[email protected]:~# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP               NODE          NOMINATED NODE   READINESS GATES
my-dep-6d9f78d6c4-8j5fq   1/1     Running   0          47s   172.16.213.255   kworker-rj2   <none>           <none>
my-dep-6d9f78d6c4-rkhrz   1/1     Running   0          47s   172.16.213.35    kworker-rj1   <none>           <none>

现在让我们使用如下命令重启 my-dep 部署:

kubectl rollout restart deployment name_of_deployment

你还记得前面命令中的部署名称吗? 在这里使用它:

[email protected]:~# kubectl rollout restart deployment my-dep
deployment.apps/my-dep restarted

您可以使用以下方法查看旧 pod 被终止和新 pod 被创建的过程 kubectl get pod -w 命令:

[email protected]:~# kubectl get pod -w
NAME                      READY   STATUS              RESTARTS   AGE
my-dep-557548758d-kz6r7   1/1     Running             0          5s
my-dep-557548758d-svg7w   0/1     ContainerCreating   0          1s
my-dep-6d9f78d6c4-8j5fq   1/1     Running             0          69s
my-dep-6d9f78d6c4-rkhrz   1/1     Terminating         0          69s
my-dep-6d9f78d6c4-rkhrz   0/1     Terminating         0          69s
my-dep-557548758d-svg7w   0/1     ContainerCreating   0          1s
my-dep-557548758d-svg7w   1/1     Running             0          3s
my-dep-6d9f78d6c4-8j5fq   1/1     Terminating         0          71s
my-dep-6d9f78d6c4-8j5fq   0/1     Terminating         0          72s
my-dep-6d9f78d6c4-rkhrz   0/1     Terminating         0          74s
my-dep-6d9f78d6c4-rkhrz   0/1     Terminating         0          74s
my-dep-6d9f78d6c4-8j5fq   0/1     Terminating         0          76s
my-dep-6d9f78d6c4-8j5fq   0/1     Terminating         0          76s

如果您现在检查 Pod,您可以在此处看到详细信息已更改:

[email protected]:~# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP               NODE          NOMINATED NODE   READINESS GATES
my-dep-557548758d-kz6r7   1/1     Running   0          42s   172.16.213.43    kworker-rj1   <none>           <none>
my-dep-557548758d-svg7w   1/1     Running   0          38s   172.16.213.251   kworker-rj2   <none>           <none>

方法 2. 缩放副本数量

在 CI/CD 环境中,出现错误时重新启动 pod 的过程可能需要很长时间,因为它必须再次经历整个构建过程。

实现此目的的更快方法是使用 kubectl scale 命令将副本编号更改为零,一旦您设置一个大于零的数字,Kubernetes 就会创建新的副本。

让我们试试看。 首先检查您的 Pod:

[email protected]:~# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-557548758d-kz6r7   1/1     Running   0          11m
my-dep-557548758d-svg7w   1/1     Running   0          11m

获取部署信息:

[email protected]:~# kubectl get deployments
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
my-dep   2/2     2            2           12m

现在,将副本号设置为零:

[email protected]:~# kubectl scale deployment --replicas=0 my-dep
deployment.apps/my-dep scaled

然后将其设置回两个:

[email protected]:~# kubectscale deployment --replicas=2 my-dep
deployment.apps/my-dep scaled

现在检查 pod:

[email protected]:~# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-557548758d-d2pmd   1/1     Running   0          10s
my-dep-557548758d-gprnr   1/1     Running   0          10s

您已成功重启 Kubernetes Pod。

使用上述任何一种方法,在不影响最终用户的情况下,快速安全地让您的应用运行。

完成此练习后,请确保找到核心问题并修复它,因为重新启动您的 pod 不会解决根本问题。

希望你喜欢这个 Kubernetes 技巧。 不要忘记订阅更多。

拉克什耆那教
DevOps 专业 | RHCA | 詹金斯 | 吉特 | 码头工人 | Kubernetes | 稳定 | 普罗米修斯 | 格拉法纳 | AWS Cloud