什麼是 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 ...