出處:https://www.cnblogs.com/justmine
1、淺析k8s兩種健康檢查機制Livenessk8s通過liveness來探測微服務的存活性,判斷什麼時候該重啟容器實現自愈。比如訪問 Web 伺服器時顯示 500 內部錯誤,可能是系統超載,也可能是資源死鎖,此時 httpd 程序並沒有異常退出,在這種情況下重啟容器可能是最直接最有效的解決方案。
Readinessk8s通過readiness來探測微服務的什麼時候準備就緒(例如初始化時,連線資料庫,載入快取資料等等,可能需要一段時間),然後將容器加入到server的負載均衡池中,對外提供服務。
1.1、k8s預設的健康檢查機制
每個容器啟動時都會執行一個程序,此程序由 Dockerfile 的 CMD 或 ENTRYPOINT 指定。如果程序退出時返回碼非零,則認為容器發生故障,Kubernetes 就會根據 restartPolicy 重啟容器。如果不特意配置,Kubernetes 將對兩種探測採取相同的預設行為。
2、通過微服務自定義兩種機制存活10分鐘:如果當前時間超過服務啟動時間10分鐘,則探測失敗,否則探測成功。Kubernetes 如果連續執行 3 次 Liveness 探測均失敗,就會殺掉並重啟容器。
從上面可以看到,我們可以根據自身的需求來實現這兩種機制,然後,提供給k8s進行探測。
3、編寫k8s資源配置檔案(yml)k8s預設是根據命令進行探測的,由於我們需要與微服務結合,所以需要在yml檔案中指定為http方式(備註:k8s提供了三種container probes方式:command、TCP check、HTTP Get,其他的方式希望大家下去自己實踐),k8s對於http方式探測成功的判斷條件是請求的返回程式碼在 200-400 之間。
health-checks-deployment.yml 如下:
apiVersion: apps/v1kind: Deploymentmetadata: namespace: k8s-ecoysystem-apps name: healthchecks-api labels: app: healthchecks-apispec: replicas: 3 selector: matchLabels: app: healthchecks-api template: metadata: namespace: k8s-ecoysystem-apps labels: app: healthchecks-api spec: containers: - name: healthchecks-api imagePullPolicy: Always image: justmine/healthchecksapi:v1.5 ports: - containerPort: 80 readinessProbe: httpGet: path: /api/v1/heathchecks/readiness port: 80 scheme: HTTP initialDelaySeconds: 30 periodSeconds: 60 livenessProbe: httpGet: path: /api/v1/heathchecks/liveness port: 80 scheme: HTTP initialDelaySeconds: 120 periodSeconds: 60從上面可以看到,一共部署了3個pod副本,而每個pod副本里面部署一個容器,即為同一個微服務部署了3個例項進行叢集。
從上面可以看到,剛開始建立時,READY 狀態為不可用,等待一段時間
現在全部可用了。
5、通過dashboard檢視叢集概況從上面可以看到,大約1分鐘(dashboard統計資訊有一定的延遲)左右,第一次進行 Readiness 探測併成功返回,此時準備就緒,可以對外提供服務了。在10分鐘內,探測Liveness也成功返回。
繼續等待一段時間,查詢其中一個pod詳細資訊:
從上面可以看到,超過10分鐘存活期後,liveness探測失敗,容器被 killed and recreated。探測Readiness未成功返回時,整個容器處於不健康的狀態,並不會被負載均衡請求。
此時通過dashboard檢視叢集概況:
繼續等待一段時間:
現在,整個叢集已經自愈完成了!!!
7、總結Liveness 探測和 Readiness 探測是獨立執行的,二者之間沒有依賴,可以單獨使用,也可以同時使用。用 Liveness 探測判斷容器是否需要重啟以實現自愈;用 Readiness 探測判斷容器是否已經準備好對外提供服務。
原始碼參考:https://github.com/justmine66/k8s.ecoysystem.apps
下一篇,我們將實踐微服務中的環境變數和配置資訊,如何與k8s進行結合。