ConfigMap плохо работает с application.properties, но хорошо работает с application.yml - PullRequest
0 голосов
/ 07 июля 2019

плохо знакомы с 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        

Мой файл конфигурации при загрузке весной выглядит так:

@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.

Я делаю какие-либо ошибки / недоразумения с картой конфигурации. Не могли бы вы дать один совет?

Thx.

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Учитывая, что других ответов пока нет ... позвольте мне попытаться помочь вам.

Разделитель --- в файле 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

Они «материализуются» внутри работающего контейнера как отдельные файлы в смонтированном месте.

0 голосов
/ 08 июля 2019

Согласно документации здесь

Другой вариант - создать другую конфигурационную карту для каждого профиля, и весенняя загрузка автоматически получит ее на основе активных профилей

Вы также можете рассмотреть эти подходы:

    valueFrom:
      configMapKeyRef:
          name: example-configmap-overriding-new-02
          key: application-prod.properties
...