重启 Kubernetes Pod的几种方式

0x00 前言

在使用 docker 的过程当中,咱们可使用docker restart {container_id}来重启容器,可是在 kubernetes 中并无重启命令(没有 kubectl restart {podname}),有时候咱们的 Pod 出现 Bug意外终止,致使咱们须要重启 Pod ,却没有一个很好的方式,特别是没有 yaml 文件的状况下,因此我总结了如下几种重启 Pod 的方式。docker

0x01 方法 1

有最新的 yaml 文件。spa

在有 yaml 文件的状况下能够直接使用kubectl replace --force -f xxxx.yaml 来强制替换Pod 的 API 对象,从而达到重启的目的。以下图:
image.pngrest

0x02 方法 2

没有 yaml 文件,可是使用的是 Deployment 对象。code

  1. kubectl scale deployment esb-admin --replicas=0 -n {namespace}
  2. kubectl scale deployment esb-admin --replicas=1 -n {namespace}

因为 Deployment 对象并非直接操控的 Pod 对象,而是操控的 ReplicaSet 对象,而 ReplicaSet 对象就是由副本的数目的定义和Pod 模板组成的。因此这条命令分别是将ReplicaSet 的数量 scale 到 0,而后又 scale 到 1,那么 Pod 也就重启了。对象

0x03 方法 3

一样没有 yaml 文件,可是使用的是 Deployment 对象。blog

使用命令kubectl delete pod {podname} -n {namespace}
这个方法就很简单粗暴了,直接把 Pod 删除,由于 Kubernetes 是声明式 API,因此删掉了以后,Pod API 对象就与预期的不一致了,因此会自动从新建立 Pod 保持与预期一致,可是若是ReplicaSet 管理的 Pod 对象不少的话,那么要一个个手动删除,会很麻烦,因此可使用kubectl delete replicaset {rs_name} -n {namespace}命令来删除 ReplicaSetget

0x04 方法 4

没有 yaml 文件,直接使用的 Pod 对象。kubernetes

使用命令kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -it

在这种状况下,因为没有 yaml 文件,且启动的是 Pod 对象,那么是没法直接删除或者 scale 到 0 的,但能够经过上面这条命令重启。这条命令的意思是 get 当前运行的 pod 的 yaml声明,并管道重定向输出到 kubectl replace命令的标准输入,从而达到重启的目的。模板

总结

咱们能够经过多种方式来重启对象,总的来讲,最推荐的方式是使用kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -这种方式,由于适用于多种对象。此外,重启 Pod 并不会修复运行程序的 bug,想要解决程序的意外终止,最终仍是得要修复 bug。

相关文章
相关标签/搜索