iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 11
3
DevOps

Kubernetes 30天學習筆記系列 第 11

[Day 11] 如何確保 Container 運行狀態 - Health Checks

前言

正如前幾天提及 Kubernetes 可以偵測到 Pod 的生命週期去調整 Kubernetes Cluster 中其他物件的狀態。然而有些時候,**雖然 Pod 還在運行,但在 Pod 中的 web app container 可能因為某些原因已經停止運作,或是資源被其他 containers 佔用,導致我們送去的 request 無法正常回應。**幸好,Kubernetes 也幫我們想到這點了,它提供 Health Checks 協助我們去偵測 Pod 中的 containers 是否都還正常運作,確保服務本身也能正常運行。

今天的學習筆記內容如下:

  • 在 Kubernetes 中的 Health check 有哪些 ?
  • 實作:如何在 Pod 中加入 Health check

小提醒:今天的程式碼都可以在 demo-health-checks 上找到。

在 Kubernetes 中的 Health Checks 有哪些 ?

Kubernetes ,有兩種常見的 health checks,

  • 定期的透過指令去訪問 container
  • 定期發送一個 HTTP request 給 container

若當我們設定的 health checks 偵測到異常時,Kubernetes 會 restart container,確保應用服務可正常運行(avaiable)。

在今天的實作中,我們將使用 my-deployment-with-health-checks.yaml 來創建一個 Deployment 物件,並透過定期發送一個 HTTP request 給 container 的方式,來判斷目前 web app container 是否還正常運作。

實作:如何在 Pod 中加入 Health check

my-deployment-with-health-checks.yaml 內容如下,

apiVersion: apps/v1beta2 # for kubectl versions >= 1.9.0 use apps/v1
kind: Deployment
metadata:
  name: hello-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-deployment
  template:
    metadata:
      labels:
        app: my-deployment
    spec:
      containers:
      - name: webapp
        image: zxcvbnius/docker-demo
        ports:
        - name: webapp-port
          containerPort: 3000
        livenessProbe:
          httpGet:
            path: /
            port: webapp-port
          initialDelaySeconds: 15
          periodSeconds: 15
          timeoutSeconds: 30  
          successThreshold: 1
          failureThreshold: 3

可以看到在 my-deployment-with-health-checks.yaml 中多了 livenessProbe 設定。

livenessProbe

livenessProbe 中我們可以做以下設定,

  • httpGet.path
    設定 health checks 要訪問的路徑

  • httpGet.port
    指定我們要訪問的 port,這裡 port number 是 3000

  • initialDelaySeconds
    設定當 service 剛啟動時,要延遲幾秒再開始做 health check

  • periodSeconds
    代表每隔幾秒訪問一次,預設值為 10秒

  • successThreshold
    可以設置訪問幾次就代表目前 service 還正常運行

  • failureThreshold
    代表 service 回傳不如預期時,在 Kubernetes 放棄該 container 之前,會嘗試的次數,預設為3次。

通常在實際場景中(Production Environment),我們會有一個專門來回應 health check 的 endpoint,例如 /health 來確認 application 是否正常運作。

在暸解 livenessProbe 的各個設定之後,我們可以在終端機輸入 kubectl create 指令,創建一個名為 hello-deployment 的物件。

$ kubectl create -f ./my-deployment-with-health-checks.yaml
deployment "hello-deployment" created

接著,透過 kubectl get 來查看 hello-deployment

$ kubectl get deploy
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-deployment   3         3         3            3           23s

以及 Pods 的狀態 ,

我們可以使用 kubectl describe 看其中一個 Pod 的詳細資料,以 hello-deployment-6b56dd6494-mx5jk 為例

$ kubectl describe pod hello-deployment-6b56dd6494-mx5jk

可以在 Liveness 的欄位裡面,清楚看到目前 health check 的設定狀態。當 container 無法正常回應 health check 時,Kubernetes 就會視為該 container 失去功能並重啟。

總結

雖然今日的學習筆記只有分享,如何設置 定期訪問的 http reqeust ,然而 使用指令或 TCP 定期訪問服務 也是 health check 常見的方式。若有興趣的讀者,不妨參考 官網提供的範例 ,相信也會有所收穫!

參考連結


上一篇
[Day 10] Kubernetes世界不可缺少的 - Labels
下一篇
[Day 12] 敏感的資料怎麼存在k8s?! - Secrets
系列文
Kubernetes 30天學習筆記30

尚未有邦友留言

立即登入留言