【學(xué)習(xí)筆記08】每天5分鐘,玩轉(zhuǎn)kubernetes-08(Health Check)

第八章 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ì)重啟容器。
開(kāi)始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秒后開(kāi)始探測(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通過(guò)重啟來(lái)自愈。
Readiness探測(cè):告訴k8s什么時(shí)候可以將容器加入到Service負(fù)載均衡池中,對(duì)外提供服務(wù)。
\color{red}{僅把配置中l(wèi)iveness改為readiness就可}

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,來(lái)判斷是否失敗。
2)二者的配置方法完全相同,不同的是探測(cè)失敗后的處理:Liveness重啟容器;Readiness將容器設(shè)置為不可用。

  1. 二者獨(dú)立執(zhí)行,沒(méi)有依賴。Liveness探測(cè)判斷容器是否需要重啟來(lái)自愈; 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ù)庫(kù)等,從容器啟動(dòng)到真正提供服務(wù)需要一段時(shí)間??梢酝ㄟ^(guò)Readiness探測(cè)判斷容器是否就緒,避免將請(qǐng)求發(fā)到?jīng)]有準(zhǔn)備好的backend.

\color{red}{httpGet: 探測(cè)成功的判斷條件是http請(qǐng)求返回碼在200 ~ 400之間。(支持HTTP 和 HTTPS)}

readinessProbe:
  httpGet:
    scheme: HTTP                   
    path: /healthy                 # 訪問(wèn)路徑
    port: 8080                     # 指定端口
    initialDealySeconds: 10        # 容器啟動(dòng)10秒后開(kāi)始探測(cè)
    periodSeconds: 5               # 每隔5秒探測(cè)一次

\color{red}{需要實(shí)現(xiàn) http://[container-ip]:8080/healthy 接口。若返回200-400,則表示容器可開(kāi)始接收請(qǐng)求}

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ù)

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容