k8s | 重啓Kubernetes Pod的幾種方式

前言

在使用 docker 的過程中,我們可以使用docker restart {container_id}來重啓容器,但是在 kubernetes 中並沒有重啓命令(沒有 kubectl restart {podname}),有時候我們的 Pod 出現 Bug意外終止,導致我們需要重啓 Pod ,卻沒有一個很好的方式,特別是沒有 yaml 文件的情況下,所以本文總結了以下幾種重啓 Pod 的方式。

方法 1

有最新的 yaml 文件。

在有 yaml 文件的情況下可以直接使用kubectl replace --force -f xxxx.yaml來強制替換Pod 的 API 對象,從而達到重啓的目的。

方法 2

沒有 yaml 文件,但是使用的是 Deployment 對象。

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

由於 Deployment 對象並不是直接操控的 Pod 對象,而是操控的 ReplicaSet 對象,而 ReplicaSet 對象就是由副本的數目的定義和Pod 模板組成的。所以這條命令分別是將ReplicaSet 的數量 scale 到 0,然後又 scale 到 1,那麼 Pod 也就重啓了。

方法 3

同樣沒有 yaml 文件,但是使用的是 Deployment 對象。

使用命令kubectl delete pod {podname} -n {namespace}

這個方法就很簡單粗暴了,直接把 Pod 刪除,因爲 Kubernetes 是聲明式 API,所以刪掉了之後,Pod API 對象就與預期的不一致了,所以會自動重新創建 Pod 保持與預期一致,但是如果ReplicaSet 管理的 Pod 對象很多的話,那麼要一個個手動刪除,會很麻煩,所以可以使用kubectl delete replicaset {rs_name} -n {namespace}命令來刪除 ReplicaSet

方法 4

沒有 yaml 文件,直接使用的 Pod 對象。

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

在這種情況下,由於沒有 yaml 文件,且啓動的是 Pod 對象,那麼是無法直接刪除或者 scale 到 0 的,但可以通過上面這條命令重啓。這條命令的意思是 get 當前運行的 pod 的 yaml聲明,並管道重定向輸出到 kubectl replace命令的標準輸入,從而達到重啓的目的。

總結

我們可以通過多種方式來重啓對象,總的來說,最推薦的方式是使用kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -這種方式,因爲適用於多種對象。此外,重啓 Pod 並不會修復運行程序的 bug,想要解決程序的意外終止,最終還是得要修復 bug。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章