容器健康檢查和恢復(fù)機(jī)制

在 Kubernetes 中,你可以為 Pod 里的容器定義一個(gè)健康檢查“探針”(Probe)。這樣,kubelet 就會(huì)根據(jù)這個(gè) Probe 的返回值決定這個(gè)容器的狀態(tài),

健康檢查屬于contar
命令檢查

livenessProbe
  exec:
    command:
      - cat
      - /tmp/healt

http端口,url檢查

    livenessProbe:
      httpGet: 
        path: /stub_status
        port: 80
        httpHeaders: 
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

healthy.yaml文件

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: test-liveness-exec
spec:
  containers:
  - name: liveness
    image: 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

它在啟動(dòng)之后做的第一件事,就是在 /tmp 目錄下創(chuàng)建了一個(gè) healthy 文件,以此作為自己已經(jīng)正常運(yùn)行的標(biāo)志。而 30 s 過后,它會(huì)把這個(gè)文件刪除掉。

與此同時(shí),我們定義了一個(gè)這樣的 livenessProbe(健康檢查)。它的類型是 exec,這意味著,它會(huì)在容器啟動(dòng)后,在容器里面執(zhí)行一句我們指定的命令,比如:“cat /tmp/healthy”。這時(shí),如
果這個(gè)文件存在,這條命令的返回值就是 0,Pod 就會(huì)認(rèn)為這個(gè)容器不僅已經(jīng)啟動(dòng),而且是健康
的。這個(gè)健康檢查,在容器啟動(dòng) 5 s 后開始執(zhí)行(initialDelaySeconds: 5),每 5 s 執(zhí)行一次
(periodSeconds: 5)

如果你注意到 RESTARTS 字段從 0 到 1 的變化,就明白原因了:這個(gè)異常的容器已經(jīng)被
Kubernetes 重啟了。在這個(gè)過程中,Pod 保持 Running 狀態(tài)不變。
需要注意的是:Kubernetes 中并沒有 Docker 的 Stop 語(yǔ)義。所以雖然是 Restart(重啟),但實(shí)
際卻是重新創(chuàng)建了容器。
這個(gè)功能就是 Kubernetes 里的Pod 恢復(fù)機(jī)制,也叫 restartPolicy。它是 Pod 的 Spec 部分的一個(gè)
標(biāo)準(zhǔn)字段(pod.spec.restartPolicy),默認(rèn)值是 Always,即:任何時(shí)候這個(gè)容器發(fā)生了異常,它一定會(huì)被重新創(chuàng)建。
但一定要強(qiáng)調(diào)的是,Pod 的恢復(fù)過程,永遠(yuǎn)都是發(fā)生在當(dāng)前節(jié)點(diǎn)上,而不會(huì)跑到別的節(jié)點(diǎn)上去。事實(shí)上,一旦一個(gè) Pod 與一個(gè)節(jié)點(diǎn)(Node)綁定,除非這個(gè)綁定發(fā)生了變化(pod.spec.node 字段被修改),否則它永遠(yuǎn)都不會(huì)離開這個(gè)節(jié)點(diǎn)。這也就意味著,如果這個(gè)宿主機(jī)宕機(jī)了,這個(gè) Pod 也不會(huì)主動(dòng)遷移到其他節(jié)點(diǎn)上去。
而如果你想讓 Pod 出現(xiàn)在其他的可用節(jié)點(diǎn)上,就必須使用 Deployment 這樣的“控制器”來管理
Pod,哪怕你只需要一個(gè) Pod 副本。這就是我在第 12 篇文章《牛刀小試:我的第一個(gè)容器化應(yīng)
用》最后給你留的思考題的答案,即一個(gè)單 Pod 的 Deployment 與一個(gè) Pod 最主要的區(qū)別。
而作為用戶,你還可以通過設(shè)置 restartPolicy,改變 Pod 的恢復(fù)策略。除了 Always,它還有
OnFailure 和 Never 兩種情況:
Always:在任何情況下,只要容器不在運(yùn)行狀態(tài),就自動(dòng)重啟容器;
OnFailure: 只在容器 異常時(shí)才自動(dòng)重啟容器;
Never: 從來不重啟容器。
在實(shí)際使用時(shí),我們需要根據(jù)應(yīng)用運(yùn)行的特性,合理設(shè)置這三種恢復(fù)策略。

記住如下兩個(gè)基本的設(shè)計(jì)原理即可:

  • 只要 Pod 的 restartPolicy 指定的策略允許重啟異常的容器(比如:Always),那么這個(gè) Pod就會(huì)保持 Running 狀態(tài),并進(jìn)行容器重啟。否則,Pod 就會(huì)進(jìn)入 Failed 狀態(tài) 。
  • 對(duì)于包含多個(gè)容器的 Pod,只有它里面所有的容器都進(jìn)入異常狀態(tài)后,Pod 才會(huì)進(jìn)入 Failed 狀態(tài)。在此之前,Pod 都是 Running 狀態(tài)。此時(shí),Pod 的 READY 字段會(huì)顯示正常容器的個(gè)

如果這個(gè) Pod 有多個(gè)容器,僅有一個(gè)容器異常退出,它就始終保持 Running 狀態(tài),哪怕即使
restartPolicy=Never。只有當(dāng)所有容器也異常退出之后,這個(gè) Pod 才會(huì)進(jìn)入 Failed狀態(tài)。

nginx配置文件,location必須同一級(jí)(縮進(jìn)對(duì)其)

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: test-liveness-exec-2
spec:
  containers:
  - name: liveness
    image: nginx
    livenessProbe:
      httpGet: 
        path: /stub_status
        port: 80
        httpHeaders: 
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3
    volumeMounts:
    - name: mysqlcfmap
      mountPath: "/etc/nginx/conf.d/" # 掛載到容器中目錄,這個(gè)目錄會(huì)自動(dòng)創(chuàng)建
  volumes:
  - name: mysqlcfmap
    configMap:
       name: nginx.conf  # 創(chuàng)建 configmap 對(duì)象的名稱
       items:
       - key: nginx.conf  # 創(chuàng)建  configmap 對(duì)象時(shí)指定的 key
         path: nginx.conf  #
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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