我有一个部署到 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.yamlreadiness
包括数据库检查,这意味着每 30 秒readiness
检查一次失败。当它失败 3 次时,failurethreshold
会遇到并启动新的 pod。
重启策略默认为 Always。
问题:
- 为什么它会旋转新的豆荚?
- 为什么它只旋转 3 个豆荚而不是 1 个或 2 个或 4 个或任何数量?
- 这有什么关系
restartpolicy
吗?