如果我使用此配置启动部署(即先启动服务,然后启动部署)则 pod 在启动期间会失败。

在日志中,我可以找到以下消息:

1
2
3
4
5
6
7
8
9
10
11
12
***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target
org.springframework.boot.autoconfigure.web.ServerProperties@42f93a98 failed:

Property: server.port
Value: tcp://10.98.151.181:8080
Reason: Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Integer' for property 'port'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [java.lang.Integer]

注意:10.98.151.181 是服务的集群 IP,可以在 Minikube 仪表板中看到。

如果我首先触发实际的 Deployment,则应用程序启动成功,然后我可以启动服务。不过官方文档建议先启动服务,然后部署:https://kubernetes.io/docs/concepts/configuration/overview/#services

对我来说,看起来 Service 将属性 server.port 设置为环境变量,而在 Service 之后启动的 Spring Boot 应用程序意外地将其解释为 Spring server.port。

任何想法如何解决这个问题?

Answers
对我来说,看起来服务将属性 server.port 设置为环境变量

不,kubernetes 它正在公开“docker 兼容”链接 env-vars,因为您的Service被命名为server,最终成为SERVER_PORT=tcp://thing:8080因为它试图“有帮助”

解决方案是给您的Service一个更具描述性的名称,或者屏蔽掉有问题的 env-var:

1
2
3
4
5
6
7
8
containers:
- name: server
env:
- name: SERVER_PORT
value: '' # you can try the empty string,
# or actually place the port value with
# value: '8080'
# ensure it is a **string** and not `value: 8080`