第八章 Health Check
8.1 默認(rèn)的健康檢查
每個(gè)容器啟動(dòng)時(shí)會(huì)執(zhí)行一個(gè)進(jìn)程喂分,此進(jìn)程由Dockerfile的CMD或ENTRYPOINT指定。如果進(jìn)程退出時(shí)返回碼非零野宜,則認(rèn)為容器發(fā)生故障扫步,K8s就會(huì)根據(jù)restartPolicy.
如果容器進(jìn)程返回非零,K8s就認(rèn)為容器發(fā)生故障匈子,需要重啟河胎。
可是有時(shí)候,容器發(fā)生了故障虎敦,但是容器并不退出游岳。
編寫Pod配置
vim healthcheck.yml
apiVersion: v1
kind: Pod
metadata:
labels:
test: healthcheck
name: healthcheck
spec:
restartPolicy: OnFailure
containers:
- name: healthcheck
image: busybox
args:
- /bin/sh
- -c
- sleep 10; exit 1
測(cè)試
$kubectl apply -f healthcheck.yml
$kubectl get pods healthcheck
NAME READY STATUS RESTARTS AGE
healthcheck 0/1 Error 3 112s
#刪除pod healthcheck
$kubectl delete pod healthcheck
8.2 Liveness探測(cè)
Liveness探測(cè)讓用戶可以自定義判斷容器是否健康的條件。如果探測(cè)失敗其徙,K8是就會(huì)重啟容器胚迫。
開始30秒,/tmp/healthy文件存在唾那,cat 命令返回0访锻,liveness探測(cè)成功,
vim liveness.yml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness
spec:
restartPolicy: OnFailure
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 # 創(chuàng)建文件闹获,30秒后刪除
livenessProbe:
exec:
command:
- cat
- /tmp/healthy # 如果文件存在期犬,則認(rèn)為容器處于正常狀態(tài),反之則發(fā)生故障避诽;
initialDelaySeconds: 10 # 容器啟動(dòng)10秒后開始探測(cè)
periodSeconds: 5 # 每5秒執(zhí)行一次探測(cè)
#執(zhí)行
kubectl apply -f liveness.yml
kubectl describe pod liveness
$kubectl describe pod liveness
Warning Unhealthy 0s (x9 over 2m40s) kubelet, k8s-node-122132072 Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
Normal Killing 0s (x3 over 2m30s) kubelet, k8s-node-122132072 Container liveness failed liveness probe, will be restarted
$ kubectl get pods liveness
NAME READY STATUS RESTARTS AGE
liveness 1/1 Running 3 4m8s
8.3 Readiness探測(cè)
liveness探測(cè)龟虎,告訴k8s通過重啟來自愈。
Readiness探測(cè):告訴k8s什么時(shí)候可以將容器加入到Service負(fù)載均衡池中沙庐,對(duì)外提供服務(wù)鲤妥。
vim readiness.yml
apiVersion: v1
kind: Pod
metadata:
labels:
test: readiness #修改
name: readiness #修改
spec:
restartPolicy: OnFailure
containers:
- name: readiness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 10
periodSeconds: 5
readiness布署
kubectl apply -f readiness.yml
$ kubectl get pods readiness
NAME READY STATUS RESTARTS AGE
readiness 0/1 Running 0 87s
$kubectl describe pod readiness
Normal Pulling 112s kubelet, k8s-node-122132073 Pulling image "busybox"
Normal Pulled 103s kubelet, k8s-node-122132073 Successfully pulled image "busybox"
Normal Created 103s kubelet, k8s-node-122132073 Created container readiness
Normal Started 103s kubelet, k8s-node-122132073 Started container readiness
Warning Unhealthy 3s (x14 over 68s) kubelet, k8s-node-122132073 Readiness probe failed: cat: can't open '/tmp/healthy': No such file or directory
liveness 和 Readiness 比較:
1)默認(rèn)情況二者都是看容器退出時(shí)返回值是否為0,來判斷是否失敗拱雏。
2)二者的配置方法完全相同棉安,不同的是探測(cè)失敗后的處理:Liveness重啟容器;Readiness將容器設(shè)置為不可用铸抑。
- 二者獨(dú)立執(zhí)行垂券,沒有依賴。Liveness探測(cè)判斷容器是否需要重啟來自愈; Readiness探測(cè)容器是否已經(jīng)準(zhǔn)備好對(duì)外提供服務(wù)菇爪。
8.4 Health Check在Scale up中的應(yīng)用
當(dāng)執(zhí)行scale up(擴(kuò)容)的時(shí)候算芯,新的副本添加到service的負(fù)載均衡中,與已有副本一起處理客戶請(qǐng)求凳宙。應(yīng)用啟動(dòng)通常需要一個(gè)準(zhǔn)備階段熙揍,比如加載緩存、連接數(shù)據(jù)庫等氏涩,從容器啟動(dòng)到真正提供服務(wù)需要一段時(shí)間届囚。可以通過Readiness探測(cè)判斷容器是否就緒是尖,避免將請(qǐng)求發(fā)到?jīng)]有準(zhǔn)備好的backend.
readinessProbe:
httpGet:
scheme: HTTP
path: /healthy # 訪問路徑
port: 8080 # 指定端口
initialDealySeconds: 10 # 容器啟動(dòng)10秒后開始探測(cè)
periodSeconds: 5 # 每隔5秒探測(cè)一次
8.5 Health check 在滾動(dòng)更新中的應(yīng)用
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
httpd 2 2 2 0 6s
DESIRED: 期望有多少個(gè)副本
CURRENT: 當(dāng)前副本數(shù)目蛔添, 舊的 + 新的
UP-TO-DATE: 已經(jīng)完成更新的副本數(shù)
AVAILABLE: 狀態(tài)是READY可以提供服務(wù)的副本數(shù)