Kubernetes 之liveness和readness

默認情況下,kubernetes(以后簡稱k8s)當pod中所有container一“啟動”,就向其發(fā)送通信請求,并在pod崩潰后重啟他們。通常來說這已經(jīng)夠好了。但是k8s提供了一種更直接明了的方式。
那就是readiness和liveness探測器。

1 HealthChecks 分類

健康檢查(health check)是用于檢測應(yīng)用實例是否正常工作,對應(yīng)用狀態(tài)的監(jiān)控,保障業(yè)務(wù)高可用的一種機制。
k8s健康檢測主要分為以下三種

1.存活性探測(Liveness probes) :主要是探測應(yīng)用是否還活著。如果檢測到應(yīng)用沒有存活就殺掉當前pod并重啟;

2. 就緒性探測(Readiness probes):只要是探測應(yīng)用是否準備好接受請求訪問,如果檢測應(yīng)用準備好了,就把請求流量放進來;反之,則把應(yīng)用節(jié)點從注冊中心拿掉。

3. 啟動探測(Startup Probes):對于舊應(yīng)用需要更長的啟動時間,這時候既不想重啟應(yīng)用也不想讓請求訪問進來,可以設(shè)置啟動探測給足夠的啟動時間保證應(yīng)用啟動成功

1.1 Readiness

Readiness Probe的設(shè)計目的是讓Kubernetes明確知道Pod 何時已經(jīng)完全正版就緒。在向POD發(fā)送請求通信之前,首先進行Readiness Probe測試。如果測試沒有通過,Kubernetes 停止向其發(fā)送通信請求,直到測試通過。


readiness.gif

1.2 Liveness

Liveness Probe 是為了讓k8s知道pod是否存活(而不一定可用)。如果POD死掉,則k8s會將其remove并啟動一個新的POD 取而代之。


Liveness.gif

1.3 啟動探測

startupProbe: 指示容器中的應(yīng)用是否已經(jīng)啟動。如果提供了啟動探測(startup probe),則禁用所有其他探測,直到它成功為止。如果啟動探測失敗,kubelet 將殺死容器,容器服從其重啟策略進行重啟。如果容器沒有提供啟動探測,則默認狀態(tài)為成功Success
可以自定義在pod啟動時是否執(zhí)行這些檢測,如果不設(shè)置,則檢測結(jié)果均默認 為通過,如果設(shè)置,則順序為startupProbe>readinessProbe>livenessProbe

2 HealthCheck 工作原理

2.1 Readiness

    當POD剛剛開始啟動,對應(yīng)的服務(wù)并不一定完全啟動,正常提供服務(wù),默認情況下Kubernetes會立刻向POD發(fā)送請求一旦進程啟動(但此刻服務(wù)不一定可用),因此運用Readiness Probe,Kubernetes 會等待POD 完全ready后才會向其發(fā)送請求

2.2 Liveness

當POD 因特殊狀況下一直處于掛起狀態(tài)且不能響應(yīng)任何請求,然后此時進程卻存在,Kubernetes 會認認為服務(wù)一切正常并持續(xù)向掛起的POD發(fā)送請求.
若運用Liveness Probe,Kubernetes 會發(fā)現(xiàn)該POD意見停止響應(yīng),進而重啟異常的POD

3 Kubernetes Probe 類型

Kubernetes 支持三種方式來執(zhí)行探針
exec:在容器中執(zhí)行一個命令,如果命令退出碼返回0則表示探測成功,否則表示失敗
tcp:對指定的容IP及端口執(zhí)行一個TCP檢查,如果端口是開放的則表示探測成功,否則表示失敗
http:對指定的容器IP、端口及路徑執(zhí)行一個HTTP Get請求,如果返回的狀態(tài)碼在 [200,400)之間則表示探測成功,否則表示失敗

3.1 HTTP Probe

基于HTTP的探測(HTTPGetAction)向目標容器發(fā)起一個HTTP請求,根據(jù)其相應(yīng)碼進行結(jié)果判定,響應(yīng)碼如2xx或3xx時表示檢測通過。

