k8s deployment健康檢查

原文鏈接: http://idcsec.com/2019/03/14/k8s-deployment健康檢查/

進程健康檢查

健康檢查最簡單的方式就是檢查進程的狀態。Kubelet 不斷的詢問 Docker daemon 這個容器進程是否還在運行,如果沒有,這個容器就會被重啓。目前在所有 Kubernetes 的案例中,這種健康檢查是一直開啓的。對與 Kubernetes 中所有運行的容器都是生效的。然而,在很多場景中這個低級別的健康檢查是沒有作用的:比如進程也一直在運行,但是從應用的角度看,代碼已經死鎖,而且不會有正確的響應。

Pod健康檢測機制

LivenessProbe探針:
用於判斷容器是否存活,即Pod是否爲running狀態,如果LivenessProbe探針探測到容器不健康,則kubelet將kill掉容器,並根據容器的重啓策略是否重啓,如果一個容器不包含LivenessProbe探針,則Kubelet認爲容器的LivenessProbe探針的返回值永遠成功。
ReadinessProbe探針:
用於判斷容器是否正常提供服務,即容器的Ready是否爲True,是否可以接收請求,如果ReadinessProbe探測失敗,則容器的Ready將爲False,控制器將此Pod的Endpoint從對應的service的Endpoint列表中移除,從此不再將任何請求調度此Pod上,直到下次探測成功。(剔除此pod不參與接收請求)

目前,有三種類型的應用健康檢查你可以選擇:

  • exec:通過執行命令來檢查服務是否正常,回值爲0則表示容器健康
  • httpGet方式:通過發送http請求檢查服務是否正常,返回200-399狀態碼則表明容器健康
  • tcpSocket:通過容器的IP和Port執行TCP檢查,如果能夠建立TCP連接,則表明容器健康

探測的結果有以下三者之一:

  • Success:Container通過了檢查。
  • Failure:Container未通過檢查。
  • Unknown:未能執行檢查,因此不採取任何措施。

本環境使用httpGet方式

案例:

containers:
  - name: nginx
    image: nginx
    readinessProbe:
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          initialDelaySeconds: 120 
          periodSeconds: 15 
          timeoutSeconds: 2
    livenessProbe: 
          httpGet: 
            path: /
            port: 80
            scheme: HTTP
          initialDelaySeconds: 180 
          timeoutSeconds: 2
          periodSeconds: 15
----------
  • initialDelaySeconds:容器啓動後第一次執行探測是需要等待多少秒。
  • periodSeconds:執行探測的頻率。默認是10秒,最小1秒。
  • timeoutSeconds:探測超時時間。默認1秒,最小1秒。
  • successThreshold:探測失敗後,最少連續探測成功多少次才被認定爲成功。默認是1。對於liveness必須是1。最小值是1。
  • failureThreshold:探測成功後,最少連續探測失敗多少次才被認定爲失敗。默認是3。最小值是1。

httpGet探測方式有如下可選的控制字段

host:要連接的主機名,默認爲Pod IP,可以在http request head中設置host頭部。
httpHeaders:
– name: X-Custom-Header
value: Awesome
scheme: 用於連接host的協議,默認爲HTTP。
path:http服務器上的訪問URI。
httpHeaders:自定義HTTP請求headers,HTTP允許重複headers。
port: 容器上要訪問端口號或名稱
對於LivenessProbe和ReadinessProbe用法都一樣,擁有相同的參數和相同的監測方式。
當前對每一個Container都可以設置不同的restartpolicy,有三種值可以設置:
Always : 只要container退出就重新啓動
OnFailure : 當container非正常退出後重新啓動
Never : 從不進行重新啓動
restartPolicy: [Always|Never|OnFailure]//重啓策略
如果restartpolicy沒有設置,那麼默認值是Always。如果container需要重啓,僅僅是通過kubelet在當前節點進行container級別的重啓。
如果要使用ReadinessProbe只需要將livenessProbe修改爲readinessProbe即可

tcp 端口

ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 20
      periodSeconds: 10
      timeoutSeconds: 1
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 20
      periodSeconds: 10
      timeoutSeconds: 1

exec

readinessProbe:
      exec:
        command: ["python", "health_check.py", "server=-addr=:80"]
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      exec:
        command: ["python", "health_check.py", "server=-addr=:80"]
      initialDelaySeconds: 10
      periodSeconds: 10
livenessProbe:
  exec:
    command:
    - wget
    - --quiet
    - --tries=1
    - --timeout=4
    - --spider
    - http://localhost:8080/readyz
  timeoutSeconds: 5
  initialDelaySeconds: 5
  periodSeconds: 5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章