本文介紹了 Kubernetes 中的就緒和活動探測器,以及如何為容器配置它們。
Kubernetes 中的探針是什麼?
由於多種原因,應用程序可能會變得不可靠。 您需要確保應用程序處於所需狀態。 Kubernetes 提供了一種檢查容器狀態的方法。 這種健康診斷稱為探測。
輪詢容器的方法
kubelet 使用以下方式之一探測您的容器:
1.行政人員
Kubelet 在容器內運行一個命令。 結果取決於命令的退出代碼。 退出代碼 0 表示診斷成功。
2.http獲取
Kubelet 發送一個 GET
請求到容器IP地址的指定端口。 200 到 400(含)之間的響應代碼表示診斷成功。
3.TCP套接字
Kubelet 嘗試在容器 IP 地址的指定端口上建立 TCP 連接。 已建立的連接表示診斷成功。
探頭類型
Kubernetes 中有三種類型的探針:
-
生命探測
-
準備探頭
-
開始探測
啟動探測是最近添加到此列表中的,本文不涉及。
生命探測
生命探測器檢測容器是否存活。 這用於確保 pod 的可用性。 如果活動探測成功,kubelet 將不執行任何操作,因為容器已經處於所需狀態。 如果失敗,kubelet 將刪除容器,後續操作取決於規範重置政策容器的
為什麼要使用 Liveness 探針?
Kubelet 通過查看容器的狀態來驗證容器的健康狀況 PID 1
. 問題是狀態 PID 1
它不反映容器子進程的狀態。 如果您只有一個流程容器,則無需指定活動探測器。 如果沒有,則必須使用生命探測器。
準備探頭
就緒探測器檢測容器是否準備好為傳入的網絡請求提供服務。 您不想將流量發送到尚未準備就緒的 pod。 如果就緒探測失敗,控制面板會停止到 pod 的網絡流量。 在 pod 上運行第一個就緒探測之前,默認就緒狀態設置為 Failure
. 就緒探測在容器的整個生命週期中定期運行。
為什麼要使用準備探頭?
網絡流量應在所有子進程啟動後發送到容器。 如果沒有就緒探測,Kubernetes 會盡快將網絡流量發送到容器 PID 1
開始。 這並不意味著子進程已經啟動。 在此狀態下向容器發送網絡流量可能會導致錯誤。 每次重新啟動容器或創建應用程序的新實例時,應用程序都會遇到錯誤。
如何在 Kubernetes 中設置探針
探針定義在 pods.spec.containers
場地。 每個探針都有以下五個參數:
-
初始延遲秒:這指定了容器啟動後等待探測運行的時間(以秒為單位)。 默認值為 0。
-
期間秒:這指定了每個定期測試之間的時間間隔。 默認值為 10。
-
超時秒數:這指定了每個探測應等待響應的時間。 默認值為 0。
-
成功門檻:這指定指示成功診斷的成功探測的數量。 預定值為 1。
-
失敗閾值:這指定指示診斷失敗的失敗探測的計數。 默認值為 3。
所有這些參數都用於配置探測器。 要遵循本指南,您需要配置一個 Kubernetes 集群和一個 kubectl 客戶端。 您可以使用 Vultr Kubernetes Engine 在雲端部署 Kubernetes 集群並測試探針。 設置 kubectl
在你的機器上繼續前進。
創建生命探測器
看下面的配置文件:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-demo
spec:
containers:
- name: basic-container
image: registry.k8s.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 20; rm -f /tmp/healthy; sleep 1000
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 10
此配置創建單個容器並定義活動探測器。 該探頭使用 exec
做出診斷。 創建容器後, touch /tmp/healthy; sleep 20; rm -f /tmp/healthy; sleep 100
命令被執行。 這個命令:
-
創建一個
/tmp/healthy
程序 -
等待 20 秒。
-
刪除
/tmp/healthy
程序。 -
讓容器再存活 1000 秒。
注意 livenessProbe
下的字段 containers
場地。 這是定義活動探測器的地方。 這裡,activity probe 會在容器創建後等待 5 秒,以 10 秒的時間間隔開始定期診斷。 使用 exec 形式執行探測。 如果命令 cat /tmp/healthy
返回0,探測成功。
創建吊艙:
kubectl apply -f config.yaml
檢查 pod 事件:
kubectl describe liveness-demo
在輸出的末尾,您可以看到類似以下內容:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 25s default-scheduler Successfully assigned default/liveness-demo to probescluster-3a397dd3c5ec
Normal Pulling 25s kubelet Pulling image "registry.k8s.io/busybox"
Normal Pulled 22s kubelet Successfully pulled image "registry.k8s.io/busybox" in 3.292188263s
Normal Created 22s kubelet Created container basic-container
Normal Started 22s kubelet Started container basic-container
到目前為止,膠囊是健康的,可以正常工作。 25 秒後,再次查看 pod 事件:
kubectl apply -f config.yaml
你可以期待看到類似的東西:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 56s default-scheduler Successfully assigned default/liveness-demo to probescluster-3a397dd3c5ec
Normal Pulling 55s kubelet Pulling image "registry.k8s.io/busybox"
Normal Pulled 52s kubelet Successfully pulled image "registry.k8s.io/busybox" in 3.292188263s
Normal Created 52s kubelet Created container basic-container
Normal Started 52s kubelet Started container basic-container
Warning Unhealthy 5s (x3 over 25s) kubelet Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
Normal Killing 5s kubelet Container basic-container failed liveness probe, will be restarted
在輸出中可以看到,5秒前,activity探測失敗,導致kubectl重啟容器。 現在檢查 pod 的狀態:
kubectl get pod liveness-demo
預期表現:
NAME READY STATUS RESTARTS AGE
liveness-demo 1/1 Running 1 (4s ago) 85s
請注意,重置現場表演 1
這確認容器已重新啟動。
設置準備探頭
就緒探測器設置類似於活動探測器設置。 您可以通過在配置文件中添加以下內容來為就緒檢查創建類似的探測器 pods.spec.containers
場地。
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 10
結論
本文介紹了 Kubernetes 就緒和活動探測器、它們的使用以及如何配置它們。 有關詳細信息,請參閱配置活動、就緒和調試探測在 kubernetes.io 上。
文章標題 名稱(可選) 電子郵件(可選) 描述
發送建議