kubernetes提供了livenessProbe(可用性探針)
和readinessProbe(就緒性探針)
對容器的健康性進行檢測,當然這僅僅簡單的關於可用性方面的探測,實際上我們不僅僅要對容器進行健康檢測,還要對容器內布置的應用進行健康性檢測,這不在本篇討論之列,后面會有專門篇幅來討論結合APM工具,grafana和prometheus的應用檢測預警機制.
pod生命周期階段
- Pending:表示集群系統正在創建Pod,但是Pod中的container還沒有全部被創建,這其中也包含集群為container創建網絡,或者下載鏡像的時間;
- Running:表示pod已經運行在一個節點商量,並且所有的container都已經被創建。但是並不代表所有的container都運行,它僅僅代表至少有一個container是處於運行的狀態或者進程出於啟動中或者重啟中;
- Succeeded:所有Pod中的container都已經終止成功,並且沒有處於重啟的container;
- Failed:所有的Pod中的container都已經終止了,但是至少還有一個container沒有被正常的終止(其終止時的退出碼不為0)
對於liveness probes
的結果也有幾個固定的可選項值:
-
Success:表示通過檢測
-
Failure:表示沒有通過檢測
-
Unknown:表示檢測沒有正常進行
Liveness Probe的種類:
ExecAction:在container中執行指定的命令。當其執行成功時,將其退出碼設置為0;
TCPSocketAction:執行一個TCP檢查使用container的IP地址和指定的端口作為socket。如果端口處於打開狀態視為成功;
HTTPGetAcction:執行一個HTTP默認請求使用container的IP地址和指定的端口以及請求的路徑作為url,用戶可以通過host參數設置請求的地址,通過scheme參數設置協議類型(HTTP、HTTPS)如果其響應代碼在200~400之間,設為成功。
當前kubelet擁有兩個檢測器,他們分別對應不通的觸發器(根據觸發器的結構執行進一步的動作):
Liveness Probe:表示container是否處於live狀態。如果 LivenessProbe失敗,LivenessProbe將會通知kubelet對應的container不健康了。隨后kubelet將kill掉 container,並根據RestarPolicy進行進一步的操作。默認情況下LivenessProbe在第一次檢測之前初始化值為 Success,如果container沒有提供LivenessProbe,則也認為是Success;
ReadinessProbe:表示container是否以及處於可接受service請求的狀態了。如果ReadinessProbe失敗,endpoints controller將會從service所匹配到的endpoint列表中移除關於這個container的IP地址。因此對於Service匹配到的 endpoint的維護其核心是ReadinessProbe。默認Readiness的初始值是Failure,如果一個container沒有提供 Readiness則被認為是Success。
對於LivenessProbe和ReadinessProbe用法都一樣,擁有相同的參數和相同的監測方式。
initialDelaySeconds:用來表示初始化延遲的時間,也就是告訴監測從多久之后開始運行,單位是秒
periodSeconds:檢測的間隔時間,kubernetes每隔一段時間會檢測一次,默認為10秒,最小為1秒
timeoutSeconds: 用來表示監測的超時時間,如果超過這個時長后,則認為監測失敗
當前對每一個Container都可以設置不同的restartpolicy,有三種值可以設置:
-
Always: 只要container退出就重新啟動
-
OnFailure: 當container非正常退出后重新啟動
-
Never: 從不進行重新啟動
如果restartpolicy沒有設置,那么默認值是Always。如果container需要重啟,僅僅是通過kubelet在當前節點進行container級別的重啟。
最后針對LivenessProbe如何使用,請看下面的幾種方式,如果要使用ReadinessProbe只需要將livenessProbe修改為readinessProbe即可:
apiVersion: v1
kind: Pod
metadata:
name: probe-exec
namespace: coocla
spec:
containers:
- name: nginx
image: nginx
livenessProbe:
exec:
command:
- cat
- /tmp/health
initialDelaySeconds: 5
timeoutSeconds: 1
---
apiVersion: v1
kind: Pod
metadata:
name: probe-http
namespace: coocla
spec:
containers:
- name: nginx
image: nginx
livenessProbe:
httpGet:
path: /
port: 80
host: www.baidu.com
scheme: HTTPS
initialDelaySeconds: 5
timeoutSeconds: 1
---
apiVersion: v1
kind: Pod
metadata:
name: probe-tcp
namespace: coocla
spec:
containers:
- name: nginx
image: nginx
livenessProbe:
initialDelaySeconds: 5
timeoutSeconds: 1
tcpSocket:
port: 80
檢測方式
- exec-命令
在用戶容器內執行一次命令,如果命令執行的退出碼為0,則認為應用程序正常運行,其他任務應用程序運行不正常。
……
livenessProbe:
exec:
command:
- cat
- /home/laizy/test/hostpath/healthy
……
-
TCPSocket
將會嘗試打開一個用戶容器的Socket連接(就是IP地址:端口)。如果能夠建立這條連接,則認為應用程序正常運行,否則認為應用程序運行不正常。 -
HTTPGet
調用容器內Web應用的web hook,如果返回的HTTP狀態碼在200和399之間,則認為應用程序正常運行,否則認為應用程序運行不正常。每進行一次HTTP健康檢查都會訪問一次指定的URL。
……
httpGet: #通過httpget檢查健康,返回200-399之間,則認為容器正常
path: / #URI地址
port: 80 #端口號
#host: 127.0.0.1 #主機地址
scheme: HTTP #支持的協議,http或者https
httpHeaders:’’ #自定義請求的header
……
- 部署實例
cat << EOF > inessprobe.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: inessprobe
labels:
project: lykops
app: inessprobe
version: v1
spec:
replicas: 6
selector:
project: lykops
app: inessprobe
version: v1
name: inessprobe
template:
metadata:
labels:
project: lykops
app: inessprobe
version: v1
name: inessprobe
spec:
restartPolicy: Always
containers:
- name: inessprobe
image: web:apache
imagePullPolicy: Never
command: ['sh',"/etc/run.sh" ]
ports:
- containerPort: 80
name: httpd
protocol: TCP
readinessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 120
periodSeconds: 15
timeoutSeconds: 5
livenessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 180
timeoutSeconds: 5
periodSeconds: 15
EOF
cat << EOF > inessprobe-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: inessprobe
labels:
project: lykops
app: inessprobe
version: v1
spec:
selector:
project: lykops
app: inessprobe
version: v1
ports:
- name: http
port: 80
protocol: TCP
EOF
kubectl create -f inessprobe-svc.yaml
kubectl create -f inessprobe.yaml
- 參數說明:
initialDelaySeconds:容器啟動后第一次執行探測是需要等待多少秒。
periodSeconds:執行探測的頻率。默認是10秒,最小1秒。
timeoutSeconds:探測超時時間。默認1秒,最小1秒。
successThreshold:探測失敗后,最少連續探測成功多少次才被認定為成功。默認是1。對於liveness必須是1。最小值是1。
failureThreshold:探測成功后,最少連續探測失敗多少次才被認定為失敗。默認是3。最小值是1。