#cat   liveness-http.yaml                   
apiVersion : v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness-http
    image: nginx
    ports:
    - name: http
      containerPort: 80
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh" ,"-c","echo liveness-http test > /usr/share/nginx/html/health"]
    livenessProbe:
      httpGet:
        path: /health
        port: http
        scheme: HTTP
  initialDelaySeconds: 30  #表示延遲30S開始第一次探測,默認值是0,最小值是0
  timeoutSeconds: 35        #表示每次探測的超時時間,35S后如果沒返回結(jié)果就認為超時失敗,默認值是1,最小值是1
  periodSeconds: 30  #表示在探測失敗后,最小的連續(xù)成功被認為是成功的,默認值是1,最小值是1
  successThreshold: 1   #表示當探測失敗時,Kubernetes將在認為失敗前嘗試failureThreshold次數(shù)。默認值是3,最小值是1;Liveness認為失敗的操作是重啟pod,而readiness認為失敗的操作是把pod標記為 Unready
  failureThreshold: 3 #表示多久進行一次探測,默認是10S,最小值是1

3.2 TCP Probe

基于TCP的存活性探測(TCPSocketAction)用于向容器的特定端口發(fā)起TCP請求并嘗試建立連接,連接成功即為通過檢測。

iveness-tcp.yaml             
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-tcp
spec:
  containers:
  - name: liveness-tcp
    image: nginx
    ports:
    - name: http
      containerPort: 80
    livenessProbe:
      tcpSocket:
        port: http
        initialDelaySeconds: 50    # 延遲探測時間(秒) 【 在k8s第一次探測前等待秒 】
        periodSeconds: 10          # 執(zhí)行探測頻率(秒) 【 每隔秒執(zhí)行一次 】
        timeoutSeconds: 1          # 超時時間
        uccessThreshold: 1        # 健康閥值 
        failureThreshold: 3        # 不健康閥值 

3.3 exec Probe

exec類型的探針通過在目標容器中執(zhí)行由用戶自定義的命令來判斷容器的監(jiān)控狀態(tài),若命令狀態(tài)返回值為0則表示“成功”通過檢測,其他值則均為“失敗”狀態(tài)

#cat  liveness-exec.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness-exec 
  name: liveness-exec 
spec:
  restartPolicy: OnFailure
  containers:
  - name: liveness-exec 
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 10; rm -rf /tmp/healthy; sleep 600
    livenessProbe: 
      exec:
        command: ["test","-e","/tmp/healthy"]
      initialDelaySeconds: 5    #探測延時時長,第一次探測前等待5秒,默認為0
      periodSeconds: 5          #每5秒執(zhí)行一次liveness探測,默認值10秒,最小1秒 
      timeoutSeconds: 2         #超長時長,默認為1s,最小值也為1s
      failureThreshold: 3       #處于成功狀態(tài)時,探測操作至少連續(xù)多少次的失敗才被視為檢測不通過,默認為3,最小為1

3 啟動探測(Startup Probes)

#cat  startup-probe.yml
ports:
- name: liveness-port
  containerPort: 8080
  hostPort: 8080

livenessProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 1
  periodSeconds: 10

startupProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 30
  periodSeconds: 10

由于啟動探測,應(yīng)用最多有5分鐘(30 * 10 = 300秒)來完成它的啟動。一旦啟動探測成功一次,活性探測(Livenees probes)將接管以提供對容器死鎖的快速響應(yīng)。如果啟動探測從未成功,容器將在300秒后被殺死,并遵循pod的重啟策略 restartPolicy
restartPolicy 主要有以下三種策略

Always: 當容器終止退出后,總是重啟容器,默認策略
Onfailure: 當容器異常退出后(退出碼非0)時,才重啟容器
Never: 當容器終止退出時,不重啟容器

每次探測都是以下三種結(jié)果之一:

成功:容器通過了探測
失?。喝萜魑赐ㄟ^探測
未知:容器探測失敗,不采取任何操作

4 liveness和readiness對比及區(qū)別

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

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

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    余生動聽閱讀 10,871評論 0 11
  • 彩排完,天已黑
    劉凱書法閱讀 4,483評論 1 3
  • 表情是什么,我認為表情就是表現(xiàn)出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,700評論 2 7

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