06-K8S Basic-Pod資源管理進階(Pod宣告週期、相位、資源限制)
阿新 • • 發佈:2021-06-13
一、Pod資源生命週期(健康狀態檢查)
1.1、pod生命週期的介紹
Pod的生命週期涵蓋了前面所說的PostStart 和 PreStop在內
Pod生命週期中的重要階段
- 初始化容器
- 生命周鉤子函式
- postStart
- preStop
- 容器探測
- 探測型別
- 存活狀態探測 :liveness probe
- 就緒狀態探測 : readiness probe
- 探測行為
- ExecAction
- TCPSocketAction
- HTTPGetAction
- 探測型別
1.1.1、Pod phase
- Pod的status定義在 PodStatus物件中,其中有一個phase欄位。
- Pod的執行階段是Pod在其生命週期中的簡單巨集觀概述。
- 下面是phase可能的值:
Pending 掛起
:該狀態標識Pod沒有排程到節點上,可能下載映象耗費時間,容器還未啟動。Running 執行中
: Pod已經繫結到一個節點上,Pod中的容器已經全部建立,至少有一個容器正在執行,或者證處於啟動狀態或重啟狀態。Succeeded 成功
: Pod中所有的容器都被成功終止,並且不會被重啟。Failed 失敗
:Pod中的所有容器都已經終止了,並且至少有一個容器是因為失敗終止。容器退出狀態非0或被系統終止。Unknown 未知
: 因為某些原因無法取得Pod狀態,通常因為與Pod所在節點失去通訊造成失聯。
1.1.2、Pod 狀態
- Pod 有一個 PodStatus 物件,其中包含一個 PodCondition 陣列。 PodCondition 陣列的每個元素都有一個 type 欄位和一個 status 欄位。type 欄位是字串,可能的值有 PodScheduled、Ready、Initialized 和 Unschedulable。status 欄位是一個字串,可能的值有 True、False 和 Unknown。
1.1.3、Pod健康檢查
- 檢視官網文件,探針是有kubelet對容器狀態的一種定期監控和檢查,要執行診斷,kubelet可以呼叫由容器實現的Handler。有三種執行方式:
HTTPGetAction(http)
:對指定埠和路徑上的容器的IP地址執行HTTP Get請求。如果狀態碼大於等於200且小於400,則認為診斷成功。ExecAction(exec)
: 在容器內部執行指定命令,執行後退出狀態碼為0則診斷成功。TCPSocketAction(tcp:)
: kubelet 對指定容器IP和Port進行TCP檢查,如果埠開啟,則被認為診斷成功
- 診斷狀態有三種:
- 成功: 容器狀態健康,通過了檢測
- 失敗: 容器未通過診斷
- 未知: 診斷失敗,不會採取任何行動
1.1.3.1、容器探針
- 供kubelet對容器診斷的探針有兩種:
LivenessProbe: 存活探針
,指容器是否正在執行。如果檢測失敗,則kubelet會殺死容器,並且容器會受重啟策略的影響而是否重啟, 如果容器不提供探針,則預設狀態為success。ReadnessProbe: 就緒探針
,指容器是否準備就緒,接受服務請求。如果就緒探針失敗,端點控制器將從與Pod匹配的所有service的端點中移除該Pod的IP 地址。初始延遲之前的就緒狀態預設是Failure,如果容器不提供就緒探針,則預設狀態為Success。
1.1.3.2、什麼時候選擇livenessProbe 存活探針和readnessProbe就緒探針?
- 如果容器中的程序能夠在出現服務故障的時候自動崩潰,那麼這種時候是不需要提供livenessProbe ,kubelet將根據Pod的restartPolicy自動執行正確的操作
- 如果希望容器在探測失敗時被殺死並重新啟動,那麼請指定一個livenessPRobe存活探針,並指定restartPolicy為Always或OnFailure。
- 如果要在探測成功才開始向Pod傳送流量,就需要指定一個readnessProbe 。在這種情況下,就緒探針可能和存活探針同時存在,這種情況下的readnessProbe意味容器在沒有接受到任何 流量的情況下啟動,並且只有在探針成功後才接收流量。如果希望容器能夠自行維護,那就指定一個readnessProbe探針,和livenessProbe探測不同的端點。
- 注意,如果只想在pod被刪除時能夠排除請求,則不一定需要使用就緒探針;在刪除Pod時,Pod將自動將自身置於未完成狀態,無論是否有就緒探針。當等待Pod中的容器停止時,Pod仍處於未完成狀態。
1.1.3.3、模板 使用exec方式指定command
apiVersion: v1
kind: Pod
metadata:
name: probe
spec:
containers:
- name: probe
image: busybox
argx:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 #等待容器啟動5秒後發起探針
periodSeconds: 5 #發起探針的間隔5秒一次
- 使用kubectl 部署這個yaml檔案,建立一個Pod,可以發現在啟動完成後等待5秒後開始發起探針診斷,每隔5秒後發起一次診斷,而這裡使用的是exec方式,在30秒後容器會執行刪除/tmp/healthy 檔案操作,這之後再發起探針診斷則診斷失敗,容器將被kubelet 殺掉然後重啟。
1.1.3.4、livenessProbe和readnessProbe一起使用
apiVersion: v1
kind: Pod
metadata:
name: probe-http
label:
app: probe-http
sepc:
containers:
- name: probe-http
image: nginx
containerPort:
- name: http
port: 80
livenessProbe:
# 當沒有定義 "host" 時,使用 "PodIP"
# host: my-host
# 當沒有定義 "scheme" 時,使用 "HTTP" scheme 只允許 "HTTP" 和 "HTTPS"
# scheme: HTTPS
path: / #路徑可以是想要檢查的能訪問到的任何路徑,如:/healthy
port: 80
# httpHeaders: 設定http請求頭
# - name: X-Custom-Header
# value: Awesome
initialDelaySeconds: 15
timeoutSeconds: 1 #超時時間
readnessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 20
- 從上面的YAML檔案我們可以看出readiness probe的配置跟liveness probe很像,基本上一致的。唯一的不同是使用readinessProbe而不是livenessProbe。兩者如果同時使用的話就可以確保流量不會到達還未準備好的容器,準備好過後,如果應用程式出現了錯誤,則會重新啟動容器。
1.1.3.6、探針引數
- timeoutSeconds:探測超時時間,預設1秒,最小1秒。
- successThreshold:探測失敗後,最少連續探測成功多少次才被認定為成功。預設是 1,但是如果是
liveness
則必須是 1。最小值是 1。 - failureThreshold:探測成功後,最少連續探測失敗多少次才被認定為失敗。預設是 3,最小值是 1。
1.1.3.7、重啟策略
- dSpec 中有一個 restartPolicy 欄位,可能的值為 Always、OnFailure 和 Never。預設為 Always。 restartPolicy 適用於 Pod 中的所有容器。restartPolicy 僅指通過同一節點上的 kubelet 重新啟動容器。失敗的容器由 kubelet 以五分鐘為上限的指數退避延遲(10秒,20秒,40秒…)重新啟動,並在成功執行十分鐘後重置。如 Pod 文件 中所述,一旦繫結到一個節點,Pod 將永遠不會重新繫結到另一個節點。
tartPolicy:
- ways 容器失效時,kubelet 自動重啟該容器
- Failure 容器終止執行且退出碼不為0時重啟
- ver 不論狀態為何, kubelet 都不重啟該容器
4.Pod 的生命
- 來說,Pod 不會消失,直到人為銷燬他們。這可能是一個人或控制器。這個規則的唯一例外是成功或失敗的 phase 超過一段時間(由 master 確定)的Pod將過期並被自動銷燬。
- 種可用的控制器:
- Job 執行預期會終止的 Pod,例如批量計算。Job 僅適用於重啟策略為 OnFailure 或 Never 的 Pod。
- 期不會終止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 伺服器。 ReplicationController 僅適用於具有 restartPolicy 為 Always 的 Pod。
- 特定於機器的系統服務,使用 DaemonSet 為每臺機器執行一個 Pod 。
- 這三種類型的控制器都包含一個 PodTemplate。建議建立適當的控制器,讓它們來建立 Pod,而不是直接自己建立 Pod。這是因為單獨的 Pod 在機器故障的情況下沒有辦法自動復原,而控制器卻可以。
- 節點死亡或與叢集的其餘部分斷開連線,則 Kubernetes 將應用一個策略將丟失節點上的所有 Pod 的 phase 設定為 Failed