在使用 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