【发布时间】:2022-01-06 19:02:44
【问题描述】:
我有一个应用程序部署到 Kubernetes。 这里是技术栈: Java 11、Spring Boot 2.3.x 或 2.5.x,使用 hikari 3.x 或 4.x
使用弹簧执行器进行健康检查。这是application.yaml中的liveness和readiness配置:
endpoint:
health:
group:
liveness:
include: '*'
exclude:
- db
- readinessState
readiness:
include: '*'
如果 DB 宕机了怎么办 -
- 确保
liveness不会受到影响 - 意思是,应用程序 即使数据库中断,容器也应该继续运行。 -
readinesss将受到影响,以确保不允许任何流量到达容器。
容器规范中的liveness 和readiness 配置:
livenessProbe:
httpGet:
path: actuator/health/liveness
port: 8443
scheme: HTTPS
initialDelaySeconds: 30
periodSeconds: 30
timeoutSeconds: 5
readinessProbe:
httpGet:
path: actuator/health/readiness
port: 8443
scheme: HTTPS
initialDelaySeconds: 30
periodSeconds: 30
timeoutSeconds: 20
我的应用程序已启动并正常运行了几个小时。
我做了什么:
我打倒了 DB。
问题通知:
当 DB 关闭时,90 多秒后,我看到另外 3 个 Pod 启动。描述 pod 时,我会看到如下状态和条件:
Status: Running
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
当我列出所有正在运行的 pod 时:
NAME READY STATUS RESTARTS AGE
application-a-dev-deployment-success-5d86b4bcf4-7lsqx 0/1 Running 0 6h48m
application-a-dev-deployment-success-5d86b4bcf4-cmwd7 0/1 Running 0 49m
application-a-dev-deployment-success-5d86b4bcf4-flf7r 0/1 Running 0 48m
application-a-dev-deployment-success-5d86b4bcf4-m5nk7 0/1 Running 0 6h48m
application-a-dev-deployment-success-5d86b4bcf4-tx4rl 0/1 Running 0 49m
我的类比/发现:
每个 ReadinessProbe 配置:periodSeconds 设置为 30 秒,failurethreshold 默认为每个 k8s 文档 3 个。
每个 application.yaml readiness 包括数据库检查,这意味着每 30 秒后 readiness 检查失败。当它失败 3 次时,会遇到 failurethreshold 并启动新的 pod。
重启策略默认为 Always。
问题:
- 为什么它会旋转新的 pod?
- 为什么它只旋转 3 个豆荚,而不是 1 个或 2 个或 4 个或任何数量?
- 这和
restartpolicy有什么关系吗?
【问题讨论】:
标签: spring-boot kubernetes containers hikaricp readinessprobe