K8S中pod健康狀態的檢查

2021-10-02 04:13:06 字數 3944 閱讀 2858

什麼是 container probes

通過k8s的架構圖,我們可以發現,每個node節點上都有 kubelet 這個元件,container probe(容器探針) 也就是容器的健康檢查是由 kubelet 定期執行的。container probe有以下兩種方式,分別為liveness probe(存活探針)和readiness probe(就緒探針)。

每類探針都支援三種探測方法

以上每種方式都可以定義在readiness 或者liveness 中。比如定義readiness 中http get 就是意思說如果我定義的這個path的http get 請求返回200-400以外的http code 就把我從所有有我的服務裡面刪了吧,如果定義在liveness裡面就是把我kill 了。

注意,liveness不會重啟pod,pod是否會重啟由你的restart policy 控制。

兩種探針探測的結果都有以下三者

重啟策略

示例一: 通過exec方式做健康探測

apiversion: v1

kind: pod

metadata:

labels:

test: liveness

name: liveness-exec

spec:

containers:

- name: liveness

image: k8s.gcr.io/busybox

args:

- /bin/sh

- -c

- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600

livenessprobe:

exec:

command:

- cat

- /tmp/healthy

initialdelayseconds: 5

periodseconds: 5

在該配置檔案中,對容器執行livenessprobe檢查,periodseconds欄位指定kubelet每5s執行一次檢查,檢查的命令為cat /tmp/healthy,initialdelayseconds欄位告訴kubelet應該在執行第一次檢查之前等待5秒,

如果命令執行成功,則返回0,那麼kubelet就認為容器是健康的,如果為非0,則kubelet會kill掉容器並根據重啟策略來決定是否需要重啟(kubernetes預設為pod配置的重啟策略為always)

注:本例建立了乙個容器,通過檢查乙個檔案是否存在來判斷容器執行是否正常。容器執行30秒後,將檔案刪除,這樣容器的liveness檢查失敗從而會將容器重啟

示例二: 通過http方式做健康探測

apiversion: v1

image: k8s.gcr.io/liveness # 官方使用者測試的demo映象

periodseconds: 3

在配置檔案中,使用k8s.gcr.io/liveness映象,建立出乙個pod,其中periodseconds欄位指定kubelet每3秒執行一次探測,initialdelayseconds欄位告訴kubelet延遲等待3秒,探測方式為向容器中執行的服務傳送http get請求,請求8080埠下的/healthz, 任何大於或等於200且小於400的**表示成功。任何其他**表示失敗。

httpget探測方式有如下可選的控制字段:

示例三:通過tcp方式做健康探測

kubelet將嘗試在指定的埠上開啟容器上的套接字,如果能建立連線,則表明容器健康。

apiversion: v1

kind: pod

metadata:

name: goproxy

labels:

spec:

containers:

- name: goproxy

image: k8s.gcr.io/goproxy:0.1

ports:

- containerport: 8080

readinessprobe:

tcpsocket:

port: 8080

initialdelayseconds: 5

periodseconds: 10

livenessprobe:

tcpsocket:

port: 8080

initialdelayseconds: 15

periodseconds: 20

tcp檢查方式和http檢查方式非常相似,示例中兩種探針都使用了,在容器啟動5秒後,kubelet將傳送第乙個readinessprobe探針,這將連線到容器的8080埠,如果探測成功,則該pod將被標識為ready,10秒後,kubelet將進行第二次連線.除此之後,此配置還包含了livenessprobe探針,在容器啟動15秒後,kubelet將傳送第乙個livenessprobe探針,仍然嘗試連線容器的8080埠,如果連線失敗則重啟容器。

readinessprobe探針配置

readinessprobe探針的使用場景livenessprobe稍有不同,有的時候應用程式可能暫時無法接受請求,比如pod已經running了,但是容器內應用程式尚未啟動成功,在這種情況下,如果沒有readinessprobe,則kubernetes認為它可以處理請求了,然而此時,我們知道程式還沒啟動成功是不能接收使用者請求的,所以不希望kubernetes把請求排程給它,則使用readinessprobe探針。

readinessprobe和livenessprobe可以使用相同探測方式,只是對pod的處置方式不同,readinessprobe是將pod ip:port從對應的endpoint列表中刪除,而livenessprobe則kill容器並根據pod的重啟策略來決定作出對應的措施。

readinessprobe探針探測容器是否已準備就緒,如果未準備就緒則kubernetes不會將流量**給此pod。

readinessprobe探針與livenessprobe一樣也支援exec、httpget、tcp的探測方式,配置方式相同,只不過是將livenessprobe欄位修改為readinessprobe。

readinessprobe:

exec:

command:

- cat

- /tmp/healthy

initialdelayseconds: 5

periodseconds: 5

配置探針(probe)相關屬性

探針(probe)有許多可選字段,可以用來更加精確的控制liveness和readiness兩種探針的行為(probe):

initialdelayseconds:pod啟動後延遲多久才進行檢查,單位:秒。

periodseconds:檢查的間隔時間,預設為10,單位:秒。

timeoutseconds:探測的超時時間,預設為1,單位:秒。

successthreshold:探測失敗後認為成功的最小連線成功次數,預設為1,在liveness探針中必須為1,最小值為1。

failurethreshold:探測失敗的重試次數,重試一定次數後將認為失敗,在readiness探針中,pod會被標記為未就緒,預設為3,最小值為1。

httpget的屬性

參考

k8s對pod的健康檢查

探針的使用 針對此類問題,kubernetes提供了探針的方式對容器進行健康檢查。k8s提供的探針分別為livenessprobe和readinessprobe,各node節點的kubelet根據探針的內容定期對容器執行探測,以達到對容器狀態的判斷。livenessprobe 用於判斷容器是否存活 ...

k8s集群建立pod,執行pod

k8s集群搭建好後,各個node的狀態變成了ready,就可以建立pod,建立完成後,就會預設的執行其中的container。使用乙個簡單yaml檔案描述pod apiversion v1 必選,版本號,例如v1,版本號必須可以用 kubectl api versions 查詢到 kind pod ...

k8s檢視pod的命令

引數解析 name pod名 ready 準備好的副本數 status 狀態 restarts 重啟 age 已經執行的時間 kubectl get pod o wide 引數解析 ip ip位址 node 執行節點 nominated node 指定節點 kubectl describe pod ...