Liveness 和 Readiness
- Kubernetes有兩個(gè)探測(cè)配置以確定應(yīng)用程序是飯后準(zhǔn)備好接受流量以及應(yīng)用程序是否仍在運(yùn)行
- 如果準(zhǔn)備就緒探針未返回200,則不會(huì)向其發(fā)送流量
- 如果活動(dòng)探針未返回200, 則會(huì)重啟Pod
- Spring Boot 在Actuator模塊內(nèi)置了一組端點(diǎn),來(lái)提供程序的應(yīng)用信息,確保應(yīng)用程序處于活動(dòng)狀態(tài)
/actuator/health/readiness 和 /actuator/health/liveness endpoint只有在Spring Boot 2.3.x 版本活以上才有,低于此版本的使用/actuator/health endpoint
配置Readiness探針
apiVersion: apps/v1
kind: Deployment
metadata:
...
name: k8s-demo-app
spec:
...
template:
...
spec:
containers:
...
readinessProbe:
httpGet:
port: 8080
path: /actuator/health/readiness
配置Liveness探針
apiVersion: apps/v1
kind: Deployment
metadata:
...
name: k8s-demo-app
spec:
...
template:
...
spec:
containers:
...
livenessProbe:
httpGet:
port: 8080
path: /actuator/health/liveness
優(yōu)雅關(guān)閉應(yīng)用程序
由于Kubnernetes以非同步方式關(guān)閉應(yīng)用程序,因此在停止前請(qǐng)求還是有可能路由到即將關(guān)閉的應(yīng)用程序。
為了解決這個(gè)問(wèn)題,我們可以配置應(yīng)用停止前先睡眠10秒,以便在終止請(qǐng)求請(qǐng)求不會(huì)路由到應(yīng)用程序。
將preStop命令添加到您的deploy.yaml的podspec中
apiVersion: apps/v1
kind: Deployment
metadata:
...
name: k8s-demo-app
spec:
...
template:
...
spec:
containers:
...
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10"]
- 當(dāng)應(yīng)用程序收到需要關(guān)閉的通知時(shí),盡管新的請(qǐng)求將不會(huì)發(fā)送到此應(yīng)用程序,但是它也可能還正在處理一些未完成的請(qǐng)求.
- 為了使我們能夠在應(yīng)用程序關(guān)閉前完成這些請(qǐng)求的處理,我們可以在應(yīng)用程序中配置一個(gè)"寬限期"
- 在application.properties 文件內(nèi)添加下面的配置
server.shutdown.grace-period=30s
server.shutdown.grace-period 配置只有在Spring Boot 2.3.x 版本活以上才生效
重新構(gòu)建容器和使新的k8s描述文件生效
./mvnw clean package
kubectl apply -f ./k8s
- Kubernetes將創(chuàng)建新的Pod,舊的Pod將會(huì)停止