Openshift 服务在短暂不活动后不可用
Openshift service is not available after short inactivity
我们的项目托管在 OpenShift 中(准确地说是 OKD。我们自己托管)。设置如下:
路由服务器(Spring Boot 1.5.8 with Zuul):这个服务器获取所有传入流量并将其路由到正确的服务
多个服务(都带Spring引导):这里是所有的业务逻辑
我们使用 SOAP 调用此项目中的其他服务。
目前,当我们调用应用程序时,调用会转到路由服务器,然后路由服务器将其路由到主要业务服务。
在大约一小时的短暂不活动后,我们的主要业务服务无法通过外部呼叫访问。然而,边缘服务器在 100% 的时间内可用和可调用。当我们调用它时,我们确实从系统中得到了一个 504 Gateway Timeout
异常。我们已经知道这是openshift中路由的超时时间(路由中的haproxy.router.openshift.io/timeout
)。
核心问题是,OpenShift 似乎在大约一小时不活动后使主要业务服务休眠。然而,在延迟 15 分钟后,呼叫似乎找到了目的地并且数据得到了正确处理。
我们如何才能关闭此行为?
编辑 1:
- 我们在生产中的普通“老式”虚拟机中有相同的应用程序。我们在那里没有任何问题。
- 我们注意到,当我们定期调用这些服务时,它们可以“保持活动状态”。我们建立了一个小型服务,定期调用主题(每 15 分钟)。这样它似乎工作。但这不是 IMO 的生产就绪解决方法。
编辑 2:
我们的 pod 配置(一些名称是匿名的):
https://gist.github.com/moritzluedtke/6867499b0acbb2d7b5a9a70e49b0d45c
我们不使用自动缩放器。
编辑 3:
我们的部署配置(一些名称是匿名的):
https://gist.github.com/moritzluedtke/dc7c1078fe9cc7e4aeb737094849fc1b
OpenShift Master: v3.11.0+1c3e643-87
Kubernetes Master: v1.11.0+d4cacc0
OpenShift Web Console: v3.11.0+ea42280
编辑 4:
看来这不是 OpenShift 的问题,而是我们的技术堆栈的问题。一旦我们有解决方案,我会更新这个问题。
我们最终更新了数据库驱动程序 (POSTGRESQL) 并从 spring 切换了默认连接池。
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>${HikariCP.version}</version>
</dependency>
我们的项目托管在 OpenShift 中(准确地说是 OKD。我们自己托管)。设置如下:
路由服务器(Spring Boot 1.5.8 with Zuul):这个服务器获取所有传入流量并将其路由到正确的服务
多个服务(都带Spring引导):这里是所有的业务逻辑
我们使用 SOAP 调用此项目中的其他服务。
目前,当我们调用应用程序时,调用会转到路由服务器,然后路由服务器将其路由到主要业务服务。
在大约一小时的短暂不活动后,我们的主要业务服务无法通过外部呼叫访问。然而,边缘服务器在 100% 的时间内可用和可调用。当我们调用它时,我们确实从系统中得到了一个 504 Gateway Timeout
异常。我们已经知道这是openshift中路由的超时时间(路由中的haproxy.router.openshift.io/timeout
)。
核心问题是,OpenShift 似乎在大约一小时不活动后使主要业务服务休眠。然而,在延迟 15 分钟后,呼叫似乎找到了目的地并且数据得到了正确处理。
我们如何才能关闭此行为?
编辑 1:
- 我们在生产中的普通“老式”虚拟机中有相同的应用程序。我们在那里没有任何问题。
- 我们注意到,当我们定期调用这些服务时,它们可以“保持活动状态”。我们建立了一个小型服务,定期调用主题(每 15 分钟)。这样它似乎工作。但这不是 IMO 的生产就绪解决方法。
编辑 2:
我们的 pod 配置(一些名称是匿名的):
https://gist.github.com/moritzluedtke/6867499b0acbb2d7b5a9a70e49b0d45c
我们不使用自动缩放器。
编辑 3:
我们的部署配置(一些名称是匿名的):
https://gist.github.com/moritzluedtke/dc7c1078fe9cc7e4aeb737094849fc1b
OpenShift Master: v3.11.0+1c3e643-87
Kubernetes Master: v1.11.0+d4cacc0
OpenShift Web Console: v3.11.0+ea42280
编辑 4:
看来这不是 OpenShift 的问题,而是我们的技术堆栈的问题。一旦我们有解决方案,我会更新这个问题。
我们最终更新了数据库驱动程序 (POSTGRESQL) 并从 spring 切换了默认连接池。
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>${HikariCP.version}</version>
</dependency>