如何在Kubernetes中重启Pod

有时您会遇到需要重新启动Pod的情况。 例如,如果您的模块处于错误状态。

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

但是,如果那行不通,并且您找不到错误的根源,那么手动重启Kubernetes Pod是使您的应用重新启动并重新运行的最快方法。

如何在Kubernetes中重启Pod

不幸的是,没有为此目的使用kubectl restart pod命令。 以下是重启Pod的一些方法:

  1. 部署模块重新启动
  2. 缩放副本数量

让我们向您详细介绍这两种方法。

方法1:重新启动部署模块

从Kubernetes 1.15开始,您可以连续重新启动部署。

控制器一次杀死一个模块,然后依靠ReplicaSet扩展新模块,直到所有模块都比重启时间新。 我们认为,这是重新启动Pod的最佳方法,因为您的应用程序不会崩溃。

注意各个模块的IP地址将被更改。

让我们举个例子。 您有一个名为my-dep的部署,该部署有两个模块(因为副本设置为两个)。

[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

您可以使用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

如果现在检查模块,您将看到详细信息已在此处更改:

[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环境中,发生错误时重新加载模块的过程可能需要很长时间,因为它必须再次经历整个构建过程。

一种更快的方法是使用kubectl scale命令将副本数更改为零,并且一旦将数量设置为大于零,Kubernetes就会创建新副本。

我们试试吧。 首先检查您的吊舱:

[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

立即查看广告连播:

[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模块。

使用以上任何一种方法可以快速安全地使您的应用程序正常运行,而不会影响最终用户。

完成本练习后,请确保找到根本问题并加以解决,因为重新启动模块将无法解决根本问题。

我希望您喜欢Kubernetes的技巧。 不要忘记订阅更多。

Sidebar