重啓 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。

相關文章
相關標籤/搜索