Потребляйте конфигурационный файл k8s весной - PullRequest
0 голосов
/ 10 марта 2020

У меня есть служба весенней загрузки, которая в настоящее время использует файл .properties для использования переменных с помощью аннотации spring @Value. Недавно мы мигрировали сервис весенней загрузки в кластер K8. Это означает, что нам нужно создать файл configmap.yml, содержащий все те же свойства, что и файл .properties. И всякий раз, когда вносятся изменения в свойства, это должно быть сделано в обоих местах: файл config и файл .properties используются для локального разработчика. Таким образом, мы должны управлять 2 файлами (configmap и .properties) для каждого весеннего профиля. Есть лучший способ сделать это? Для развертывания мы используем инструменты gitlab ci / cd.

Есть ли способ использовать конфигурационную карту вместо свойств для локальной разработки на наших машинах, чтобы мы могли полностью отказаться от файла .properties и поддерживать только конфигурационную карту?

Какой идеальный способ управления свойствами для приложения с весенней загрузкой?

Образец файла свойств service-config-map.yaml

kind: ConfigMap 
apiVersion: v1 
metadata:
  name: myservice-config
data:
  server.port: "10300"
  spring.application.name: myserviceGateway
  myservice.application.name: helloworld
  myservice.server.apiContext: /api
  myservice.server.versionContext: /v
  myservice.current.version=2.0

application.properties

server.port=10300
spring.application.name=myserviceGateway
myservice.application.name=helloworld
myservice.server.apiContext=/api
myservice.server.versionContext=/v
myservice.current.version=2.0

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Проект Spring Cloud Kubernetes делает Kubernetes ConfigMap s доступным во время начальной загрузки приложения и запускает горячую перезагрузку bean-компонентов или контекста Spring при обнаружении изменений в наблюдаемых ConfigMap s.

Пример здесь

yaml bootstrap с именем карты конфигурации выглядит как

spring:
  application:
    name: reload-example
  cloud:
    kubernetes:
      reload:
        enabled: true
        mode: polling
        period: 5000
      config:
        sources:
          - name: other
          - name: ${spring.application.name}
0 голосов
/ 12 марта 2020

В зависимости от вашего типа доступа к кластеру, вы можете использовать K8s API для получения ресурсов через HTTP. Например, у вас может быть какой-то сценарий, который извлекает конфигурационную карту из вашего кластера и анализирует ее в yaml (по умолчанию он находится в json, но не уверен, поддерживается ли вывод yaml, хотя на самом деле не тестировал).

Подробнее здесь: https://docs.openshift.com/container-platform/3.7/rest_api/api/v1.ConfigMap.html#Get -api-v1-namespaces-namespace-configmaps-name

0 голосов
/ 11 марта 2020

Да, это выполнимо.

Прежде всего вам понадобится bean-компонент для замены от yaml, например:

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    yaml.setResources(new ClassPathResource(CONF_FILE));
    propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
    return propertySourcesPlaceholderConfigurer;
}

И затем вы можете аннотировать любую вашу стандартную службу как:

    @Service
@EnableConfigurationProperties
@ConfigurationProperties(prefix="service-config-map")
public class ConfigMapConfigService {
...
...