spring-boot - 如何正确配置 Kubernetes 探针计时(针对 Spring Boot 应用程序)

标签 spring-boot kubernetes amazon-eks

我们有一个简单的 Spring Boot Web 应用程序,启动时间不到 30 秒。所以我按如下方式配置探针:

    readinessProbe:
      httpGet:
        path: /actuator/health/readiness
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 1
    livenessProbe:
      httpGet:
        path: /actuator/health/liveness
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 1

我的理解是,就绪探测会等待 30 秒,然后就会成功(如果应用程序已启动)。而且, active 探测会延迟 30 秒(从部署开始)启动,并且几乎会在就绪性探测成功的同时成功(如果应用程序已准备就绪)。但我在日志中看到的是,就绪探针等待 30 秒然后成功,但之后又等待 30 秒,然后旧 Pod 被关闭:

develop/demo-57c8984866-6v5sl[demo]: {"ts":"2020-10-08T17:33:07.378Z","logger":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer","level":"INFO","thread":"main","message":"Tomcat started on port(s): 8080 (http) with context path ''"}
develop/demo-57c8984866-6v5sl[demo]: {"ts":"2020-10-08T17:33:07.387Z","logger":"org.springframework.data.repository.config.DeferredRepositoryInitializationListener","level":"INFO","thread":"main","message":"Triggering deferred initialization of Spring Data repositories…"}
develop/demo-57c8984866-6v5sl[demo]: {"ts":"2020-10-08T17:33:09.441Z","logger":"org.springframework.data.repository.config.DeferredRepositoryInitializationListener","level":"INFO","thread":"main","message":"Spring Data repositories initialized!"}
develop/demo-57c8984866-6v5sl[demo]: {"ts":"2020-10-08T17:33:09.469Z","logger":"com.example.Application","level":"INFO","thread":"main","message":"Started Application in 23.918 seconds (JVM running for 25.343)"}
develop/demo-57c8984866-6v5sl[demo]: {"ts":"2020-10-08T17:33:14.251Z","logger":"org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]","level":"INFO","thread":"http-nio-8080-exec-1","message":"Initializing Spring DispatcherServlet 'dispatcherServlet'"}
develop/demo-57c8984866-6v5sl[demo]: {"ts":"2020-10-08T17:33:14.258Z","logger":"org.springframework.web.servlet.DispatcherServlet","level":"INFO","thread":"http-nio-8080-exec-1","message":"Initializing Servlet 'dispatcherServlet'"}
develop/demo-57c8984866-6v5sl[demo]: {"ts":"2020-10-08T17:33:14.292Z","logger":"org.springframework.web.servlet.DispatcherServlet","level":"INFO","thread":"http-nio-8080-exec-1","message":"Completed initialization in 30 ms"}
develop/demo-79cc9bc757-xlg6z[demo]: 2020-10-08T17:33:44.590172 Shutting down...
develop/demo-79cc9bc757-xlg6z[demo]: {"ts":"2020-10-08T17:33:44.658Z","logger":"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean","level":"INFO","thread":"SpringContextShutdownHook","message":"Closing JPA EntityManagerFactory for persistence unit 'default'"}
develop/demo-79cc9bc757-xlg6z[demo]: {"ts":"2020-10-08T17:33:44.664Z","logger":"org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor","level":"INFO","thread":"SpringContextShutdownHook","message":"Shutting down ExecutorService 'applicationTaskExecutor'"}
develop/demo-79cc9bc757-xlg6z[demo]: {"ts":"2020-10-08T17:33:44.667Z","logger":"com.zaxxer.hikari.HikariDataSource","level":"INFO","thread":"SpringContextShutdownHook","message":"HikariPool-1 - Shutdown initiated..."}
develop/demo-79cc9bc757-xlg6z[demo]: {"ts":"2020-10-08T17:33:44.680Z","logger":"com.zaxxer.hikari.HikariDataSource","level":"INFO","thread":"SpringContextShutdownHook","message":"HikariPool-1 - Shutdown completed."}

第二个30秒的等待时间是什么原因(参见第一个“正在关闭...”)?根据记录,不存在 SIGTERM 问题(应用程序正确响应 SIGTERM)。

更多信息
如果我对这些探测器的工作方式有误,请纠正我:容器启动,此时准备初始延迟的计时器也启动。 25 秒后,应用程序准备就绪。再过 5 秒,就绪探针开始命中应用程序/容器并且成功,因此应用程序已准备就绪(对吗?)。此时,我希望 k8s 向旧 pod 发送 sigterm,要求其关闭。但如日志所示,新容器准备就绪后,旧 Pod 仍运行了 30 秒以上。
也许,重新表述这个问题会有所帮助。我想在应用程序准备好后立即关闭旧的 Pod。该应用程序在 30 秒内即可准备就绪。换句话说,我需要整个部署只需要 30 秒(考虑到启动时间不到 30 秒,关闭时间不到 1 秒)。为什么上面的配置没有做到这一点? 谢谢。

最佳答案

好吧,事实证明,我们用来管理 k8s list 的工具 ( kubecfg ) 和库的 minReadySeconds 属性具有不同的默认值(30 秒)。我改变了这一点,一切都按预期进行。

关于spring-boot - 如何正确配置 Kubernetes 探针计时(针对 Spring Boot 应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64267964/

相关文章:

spring - 是否可以在 Swagger 中使用模型上传 MultipartFile? (在评论 415 Unsupported Media Type Resolved 中)

amazon-web-services - 负载均衡器上的入口 ip 白名单 - aws k8s

kubernetes - 带有 EKS 的 Terraform Kubernetes 提供程序在 configmap 上失败

Kubernetes:来自另一个 pod 的 kafka pod 可修复性问题

spring - OAuth2多重身份验证中的空客户端

spring-boot - Springdoc GroupedOpenApi 不遵循使用 OperationCustomizer 设置的全局参数

Spring Boot + Spring Data on GAE with CloudSql - 数据库连接

docker - Kubernetes YAML是否在同一个Pod中部署了多个镜像?

docker - 在 Kubernetes digital ocean 负载均衡器上安装 ssl

docker - Docker 容器中的自动缩放