在使用 docker 的過程中,我們可以使用docker restart {container_id}
來重啟容器,但是在 kubernetes 中並沒有重啟命令,有時候我們的 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。