k8s pod如何重啟


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

一、有yaml文件的重啟方式

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

[root@k8s-master ~]# kubectl replace --force -f deployment-ngx.yaml 
deployment.apps "deployment-ngx" deleted
deployment.apps/deployment-ngx replaced
[root@k8s-master ~]# kubectl get pods -o wide
NAME                              READY   STATUS              RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
deployment-ngx-5f4d48bb95-7dhmf   0/1     Terminating         0          14m   <none>           k8s-node1   <none>           <none>
deployment-ngx-5f4d48bb95-k5k8l   0/1     Terminating         0          16m   <none>           k8s-node2   <none>           <none>
deployment-ngx-5f4d48bb95-nqbpf   0/1     Terminating         0          16m   10.244.169.136   k8s-node2   <none>           <none>
deployment-ngx-8ff559dc9-mtjlw    0/1     ContainerCreating   0          5s    <none>           k8s-node1   <none>           <none>
deployment-ngx-8ff559dc9-z64q5    0/1     ContainerCreating   0          5s    <none>           k8s-node2   <none>           <none>
ngx                               1/1     Running             0          21h   10.244.36.69     k8s-node1   <none>           <none>
test                              1/1     Running             0          22h   10.244.36.68     k8s-node1   <none>           <none>
test-nginx                        1/1     Running             0          21h   10.244.169.131   k8s-node2   <none>           <none>

  

二、沒有yaml文件的重啟方式

使用scale命令

沒有 yaml 文件,但是使用的是 Deployment 對象。可以使用以下方式重啟

[root@k8s-master ~]# kubectl scale deployment deployment-ngx --replicas=0
deployment.apps/deployment-ngx scaled
[root@k8s-master ~]# kubectl get pods -o wide
NAME                             READY   STATUS        RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
deployment-ngx-8ff559dc9-mtjlw   0/1     Terminating   0          108s   <none>           k8s-node1   <none>           <none>
deployment-ngx-8ff559dc9-z64q5   0/1     Terminating   0          108s   <none>           k8s-node2   <none>           <none>
ngx                              1/1     Running       0          21h    10.244.36.69     k8s-node1   <none>           <none>
test                             1/1     Running       0          22h    10.244.36.68     k8s-node1   <none>           <none>
test-nginx                       1/1     Running       0          21h    10.244.169.131   k8s-node2   <none>           <none>

  

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

直接刪除Pod進行重啟

同樣沒有 yaml 文件,但是使用的是 Deployment 對象。查看deploy文件的重啟策略,如果配置了重啟策略。可以嘗試刪除重啟:

 

 使用命令

kubectl delete pod {podname} -n {namespace}

  

這個方法就很簡單粗暴了,直接把 Pod 刪除,因為 Kubernetes 是聲明式 API,所以刪掉了之后,Pod API 對象就與預期的不一致了,所以會自動重新創建 Pod 保持與預期一致,但是如果ReplicaSet 管理的 Pod 對象很多的話,那么要一個個手動刪除,會很麻煩,所以可以使用

kubectl delete replicaset {rs_name} -n {namespace}

  

命令來刪除 ReplicaSet

 

使用“-o yaml”參數導出Pod模板並重建Pod【推薦】

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

使用命令

kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -

  

 

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

原文:https://blog.csdn.net/weixin_44666068/article/details/102808609

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM