1、k8s健康性檢查的默認方式
k8s默認的健康檢查機制:基於Dockerfile文件中的CMD或者ENTRYPOINT,如果進程退出時返回碼為非零,則認為容器發生故障,k8s就會根據restartPolicy重啟容器。
1)docker的restartPolicy有一下4種:
always:(無論以什么碼退出,docker daemon都會嘗試重啟退出的容器,手動停止后,策略不再生效);
OnFailure:因出錯停止的容器(非零退出)。可以max-retries指定最大嘗試重啟的限制次數;
unless-stopped:與always類似,區別在於手動停止容器后,就算重啟docker deemon,容器策略也不再生效。
no:不自動重啟(默認模式)
2)k8s中的格式
...
spec:
restartPolicy: OnFailure #重啟策略
containers:
...
3)缺陷
這種機制的缺點就是在於:有時候容器發生故障,但進程並未退出,如容器的內部web服務顯示500,或者系統超載,但此時的httpd的進程並沒有異常退出,所以就容器依然正常運行。簡而言之就是無法判斷容器內的服務釋放正常。
2、Health Check-> liveness探測
1)liveness的目的
用戶可以自定義判斷容器是否健康為條件,如果探測失敗,k8s就會重啟容器,從而告訴k8s什么時候重啟容器實現自愈。
2)livenessProbe的關鍵字
...
spec:
containers:
...
livenessProbe: #Health Check的機制
httpGet: #探測方式:http的方式
path:/example/index.html #默認的索引目錄
port: 8080 #服務的端口
scheme: http #用到的協議
initialDelaySeconds: 5 #容器啟動10秒后開始執行liveness探測;若某個容器啟動需要30秒,則這個值就要設置大於30秒
periodSeconds: 10 #每次執行liveness探測的時間間隔
failureThreshold: 3 #liveness探測失敗的次數;如果連續三次失敗,就會殺掉進程重啟容器
successThreshold: 1 #liveness探測成功的次數;如果成功1次,就表示容器正常
timeoutSeconds: 5 #執行livesness的超時時間,如果執行后5秒沒有結果,則重啟執行liveness
3、Health Check-> readness探測
1)readness的目的
Readness探測是告訴什么時候可以將容器加入到svc負載均衡池中,對外提供服務
Readness探測的配置語法和liveness完全一樣
4、總結
1、若不特意配置liveness和readness,k8s則會采用默認的方式。即通過判斷容器啟動進程的返回值是否為零來判斷探測是否成功。
2、Livess和readness配置完全一樣,語法和參數也一樣,不同之處在於探測失敗后的行為:livess探測是重啟容器;而readness探測則是將容器設置為不可用,不接受service轉發的請求
3、 Liveness和readness是獨立執行的,二者之間沒有依賴,可單獨使用可同時使用:
Liveness探測判斷的是容器是否需要重啟實現自愈;
Readness探測判斷的是容器是否已准備好對外提供服務。
5、Liveness和readness的探測手段方法
http Get:返回200-400算成功,別的算失敗;
tcp socket:你指定的tcp端口打開,比如能telnet 上;
cmd exec:在容器中執行一個命令 推出返回0 算成功。