環境
- kubernetes 1.20.2
- Spring Boot 2.5.0-M1
目標
創建一個 Pod 將其容器的重啟策略設置為:Never,查看容器停止時,Pod 的行為。
pod.yaml
直接創建 Pod 時,如果 restartPolicy 不寫,默認為:Always。
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
spec:
restartPolicy: Never
containers:
- name: pod-demo
image: jiangbo920827/spring-demo:actuator
ports:
- containerPort: 8080
查看 Pod
[root@master pod]# kubectl get -f pod.yaml -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 1/1 Running 0 14s 10.244.1.19 node1 <none> <none>
可以看到 Pod 正常運行,RESTARTS(重啟次數)字段為 0。
停止容器
正常停止
[root@master pod]# curl -X POST 10.244.1.19:8080/actuator/shutdown
{"message":"Shutting down, bye..."}[root@master pod]#
[root@master pod]# kubectl get -f pod.yaml -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 0/1 Completed 0 66s 10.244.1.19 node1 <none> <none>
狀態變成了 Completed,READY 字段也變成了 0/1,也沒有再次重啟。
非正常停止
刪除容器,再次創建,並且非正常停止。
[root@master pod]# kubectl delete -f pod.yaml
pod "pod-demo" deleted
[root@master pod]# kubectl apply -f pod.yaml
pod/pod-demo created
[root@master pod]# kubectl get -f pod.yaml -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 1/1 Running 0 4s 10.244.1.20 node1 <none> <none>
[root@master pod]# kubectl exec pod-demo -- kill 1
[root@master pod]# kubectl get -f pod.yaml -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 0/1 Error 0 34s 10.244.1.20 node1 <none> <none>
狀態變成了 Error,READY 字段也變成了 0/1,也沒有再次重啟。
總結
介紹了容器的重啟策略-Never,在創建單個 Pod 的情況下,都不會重啟。
容器的重啟有一個回退策略,並以指數級增加。如果在 10 分鍾沒有錯誤,則重置重啟計時。
詳細說明見附錄摘抄的官網說明。
附錄
Container restart policy
The spec
of a Pod has a restartPolicy
field with possible values Always, OnFailure, and Never. The default value is Always.
The restartPolicy
applies to all containers in the Pod. restartPolicy
only refers to restarts of the containers by the kubelet on the same node. After containers in a Pod exit, the kubelet restarts them with an exponential back-off delay (10s, 20s, 40s, …), that is capped at five minutes. Once a container has executed for 10 minutes without any problems, the kubelet resets the restart backoff timer for that container.