我正在尝试ConfigMap
使用 Spring 支持 K8s API 来处理我的外部化配置。我一直在使用没有任何问题的配置服务,所以我不认为这是一个云配置实现问题。我正在1.0.2.RELEASE
使用spring-cloud-starter-kubernetes-config
.
MyConfigMap
包含两个配置:全局 (application.yml) 和特定于应用程序的 yaml (myapp.yml)。看起来是这样的:
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
application.yml: |-
kafka:
hosts: kafka:9092
topics:
events: myapp-events
normalized: myapp-normalized
#...
storage:
uri: mongodb://mongo-0.mongo:27017,mongo-1.mongo:27017,mongo-2.mongo:27017
database: do-stuff-db
#...
spring:
cloud:
config:
override-system-properties: false
#...
myapp.yml: |-
myapp:
broadcast-address: 0.0.0.0:666
#...
application.yml
似乎工作得很好。我可以在我的应用程序中看到配置值,但无论出于何种原因,myapp.yml
都没有设置。我可以看到 Spring 成功地从 API 中获取了整个结果,ConfigMap
但它对myapp.yml
.
打开调试日志会暴露 Spring 是如何解释ConfigMap
结果的。它将整个myapp.yml
部分视为一个财产,而不是其自己的财产来源。这解释了为什么application.yml
要使用而不是myapp.yml
. 这是该日志的样子(我已经截断了消息):
2019-09-04 14:01:37.083 [main] INFO config.PropertySourceBootstrapConfiguration - Located property source: CompositePropertySource {name='composite-configmap', propertySources=[ConfigMapPropertySource@92864491 {name='configmap.myapp-config.default', properties={kafka.hosts=kafka:9092, kafka.topics.events=myapp-events, kafka.topics.normalized=myapp-normalized, myapp.yml=myapp:
bind-address: 0.0.0.0:666
#...
storage.uri: mongodb://mongo-0.mongo:27017,mongo-1.mongo:27017,mongo-2.mongo:27017, storage.database: do-stuff-db}}]}
我需要分离这些配置吗?我从 Spring 中看到的示例建议您可以将配置合并到单个 YAMLConfigMap
文件中。我难住了。