在Kubernetes上部署Spring Boot App:App使用来自环境变量

时间:2018-03-20 21:27:32

标签: spring-boot kubernetes minikube

我正在尝试在Kubernetes(Minikube)上部署“Hello world”Spring Boot应用程序。 该应用程序非常简单,只有一种方法,它映射在GET资源上。我甚至没有指定端口。

我现在正尝试在Minikube上部署应用程序,并使用服务提供该应用程序:

kind: Service
apiVersion: v1
metadata:
  name: server
spec:
  selector:
    app: server
  ports:
  - protocol: TCP
    port: 8080
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: server
spec:
  selector:
      matchLabels:
        app: server
  replicas: 3
  template:
    metadata:
      labels:
        app: server
    spec:
      containers:
        - name: server
          image: kubernetes-server:latest
          imagePullPolicy: Never
          ports:
            - name: http
              containerPort: 8080

如果我使用此配置启动部署(即首先启动服务,然后启动部署),则启动期间pod会失败。 在日志中,我可以找到以下消息:

***************************
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仪表板中看到。

如果我第一次触发实际部署,应用程序将成功启动,之后,我可以启动该服务。 但是,官方文档建议首先启动服务,然后启动服务:https://kubernetes.io/docs/concepts/configuration/overview/#services

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

任何想法如何解决?

1 个答案:

答案 0 :(得分:1)

  

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

不,kubernetes它暴露了“docker compatible”link env-vars,因为你的Service被命名为server,最终成为SERVER_PORT=tcp://thing:8080,因为它试图成为“有用的“

解决方案是为您的Service提供更具描述性的名称,或屏蔽掉有问题的env-var:

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`