应用优雅上下线
1. 概述
kubernetes滾動升級的過程:
從以上過程可以看到,如果在terminationGracePeriodSeconds 沒有及時釋放服務注冊等資源信息,Service 負載均衡的健康檢查又沒有檢查到老 POD服務已經掛掉,導致請求分發到這些 POD 上,從而觸發一系列的請求錯誤,因而需要配置優雅下線腳本,在terminationGracePeriodSeconds 時間段內執行完畢。
?
2.優雅啟動
kubernetes 集群提供了探針,類似健康檢查,只有該請求通過,新的 POD 才能進入 Ready 狀態,kubernetes集群才會將新的 POD 納入 Service 的負載均衡。
因而如果該應用(POD)僅僅提供 service 配置的服務,不需要配置探針,就可以優雅啟動,但是實際 POD 往往還有 HSF,LWP,Dubbo等注冊于配置服務其實現負載均衡的服務,所以需要確保這些服務都已經啟動,所以需要配置相應的探針。
同時,任何一個服務可能在運行中因為某種原因不穩定,導致服務中斷,這個時候還需要配置livenessProbe探針,確保服務出故障時及時止損。
我們的應用主要有HSF,LWP 和 Https 服務,對于三種服務都有的應用,要求應用提供健康檢查的接口,能即時檢查三種服務都正常與否,然后做以下配置:
livenessProbe:failureThreshold: 3initialDelaySeconds: 30periodSeconds: 30successThreshold: 1tcpSocket:port: 5084timeoutSeconds: 1 readinessProbe:failureThreshold: 3initialDelaySeconds: 30periodSeconds: 30successThreshold: 1tcpSocket:port: 5084timeoutSeconds: 1 restartPolicy: AlwaysreadinessProbe配置表示只有5804端口請求正常返回,pod 才會進入 ready 狀態,確保各種服務 ok 。
livenessProbe 表示每10s 探一下5804端口,如果返回失敗,達到閾值后,pod 會重啟,對于服務出問題的 POD 及時止損。
注意:readinessProbe探針的 探測頻率和延時時間,不健康閾值等數據要合理,部分應用啟動時間本身較長,如果設置的時間過短,會導致 POD 反復無效重啟。
3. 優雅下線:
我們的應用云上主要有 HSF,LWP 和 Https 服務,在 pod prestop里設置執行摘除服務注冊信息腳本,來完成優雅下線。
https 服務基于 kubernetes 服務 Service 來實現服務暴露,在老 POD 狀態設置為Terminating后,就不會有請求達到,因而已經優雅下線;
lwp 服務,通過注冊 vipserver 來提供負載均衡,需要在下線前先摘除該服務注冊,防止 老POD 下線后還有請求達到老 POD;
HSF 服務通過注冊 configserver 來提供負載均衡,需要在下線前先摘除該服務注冊,防止 老POD 下線后還有請求達到老 POD。
yaml:
lifecycle:preStop:exec:command:- sudo- '-u'- admin- /home/admin/shutdown.sh- {app_name}preStop在 pod 終止之前,執行腳本 appctl.sh {app_name} stop。
終止 HSF 與 LWP 腳本:
#!/bin/bashAPP_NAME=$1## HEALTH_URL="http://localhost:7002/health"offline() {echo "INFO: ${APP_NAME} try to offline..."offline_lwpoffline_hsfecho "INFO: ${APP_NAME} offline success"return $? }offline_lwp() {echo "offline lwp"times=3for e in $(seq 3); docurl -s --connect-timeout 3 --max-time 5 ${offline_lwp_url}${APP_NAME} -o /dev/nullsleep 1done }offline_hsf() {check_hsf=`(/usr/sbin/ss -ln4 sport = :12200; /usr/sbin/ss -ln6 sport = :12200) | grep -c ":12200"`check_pandora=`(/usr/sbin/ss -ln4 sport = :12201; /usr/sbin/ss -ln6 sport = :12201) | grep -c ":12201"`echo "try to offline hsf..."if [ $check_hsf -ne 0 -a $check_pandora -ne 0 ]; thenecho "start to offline hsf...."ret_str=`curl --max-time ${HSF_ONLINE_TIMEOUT} -s "http://localhost:12201/hsf/offline?k=hsf" 2>&1`if echo "$ret_str" | grep "server is unregistered on cs(dr)" &>/dev/null; thenecho "hsf offline success."return 0elseecho "hsf offline failed."exit 9 # hsf offline failedfielseif [ $check_hsf -eq 0 ]; thenecho "WARN: port 12200 cannot be detected."fiif [ $check_pandora -eq 0 ]; thenecho "WARN: port 12201 cannot be detected."fiecho "WARN: hsf offline failed."# DO NOT exit herefi }echo "[stop 1] before call offline hsf,lwp ..."
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
- 上一篇: 2684亿销售额背后的阿里AI技术
- 下一篇: 如何抢占云栖大会C位?史上最强强强攻略来