由於k8s中採用大量的異步機制、以及多種對象關係設計上的解耦,當應用實例數 增長/刪除
、或者應用版本發生變化觸發滾動升級時,系統並不能保證應用相關的service、ingress配置老是及時能完成刷新。在一些狀況下,每每只是新的Pod完成自身初始化,系統還沒有完成EndPoint
、負載均衡器等外部可達的訪問信息刷新,老得Pod就當即被刪除,最終形成服務短暫的額不可用,這對於生產來講是不可接受的,因此這個時候存活探針(Readiness)就登場了html
有時候,服務啓動以後並不必定可以立馬使用,咱們之前常作的就是使用就緒探針設置initialDelay
(容器啓動後多少s開始探測)值,來判斷服務是否存活,大概設置以下nginx
livenessProbe: httpGet: path: /test prot: 80 failureThreshold: 1 initialDelay:10 periodSeconds: 10
可是這個時候會出現這麼一個狀況,若是咱們的服務A啓動須要60s ,若是採用上面探針的會,這個pod就陷入死循環了,由於啓動以後通過10s探測發現不正常就會更具重啓策略進行重啓Pod,一直進入死循環。那聰明的你確定能猜到咱們調整下initialDelay
的值不就行了嗎? 可是你能保證每一個服務你都知道啓動須要多少s 能好嗎?
聰明的您確定又想到了 哪咱們能夠調整下failureThreshold
的值就行了,可是應該調整爲多大呢?若是咱們設置成docker
livenessProbe: httpGet: path: /test prot: 80 failureThreshold: 5 initialDelay:10 periodSeconds: 10
若是設置成這樣,第一次pod 是能正常啓動了,可是咱們到後面探測的話須要(5*10s=50s)咱們才能發現咱們的服務不可用。這在生產中是不容許發生的,因此咱們採用startupProbe
使用和livenessProbe
同樣的探針來判斷服務是否啓動成功了api
livenessProbe: httpGet: path: /test prot: 80 failureThreshold: 1 initialDelay:10 periodSeconds: 10 startupProbe: httpGet: path: /test prot: 80 failureThreshold: 10 initialDelay:10 periodSeconds: 10
咱們這隻成這樣的話,只要服務在1010=100s內任什麼時候候啓動來都行,探針探測成功後就交給livenessProbe進行繼續探測了,當咱們發現問題的時候110=10 在10s內就能發現問題,並及時做出響應。bash
檢測容器中的程序是否啓動就緒,只有當檢測容器中的程序啓動成功以後,纔會變成running狀態,不然就是容器啓動成功,他仍是失敗的信號(由於他裏面的服務沒有探測成功)負載均衡
檢測容器是否在運行,只是單純的檢測容器是否存活,並不會檢測裏面的服務是否正常.若是探針檢測到失敗,他將啓動他的重啓策略.異步
# cat nginx.yaml apiVersion: v1 kind: Pod metadata: name: nginx spec: restartPolicy: OnFailure containers: - name: nginx image: nginx:1.14.1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 protocol: TCP - name: https containerPort: 443 protocol: TCP livenessProbe: exec: command: ["test","-f","/usr/share/nginx/html/index.html"] failureThreshold: 3 initialDelaySeconds: 5 periodSeconds: 5 timeoutSeconds: 5 readinessProbe: httpGet: port: 80 path: /index.html initialDelaySeconds: 15 timeoutSeconds: 1
咱們啓動這個容器,測試一下服務探針.tcp
kubectl create -f nginx.yaml
咱們進入到nginx容器裏面把index這個文件刪除了,看看詳細信息ide
#kubectl describe pod nginx ..... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m24s default-scheduler Successfully assigned default/nginx to 192.168.1.124 Normal Pulling 4m23s kubelet, 192.168.1.124 pulling image "nginx:1.14.1" Normal Pulled 4m1s kubelet, 192.168.1.124 Successfully pulled image "nginx:1.14.1" Warning Unhealthy 57s kubelet, 192.168.1.124 Readiness probe failed: HTTP probe failed with statuscode: 404 Warning Unhealthy 50s (x3 over 60s) kubelet, 192.168.1.124 Liveness probe failed: Normal Killing 50s kubelet, 192.168.1.124 Killing container with id docker://nginx:Container failed liveness probe.. Container will be killed and recreated. Normal Pulled 50s kubelet, 192.168.1.124 Container image "nginx:1.14.1" already present on machine Normal Created 49s (x2 over 4m) kubelet, 192.168.1.124 Created container Normal Started 49s (x2 over 4m) kubelet, 192.168.1.124 Started container
很明顯的從事件信息裏面能夠看到他服務探測有一次是報錯404的,而後立馬就執行了重啓容器的過程測試
exec: 使用自定義命令編寫探針
httpGet: 使用http訪問的方式探測
tcpSocket: 使用tcp套接字來探測
failureThreshold: 連續失敗幾回算真正的失敗
initialDelaySeconds: 容器啓動多少秒以後開始探測(由於容器裏面的服務啓動須要時間)
periodSeconds: 探測時間間隔多少秒
timeoutSeconds: 命令執行的超時時間
HTTPGet的探針參數: