系列目錄html
kubernetes提供了livenessProbe(可用性探針)
和readinessProbe(就緒性探針)
對容器的健康性進行檢測,固然這僅僅簡單的關於可用性方面的探測,實際上咱們不單單要對容器進行健康檢測,還要對容器內佈置的應用進行健康性檢測,這不在本篇討論之列,後面會有專門篇幅來討論結合APM工具,grafana和prometheus的應用檢測預警機制.nginx
對於liveness probes
的結果也有幾個固定的可選項值:web
Success:表示經過檢測apache
Failure:表示沒有經過檢測api
Unknown:表示檢測沒有正常進行網絡
Liveness Probe的種類:app
ExecAction:在container中執行指定的命令。當其執行成功時,將其退出碼設置爲0;
TCPSocketAction:執行一個TCP檢查使用container的IP地址和指定的端口做爲socket。若是端口處於打開狀態視爲成功;socket
HTTPGetAcction:執行一個HTTP默認請求使用container的IP地址和指定的端口以及請求的路徑做爲url,用戶能夠經過host參數設置請求的地址,經過scheme參數設置協議類型(HTTP、HTTPS)若是其響應代碼在200~400之間,設爲成功。tcp
當前kubelet擁有兩個檢測器,他們分別對應不通的觸發器(根據觸發器的結構執行進一步的動做):工具
Liveness Probe:表示container是否處於live狀態。若是 LivenessProbe失敗,LivenessProbe將會通知kubelet對應的container不健康了。隨後kubelet將kill掉 container,並根據RestarPolicy進行進一步的操做。默認狀況下LivenessProbe在第一次檢測以前初始化值爲 Success,若是container沒有提供LivenessProbe,則也認爲是Success;
ReadinessProbe:表示container是否以及處於可接受service請求的狀態了。若是ReadinessProbe失敗,endpoints controller將會從service所匹配到的endpoint列表中移除關於這個container的IP地址。所以對於Service匹配到的 endpoint的維護其核心是ReadinessProbe。默認Readiness的初始值是Failure,若是一個container沒有提供 Readiness則被認爲是Success。
對於LivenessProbe和ReadinessProbe用法都同樣,擁有相同的參數和相同的監測方式。
initialDelaySeconds:用來表示初始化延遲的時間,也就是告訴監測從多久以後開始運行,單位是秒
periodSeconds:檢測的間隔時間,kubernetes每隔一段時間會檢測一次,默認爲10秒,最小爲1秒
timeoutSeconds: 用來表示監測的超時時間,若是超過這個時長後,則認爲監測失敗
當前對每個Container均可以設置不一樣的restartpolicy,有三種值能夠設置:
Always: 只要container退出就從新啓動
OnFailure: 當container非正常退出後從新啓動
Never: 從不進行從新啓動
若是restartpolicy沒有設置,那麼默認值是Always。若是container須要重啓,僅僅是經過kubelet在當前節點進行container級別的重啓。
最後針對LivenessProbe如何使用,請看下面的幾種方式,若是要使用ReadinessProbe只須要將livenessProbe修改成readinessProbe便可:
apiVersion: v1 kind: Pod metadata: name: probe-exec namespace: coocla spec: containers: - name: nginx image: nginx livenessProbe: exec: command: - cat - /tmp/health initialDelaySeconds: 5 timeoutSeconds: 1 --- apiVersion: v1 kind: Pod metadata: name: probe-http namespace: coocla spec: containers: - name: nginx image: nginx livenessProbe: httpGet: path: / port: 80 host: www.baidu.com scheme: HTTPS initialDelaySeconds: 5 timeoutSeconds: 1 --- apiVersion: v1 kind: Pod metadata: name: probe-tcp namespace: coocla spec: containers: - name: nginx image: nginx livenessProbe: initialDelaySeconds: 5 timeoutSeconds: 1 tcpSocket: port: 80
在用戶容器內執行一次命令,若是命令執行的退出碼爲0,則認爲應用程序正常運行,其餘任務應用程序運行不正常。
…… livenessProbe: exec: command: - cat - /home/laizy/test/hostpath/healthy ……
TCPSocket
將會嘗試打開一個用戶容器的Socket鏈接(就是IP地址:端口)。若是可以創建這條鏈接,則認爲應用程序正常運行,不然認爲應用程序運行不正常。
HTTPGet
調用容器內Web應用的web hook,若是返回的HTTP狀態碼在200和399之間,則認爲應用程序正常運行,不然認爲應用程序運行不正常。每進行一次HTTP健康檢查都會訪問一次指定的URL。
…… httpGet: #經過httpget檢查健康,返回200-399之間,則認爲容器正常 path: / #URI地址 port: 80 #端口號 #host: 127.0.0.1 #主機地址 scheme: HTTP #支持的協議,http或者https httpHeaders:’’ #自定義請求的header ……
cat << EOF > inessprobe.yaml apiVersion: v1 kind: ReplicationController metadata: name: inessprobe labels: project: lykops app: inessprobe version: v1 spec: replicas: 6 selector: project: lykops app: inessprobe version: v1 name: inessprobe template: metadata: labels: project: lykops app: inessprobe version: v1 name: inessprobe spec: restartPolicy: Always containers: - name: inessprobe image: web:apache imagePullPolicy: Never command: ['sh',"/etc/run.sh" ] ports: - containerPort: 80 name: httpd protocol: TCP readinessProbe: httpGet: path: / port: 80 scheme: HTTP initialDelaySeconds: 120 periodSeconds: 15 timeoutSeconds: 5 livenessProbe: httpGet: path: / port: 80 scheme: HTTP initialDelaySeconds: 180 timeoutSeconds: 5 periodSeconds: 15 EOF cat << EOF > inessprobe-svc.yaml apiVersion: v1 kind: Service metadata: name: inessprobe labels: project: lykops app: inessprobe version: v1 spec: selector: project: lykops app: inessprobe version: v1 ports: - name: http port: 80 protocol: TCP EOF kubectl create -f inessprobe-svc.yaml kubectl create -f inessprobe.yaml
initialDelaySeconds:容器啓動後第一次執行探測是須要等待多少秒。
periodSeconds:執行探測的頻率。默認是10秒,最小1秒。
timeoutSeconds:探測超時時間。默認1秒,最小1秒。
successThreshold:探測失敗後,最少連續探測成功多少次才被認定爲成功。默認是1。對於liveness必須是1。最小值是1。
failureThreshold:探測成功後,最少連續探測失敗多少次才被認定爲失敗。默認是3。最小值是1。