iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 14
0
Kubernetes

Kubernetes~成為Devops工程師的必經試煉系列 第 14

Day 14 檢查 Kubernetes 中 Pod的健康狀態 ~Health Check

前言

當使用kuberentes的時候,一定會遇過Pod在啟動後過沒多久就掛掉然後又重新啟動的循環?你有沒有想過 kubernetes 是如何偵測 Pod 是否還活著?雖然Container 已經啟動,但是 kubernetes 如何知道Container 的進度是否準備好能與其他服務連線了呢?

Kubelet 使用 Liveness probe 功能來確定何時重啟 Container 。當應用處於運做,但無法做進一步操作,Liveness 將偵測到 Deadlock,重啟處於該狀態下的容器,使程式在存在 Bug 的情況下依然能繼續運作。

Kubelet 使用 Readiness probe 來確定 Conatiner 是否已可以連接。只有當 Pod 中的 COntainer 都處於就緒狀態時 kubelet 才會認定該Pod處於就緒狀態。該信號的作用是控制哪些 Pod 應該作為 service 的後端。如果Pod處於非就緒狀態,那麼它們將會被從service的load balancer中移除。

實際操作

許多長時間運行的應用程序最終會轉換到 broken 狀態,除非重新啟動,否則無法恢復。 Kubernetes 提供了 liveness probe 來檢測並且恢復。

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

透過以上的定義yaml建立一個 Pod 並且裡邊包含一個 Container 。

  • PeriodSeconds 規定 kubelet 要每隔5秒執行一次liveness probe。
  • InitialDelaySeconds 告訴 kubelet 在第一次執行probe之前要的等待5秒鐘。
  • 探針檢測命令是在容器中執行 cat /tmp/healthy 命令。
  • 如果命令執行成功,將返回0, kubelet 就會認為該容器是活著的並且很健康。
  • 如果返回非0值, kubelet 就會殺掉這個 Container 並重啟它。

在這邊操作時需要開啟兩個cmd,首先第一個cmd 請執行以下指令

/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"
  • 在 Container 生命週期中最初30秒內有一個 /tmp/healthy 文件,在這30秒內 cat /tmp/healthy 命令會返回一個成功的返回碼。
  • 30秒後, cat /tmp/healthy 將返回失敗的返回碼。

接下來開啟第二個cmd,建立Pod

 $ kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/exec-liveness.yaml

結果顯示沒有失敗的 liveness probe:

$ kubectl describe pod liveness-exec
...
Type     Reason     Age                     From               Message
----     ------     ----                    ----               -------
Normal   Killing    44m (x624 over 15d)     kubelet, minikube  Killing container with id docker://liveness:Container failed liveness probe.. Container will be killed and recreated.
Warning  Unhealthy  14m (x1894 over 15d)    kubelet, minikube  Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
Warning  BackOff    4m26s (x7271 over 15d)  kubelet, minikube  Back-off restarting failed container

過 30秒在重新查詢一次 Liveness-exec Pod 會發現已經重起了

$ kubectl describe pod liveness-exec
NAME            READY   STATUS             RESTARTS   AGE
liveness-exec   1/1     Running            1          5m

參考連結

  1. Configure Liveness and Readiness Probes

  2. 配置Pod的liveness和readiness探针


上一篇
Day 13 Kubernetes 中處理有狀態 Container 如何運作 ~StatefulSets
下一篇
Day 15 Kubernetes 機密資料處理~Secrets
系列文
Kubernetes~成為Devops工程師的必經試煉17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言