Kubernetes基础:重启pod的方法

大城市里の小女人 提交于 2020-01-26 01:04:43

Kubernetes没有提供诸如docker restart类似的命令用于重启容器那样重启pod的命令,一般会结合restartPolicy进行自动重启,这篇文章整理一下偶尔需要手动进行重启的时候所需要使用的方法。

事前准备

环境准备

本文使用Kubernetes 1.17,可参看下文进行快速环境搭建:

pod准备

使用如下pod的yaml文件

[root@host131 config]# cat busybox-pod-test.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: busybox-container
      image: busybox:latest
      command: ["sleep", "15"]
  restartPolicy: Never
[root@host131 config]# 

执行命令:kubectl create -f busybox-pod-volume.yaml

执行日志示例如下所示

[root@host131 ~]# kubectl get pods
No resources found in default namespace.
[root@host131 ~]# kubectl create -f busybox-pod-test.yaml 
pod/test-pod created
[root@host131 ~]# 

上述pod在15秒之后即会退出,而根据pod的生命周期的状态说明,会显示为completed的状态,状态示例如下所示:

[root@host131 ~]# kubectl get pods
NAME       READY   STATUS      RESTARTS   AGE
test-pod   0/1     Completed   0          57s
[root@host131 ~]# 

pod重启:方式1:使用replace命令替换

可以使用replace结合force选项进行重启,前提是有之前启动时所使用的yaml文件

[root@host131 ~]# kubectl replace --force -f busybox-pod-test.yaml 
pod "test-pod" deleted
pod/test-pod replaced
[root@host131 ~]# kubectl get pods
NAME       READY   STATUS              RESTARTS   AGE
test-pod   0/1     ContainerCreating   0          3s
[root@host131 ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          4s
[root@host131 ~]#

从结果中可以看出,此种方式实际上替换(replace)的过程是先进行删除然后再次创建的过程

pod重启:方式2:无yaml文件的replace方法

执行命令:kubectl get pod pod名称 -n 命名空间名称 -o yaml | kubectl replace --force -f -

没有yaml文件时可以使用-o yaml生成,然后再进行replace,执行示例日志如下所示:

[root@host131 ~]# kubectl get pods
NAME       READY   STATUS      RESTARTS   AGE
test-pod   0/1     Completed   0          5m15s
[root@host131 ~]# kubectl get pod test-pod -n default -o yaml | kubectl replace --force -f -
pod "test-pod" deleted
pod/test-pod replaced
[root@host131 ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          13s
[root@host131 ~]#

pod重启:方式3:重新创建

相当于上述replace命令的手工执行,可以根据pod生成yaml文件进行创建,先生成创建的yaml文件

[root@host131 ~]# kubectl get pods
NAME       READY   STATUS      RESTARTS   AGE
test-pod   0/1     Completed   0          3m13s
[root@host131 ~]# kubectl get pod test-pod -n default -o yaml >ttt.yml
[root@host131 ~]#

然后删除pod

[root@host131 ~]# kubectl delete pod test-pod
pod "test-pod" deleted
[root@host131 ~]# kubectl get pods
No resources found in default namespace.
[root@host131 ~]#

然后重新创建pod

[root@host131 ~]# kubectl create -f ttt.yml 
pod/test-pod created
[root@host131 ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          6s
[root@host131 ~]# 

pod重启:方式4:设定restartPolicy

前提是使用了Deployment或者直接是restartPolicy的设定不是Never,比如是Always,示例如下所示:

[root@host131 ~]# cat busybox-pod-test.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: busybox-container
      image: busybox:latest
      command: ["sleep", "15"]
  restartPolicy: Always
[root@host131 ~]#

实际使用的时候可以看出,由于此restartPolicy的作用,pod变为completed的时候会立即被重启

[root@host131 ~]# kubectl get pods
No resources found in default namespace.
[root@host131 ~]# kubectl create -f busybox-pod-test.yaml 
pod/test-pod created
[root@host131 ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          7s
[root@host131 ~]# kubectl get pods
NAME       READY   STATUS      RESTARTS   AGE
test-pod   0/1     Completed   0          25s
[root@host131 ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   1          28s
[root@host131 ~]#

pod重启:方式5:直接删除Pod

前提:使用Deployment等方式的时候,相当于在pod之上又封了一层,所以此时直接删除pod,会有Deployment根据策略进行管控,一般直接删除即可,也可以调整replica来实现类似的效果。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!