繁体   English   中英

如何正确配置 Kube.netes 探测计时(针对 Spring 启动应用程序)

[英]How to properly configure Kubernetes probes timing (for Spring Boot Application)

我们有一个简单的 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 秒然后就会成功(如果应用程序已启动)。 并且还有 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 将 sigterm 发送到旧的 pod,要求它关闭。 但如日志所示,在新容器准备就绪后,旧 pod 仍运行了 30 秒。
也许,改写这个问题会有所帮助。 我想在应用准备就绪后立即关闭旧 pod。 该应用程序可在不到 30 秒的时间内准备就绪。 换句话说,我需要整个部署只需要 30 秒(考虑到启动时间少于 30 秒,关闭时间少于 1 秒)。 为什么上面的配置不这样做? 谢谢。

好的,事实证明我们用来管理 k8s 清单的工具 ( kubecfg ) 和库对minReadySeconds属性(30 秒)具有不同的默认值。 我改变了它,一切都按预期工作。

从你的描述来看,你做的一切都很好。

我们观察到与第一个记录启动信息的 pod 不同的 pod 正在关闭。 没有更多信息,这看起来像是一个滚动更新,等待关闭旧 pod,直到新 pod 可用且健康。

您可以通过查看日志消息来判断:pod 名称在每一行的前面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM