一、Pod的整個生命階段
-
Pending:正在創建的Pod,但是Pod中的容器還沒有完全被創建完成,這其中包含集群為容器創建網絡,或者下載鏡像的過程
-
Running:Pod內所有的容器都已經被創建,且至少一個容器正在處於運行狀態、正在啟動狀態或者重啟狀態
-
Successed:Pod中所有容器都執行成功后退出,並且沒有處於重啟的容器
-
Faild:Pod中所有容器都已退出,但是至少還有一個容器退出時為失敗狀態
-
Unknow:由於一些原因,Pod的狀態無法獲取,通常是與Pod通信時錯誤導致的
二、Pod重啟策略
-
Always:只要容器失效退出就重啟容器
-
onFailure:當容器以非正常退出后重新啟動容器
-
Never:無論容器狀態如何,都不重新啟動容器
三、Pod的活性與就緒探針
1、Pod探針機制
在Kubernetes中Pod是最小的計算單元,而一個Pod又由多個容器組成,相當於每個容器就是一個應用,應用在運行期間,可能因為某也意外情況致使程序掛掉。那么如何監控這些容器狀態穩定性,保證服務在運行期間不會發生問題,發生問題后進行重啟等機制,就成為了重中之重的事情,考慮到這點 kubernetes 推出了活性探針機制。
有了活性探針后能保證程序在運行中如果掛掉能夠自動重啟,但是還有個經常遇到的問題,比如說,在 Kubernetes 中啟動 Pod,顯示明明 Pod 已經啟動成功,且能訪問里面的端口,但是卻返回錯誤信息。還有就是在執行滾動更新時候,總會出現一段時間,Pod 對外提供網絡訪問,但是訪問卻發生 404,這兩個原因,都是因為 Pod 已經成功啟動,但是 Pod 的的容器中應用程序還在啟動中導致,考慮到這點 Kubernetes 推出了就緒探針機制。
2、Pod兩種探針
-
LivenessProbe(存活探針):存活探針的主要作用是,用指定的方式進入容器檢測容器中的應用是否正常運行,如果檢測失敗,則認為容器不健康,那么
kubelet
將根據Pod
中設置的restartPolicy
策略來判斷,Pod是否要進行重啟,如果容器配置中沒有配置livenessProbe
存活探針,kubelet
將認為存活探針一直為成功狀態 -
ReadinessProbe(就緒探針):用於判斷容器中應用是否完成,當探測成功后才使Pod對外提供網絡訪問,設置容器
Ready
狀態為true
,如果探測失敗,則設置容器的Ready
狀態為false
。對於被Service管理的Pod,Service
與Pod
、EndPoind
的關聯關系也將基於Pod是否為Ready
狀態進行設置,如果Pod運行過程中Ready
狀態變為false
,則系統自動從Service
關聯的EndPoint
列表中移除,如果Pod恢復為Ready
狀態,將再被加回EndPoint
列表,通過這種機制就能防止將流量轉發到不可用的Pod上。
3、Pod探針的探測方式與結果
目前LivenessProbe和ReadinessProbe兩種探針都支持下面三種探測方法:
-
ExecAction:在容器中執行指定的命令,如果能成功執行,則探測成功
-
HTTPGetAction:通過容器的IP地址、端口號及路徑調用HTTP Get方法,如果響應的狀態碼200-400,則認為容器探測成功
-
TCPSocketAction:通過容器IP地址和端口號執行TCP檢查,如果能建立TCP連接,則探測成功
探針探測結果有以下值:
-
Success:表示通過檢測
-
Failure:表示未通過檢測
-
Unknow:表示檢測沒有正常進行
4、Pod探針的相關屬性
兩種探針有許多字段可選,可以用來更加精確的控制LivenessProbe和ReadinessProbe兩種探針的探測:
-
initialDelaySeconds:Pod啟動后首次進行檢查的等待時間,單位“秒”
-
periodSeconds:檢查的間隔時間,默認為10s,單位“秒”
-
timeoutSeconds:探針執行檢測請求后,等待響應的超時時間,默認為1s,單位“秒”
-
successThreshold:探針檢測失敗后認為成功的最小連接成功次數,默認為1s,在liveness探針中必須為1s,最小為1s
-
failureThreshold:探測失敗的重試次數,重試一定次數后將認為失敗,在readiness探針中,Pod會被標記為未就緒,默認3s,最小值1s
5、兩種探針的區別
總的來說 ReadinessProbe 和 LivenessProbe 是使用相同探測的方式,只是探測后對 Pod 的處置方式不同:
-
ReadinessProbe:但檢測失敗后,將Pod的IP:Port從對應Service關聯的EndPoint地址列表中刪除
-
LivenessProbe:當檢測失敗后將容器殺死,並根據Pod的重啟策略來決定對應措施
四、探針使用示例
1、LivenessProbe探針使用示例
(1)通過Exec方式做健康檢測
apiVersion: v1 kind: Pod metadata: name: liveness-exec labels: app: liveness spec: containers: - name: liveness image: busybox args: - /bin/sh - -c - echo ok > /tmp/healthy; sleep 10; rm -rf /tmp/healthy; sleep 1000 livenessProbe: initialDelaySeconds: 15 periodSeconds: 3 exec: command: - cat - /tmp/healthy
通過執行 cat /tmp/healthy 來判斷一個容器是否正常運行。再創建 /tmp/healthy文件10s后將其刪除,而LivenessProbe健康檢測的初始時間(initialDelaySeconds)為15s,探測結果為fail,將導致kubelet殺掉容器並重啟它
(2)通過HTTPGetAction方式做健康探測
apiVersion: v1 kind: Pod metadata: name: liveness-http labels: app: liveness spec: containers: - name: liveness image: mydlqclub/springboot-helloworld:0.0.1 livenessProbe: initialDelaySeconds: 20 periodSeconds: 5 timeoutSeconds: 10 httpGet: scheme: HTTP port: 8081 path: /actuator/health
探測結果的HTTP 狀態碼如果為200 - 400,則表示探測成功。如果探測失敗,則會殺死Pod進行重啟操作
httpGet探測方法有如下可選的控制字段
-
scheme:用於測試連接的協議,默認為HTTP
-
host:要連接的主機名,默認為Pod IP
-
port:容器上要訪問端口號或名稱
-
path:HTTP 服務器上的訪問URL
-
httpHeaders:自定義http請求Headers,http允許重復Headers
(3)通過TCP方式做健康探測
apiVersion: v1 kind: Pod metadata: name: liveness-tcp labels: app: liveness spec: containers: - name: liveness image: nginx:1.19.0 ports: - containerPort: 80 livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 20 periodSeconds: 10 timeoutSeconds: 1
TCP 檢查方式和 HTTP 檢查方式非常相似,在容器啟動 initialDelaySeconds
參數設定的時間后,kubelet
將發送第一個 livenessProbe
探針,嘗試連接容器的 80 端口,如果連接失敗則將殺死 Pod 重啟容器。
2、ReadinessProbe探針使用示例
Pod 的 ReadinessProbe
探針使用方式和 LivenessProbe
探針探測方法一樣,也是支持三種,只是一個是用於探測應用的存活,一個是判斷是否對外提供流量的條件。
apiVersion: v1 kind: Service metadata: name: springboot labels: app: springboot spec: type: NodePort ports: - name: server port: 8080 targetPort: 8080 nodePort: 31180 - name: managerment port: 8081 targetPort: 8081 nodePort: 31181 selector: app: springboot --- apiVersion: v1 kind: Pod metadata: name: springboot labels: app: springboot spec: containers: - name: springboot image: mydlqclub/springboot-helloworld:0.0.1 ports: - name: server containerPort: 8080 - name: managerment containerPort: 8081 readinessProbe: httpGet: scheme: HTTP port: 8081 path: /actuator/health initialDelaySeconds: 20 periodSeconds: 10 timeoutSeconds: 10
3、ReadinessProbe+LivenessProbe配合使用示例
apiVersion: v1 kind: Service metadata: name: rlprobe labels: app: rlprobe spec: type: NodePort ports: - name: server port: 8080 targetPort: 8080 nodePort: 32280 - name: managerment port: 8081 targetPort: 8081 nodePort: 32281 selector: app: rlprobe --- apiVersion: apps/v1 kind: Deployment metadata: name: rlprobe labels: app: rlprobe spec: replicas: 1 selector: matchLabels: app: rlprobe template: metadata: name: rlprobe labels: app: rlprobe spec: containers: - name: rl image: mydlqclub/springboot-helloworld:0.0.1 ports: - name: server containerPort: 8080 - name: managerment containerPort: 8081 readinessProbe: httpGet: scheme: HTTP port: 8081 path: /actuator/health initialDelaySeconds: 20 periodSeconds: 5 timeoutSeconds: 10 livenessProbe: httpGet: scheme: HTTP port: 8081 path: /actuator/health initialDelaySeconds: 20 periodSeconds: 5 timeoutSeconds: 10