Springboot应用程序不会选择Kubernetes配置映射名称

时间:2018-01-14 05:16:23

标签: maven spring-boot kubernetes

我正在将kubernetes configmap与我的springboot应用程序集成。我创建了config-map,在我的bootstrap.yml文件中给出了它的名字,并有一个简单的RestController来读取属性。但是,pod不会获取configmap的名称。在pod的日志中,我将configmap的名称视为“default”。我不知道出了什么问题。感谢任何帮助!

 Located property source: ConfigMapPropertySource [name='configmap.application.default']    

这是我的configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: echo-configmap
data:
  application.yml: |-
    bean:
      message: Hello from Kubernetes Configmap

的pom.xml

    <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
           <version>0.2.0.RELEASE</version>
    </dependency>

bootstrap.yml

 spring:
 application:
  name: echo-configmap

 cloud:
kubernetes:
  reload:
     enabled: true

控制器类

@RestController
 @EnableConfigurationProperties
@ConfigurationProperties(prefix = "bean")
public class EchoConfigController {

@Value("${message}")
private String message;



@RequestMapping(value="/echo", method=GET)
public String printKubeConfig() {
    System.out.println("EchoController is invoked ");
    System.out.println("message = "+message);
    return message;
}

}

Kubernetes pod日志:

[kubernetes1@se-docker-int-2 ~]$ kubectl logs echo-deployment-2968296553-h8m1q
04:53:33.873 [main] DEBUG io.fabric8.kubernetes.client.Config - Trying to configure client from Kubernetes config...
2018-01-14 04:53:42.122  INFO 7 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: ConfigMapPropertySource [name='configmap.application.default']
 2018-01-14 04:53:42.125  INFO 7 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: SecretsPropertySource [name='secrets.application.default']
2018-01-14 04:53:42.181  INFO 7 --- [           main] c.o.a.c.EchoServiceApplication           : The following profiles are active: kubernetes

2 个答案:

答案 0 :(得分:0)

这不是ConfigMap的名称,它是运行它的kubernetes命名空间的名称as seen here,在您的示例中显示&#34 ;名称&#34;是application

你实际上并没有说过你是否测试过RestController,说出它返回的内容(和/或发送到stdout);您的GET是否产生了任何输出,或者您是仅根据该日志消息提出此问题?

  

bootstrap.yml

 spring:
 application:
  name: echo-configmap

我无法判断您是否只是错误复制粘贴,但如果您确实在spring:中缩进bootstrap.yml密钥,则该文件将被错误解析通过Spring,导致spring.application.name不符合您的想法。

data:
  application.yml: |-
    bean:
      message: Hello from Kubernetes Configmap
...
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "bean")

最重要的是,您通过将ConfigurationProperties前缀命名为bean等非常通用的词语来踩踏薄冰。其次,您通过使RestController充当ConfigurationProperties实例来使事情变得更难,因为它们在Spring中具有非常非常不同的生命周期。第三,我需要测试它以肯定地说,但@Value传统上用于将SPeL值注入其他bean,而不是ConfigurationProperties中的随机字段 - 你是只需通过message访问器/ mutator模式将getMessage()/setMessage()转换为普通的JavaBean属性,即可获得更多。另外,以这种方式执行操作具有非常非常实际的好处,您可以在getset方法中设置断点,并亲眼看看Spring是否使用您期望的值调用它们。

答案 1 :(得分:0)

问题是我没有将我的application.properties打包到JAR文件中。因此,未读取应用程序名称。固定包装后,它工作