背景: 使用k8s過程當中因爲服務存在bug致使業務中斷,因此須要增長健康檢查,主要參考k8s的文檔docker
在容器化場景下,對於容器的健康檢查可能經過在製做docker鏡像時的dockerfile中增長HEALTHCHECK指令(僅能有一條)的方式進行,HEALTHCHECK指令主要有兩種形式:api
當容器指定了健康檢查指令後,容器的狀態將多出一種健康狀態,健康狀態初始化爲starting,當健康檢查指令執行經過後,狀態轉爲healthy,若是容器健康檢查失敗了,將轉爲unhealthy 對於OPTIONS能夠指定如下的參數bash
對於CMD命令,命令的返回值表示了容器的健康檢查狀態,一共有三種網絡
HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1
(參考https://docs.docker.com/engine/reference/builder/)curl
k8s不支持經過docker的HEALTHCHECK來進行容器的健康檢查(Docker Swarm能夠-可是我沒用過),可是k8s自身提供了兩種相似於健康檢查的能力socket
在pod的containers中定義livenessProbe或readnessProbetcp
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
經過在容器中執行命令(腳本)的方式來獲取容器的狀態,腳本或命令返回0時表示成功,不然表示失敗(若是容器指定了用戶,則會以對應用戶去執行,因此注意使用腳本時須要相應的權限)ui
livenessProbe: exec: command: - /bin/bash - /home/test/healthcheck.sh initialDelaySeconds: 5 periodSeconds: 5
經過發送HTTP GET請求的方式獲取容器狀態,返回狀態碼>=200且<400時表示狀態正常,不然表示失敗,支持自定義HTTP Header(在1.13版本前若是容器內定義了http_proxy環境變量,則在發送請求時會使用proxy,1.13及之後版本中不會再受此影響)this
livenessProbe: httpGet: path: /healthcheck port: 1888 httpHeaders: - name: Custom-Header value: Test initialDelaySeconds: 3 periodSeconds: 3
http檢查的一些字段url
port: 端口 path: uri httpHeaders: 請求頭 host: 主機名,默認值時pod自身的ip地址(沒用過,也許多網絡平面場景下須要使用) scheme: HTTP/HTTPS 默認HTTP
經過tcp socket創建鏈接的方式去判斷容器狀態,若是可以建連成功,則判斷狀態正常,不然異常
livenessProbe: tcpSocket: port: 1888 initialDelaySeconds: 15 periodSeconds: 20
除了健康檢查方式外,還有一些參數用於控制健康檢查的的行爲
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/