天天看點

[kubernates]重新開機 Kubernetes Pod 的幾種方式前言方法 1方法 2方法 3方法 4總結

前言

在使用 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 對象,進而達到重新開機的目的。如下圖:

[[email protected] viua]# kubectl replace --force -f viua.yml
namespace "viua" deleted
service "viua-app-cms" deleted
deployment.apps "viua-app-cms" deleted
service "viua-app-command" deleted
deployment.apps "viua-app-command" deleted
service "viua-show-service" deleted
deployment.apps "viua-show-service" deleted
service "viua-skills-service" deleted
deployment.apps "viua-skills-service" deleted
namespace/viua replaced
secret/xa-harbor-ca replaced
service/viua-app-cms replaced
deployment.apps/viua-app-cms replaced
service/viua-app-command replaced
deployment.apps/viua-app-command replaced
service/viua-show-service replaced
deployment.apps/viua-show-service replaced
service/viua-skills-service replaced
deployment.apps/viua-skills-service replaced
           

方法 2

沒有 yaml 檔案,但是使用的是 Deployment 對象。

  1. kubectl scale deploy viua-app-cms --replicas=0 -n viua

  2. kubectl scale deploy {deploy對象} --replicas=0 -n {namespace}

[[email protected] pvd]# kubectl get deploy -n viua
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
viua-app-cms          1/1     1            1           48m
viua-app-command      1/1     1            1           48m
viua-show-service     1/1     1            1           48m
viua-skills-service   1/1     1            1           48m
[[email protected] pvd]# kubectl scale deploy viua-app-cms --replicas=0 -n viua
deployment.apps/viua-app-cms scaled
[[email protected] pvd]# kubectl get deploy -n viua
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
viua-app-cms          0/0     0            0           49m
viua-app-command      1/1     1            1           49m
viua-show-service     1/1     1            1           49m
viua-skills-service   1/1     1            1           49m
[[email protected] pvd]# kubectl get po -n viua
NAME                                   READY   STATUS    RESTARTS   AGE
viua-app-command-95f7b6f7f-rb7mh       1/1     Running   0          49m
viua-show-service-85565b9dcf-ss8qp     1/1     Running   0          49m
viua-skills-service-65447f9b94-fhqhr   1/1     Running   0          49m
           

由于 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。