1

k8s 新手。

通过https://cloud.spring.io/spring-cloud-static/spring-cloud-kubernetes/2.1.0.RC1/multi/multi__kubernetes_propertysource_implementations.html

我在配置映射中有多个配置文件,并希望我的应用程序根据 spring.profiles.active 获取属性。

情况1:-

我的 ConfigMap 看起来像,

kind: ConfigMap
apiVersion: v1
metadata:
  name: example-configmap-overriding-new-02
data:
  application.properties: |-
    globalkey = global key value
    TeamName = Team Name value
    Purpose = Purpose value
    RootFile = Root file value
    Company = company value
    Place = Place value
    Country = Country value
    ---
    spring.profiles = qa
    globalkey = global key qa value
    TeamName = Team Name qa value
    Purpose = Purpose qa value
    RootFile = Root file qa value
    ---
    spring.profiles = prod
    globalkey = global key prod value
    Company = company prod value
    Place = Place prod value
    Country = Country prod value

我的部署文件看起来像,

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: demo-configmapsingleprofile
spec:  
  selector:
    matchLabels:
      app: demo-configmapsingleprofile
  replicas: 1
  template: 
    metadata:
      labels:
        app: demo-configmapsingleprofile
    spec:
      serviceAccountName: config-reader
      containers:
      - name: demo-configmapsingleprofile
        image: image name
        ports:
        - containerPort: 8080
        envFrom:
          - configMapRef:
              name: example-configmap-overriding-new-02
        securityContext:
            privileged: false        

我在 Spring Boot 中的配置文件看起来像,

@Configuration
public class ConfigConsumerConfig {

@Value(value = "${globalkey}")
private String globalkey;

@Value(value = "${TeamName}")
private String teamName;

@Value(value = "${Purpose}")
private String purpose;

@Value("${RootFile}")
private String rootFile;

@Value("${Company}")
private String company;

@Value("${Place}")
private String place;

@Value("${Country}")
private String country;

//With getters and setters
}

我的 application.properties 看起来像,

spring.profiles.active=prod
spring.application.name=example-configmap-overriding-new-02
spring.cloud.kubernetes.config.name=example-configmap-overriding-new-02
spring.cloud.kubernetes.config.namespace=default
spring.cloud.kubernetes.config.sources[0].name=example-configmap-overriding-new-02
spring.cloud.kubernetes.config.enabled=true

应用程序启动良好,它从配置映射中获取了值。但它是从错误的配置文件中挑选出来的。一些值是从 qa 配置文件中获取的。

我得到的最终结果是:-

{"globalkey":"global key prod value","teamName":"Team Name qa value","purpose":"Purpose qa value","rootFile":"Root file qa value","company":"company prod value","place":"Place prod value","country":"Country prod value"}

案例2:-

但是,当我将配置映射与 yaml 一起使用时,如下所示,

kind: ConfigMap
apiVersion: v1
metadata:
  name: example-configmap-overriding-new-02
data:
  application.yml: |-    
    globalkey : global key value
    TeamName : Team Name value
    Purpose : Purpose value
    RootFile : Root file value
    Company : company value
    Place : Place value
    Country : Country value
    ---
    spring:
      profiles: qa
    globalkey : global key qa value
    TeamName : Team Name qa value
    Purpose : Purpose qa value
    RootFile : Root file qa value
    ---
    spring:
      profiles: prod
    globalkey : global key prod value
    Company : company prod value
    Place : Place prod value
    Country : Country prod value

我得到了预期的结果。它按预期从产品配置文件中挑选。

{"globalkey":"global key prod value","teamName":"Team Name value","purpose":"Purpose value","rootFile":"Root file value","company":"company prod value","place":"Place prod value","country":"Country prod value"}

案例 2 按预期工作,但案例 1 没有。

我对配置图有任何错误/误解吗?有人可以在这里提出建议吗?

谢谢。

4

2 回答 2

1

鉴于还没有其他答案......让我试着帮助你。

YAML 文件中的---分隔符分隔多个 YAML 文档。在属性文件中并非如此。不确定属性文件是如何被加载的,---但是如果它现在的结构方式会导致重复的键,其中一个键会覆盖它之前的相同键。

使用属性文件时,创建多个键/值对 - 每个配置文件一个。像这样的东西:

kind: ConfigMap
apiVersion: v1
metadata:
  name: example-configmap-overriding-new-02
data:
  application.properties: |-
    globalkey = global key value
    TeamName = Team Name value
    Purpose = Purpose value
    RootFile = Root file value
    Company = company value
    Place = Place value
    Country = Country value
  application-qa.properties: |-
    spring.profiles = qa
    globalkey = global key qa value
    TeamName = Team Name qa value
    Purpose = Purpose qa value
    RootFile = Root file qa value
  application-prod.properties: |-
    spring.profiles = prod
    globalkey = global key prod value
    Company = company prod value
    Place = Place prod value
    Country = Country prod value

它们将在正在运行的容器中“具体化”为挂载位置的单个文件。

于 2019-07-08T00:11:14.537 回答
0

根据此处的文档

另一种选择是为每个配置文件创建不同的配置映射,spring boot 将根据活动配置文件自动获取它

您还可以考虑以下方法:

    valueFrom:
      configMapKeyRef:
          name: example-configmap-overriding-new-02
          key: application-prod.properties
于 2019-07-08T11:31:18.620 回答