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来实现类似的效果。
来源:CSDN
作者:liumiaocn
链接:https://blog.csdn.net/liumiaocn/article/details/103825232