Подключение к внешней базе данных из приложения, развернутого в Kubernetes

#spring-boot #kubernetes #environment-variables #minikube

#весенняя загрузка #kubernetes #среда-переменные #мини-куб

Вопрос:

Я развертываю приложение Spring Boot в minikube, которое подключается к базе данных, запущенной на хосте. Следуя рекомендациям 12 factor app, я использую переменные среды для необходимой конфигурации:

 SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver
SPRING_DATASOURCE_PASSWORD=...
SPRING_DATASOURCE_URL=jdbc:postgresql://<HOST_IP_FROM_K8S>:5432/myservice
SPRING_DATASOURCE_USERNAME=...
 

Документы kubernetes показывают только, как устанавливать переменные среды в службе и развертывании .файлы yaml, которые я не хочу делать. Есть ли способ передать переменные среды в командной строке для minikube или kubectl при создании развертывания? (В Docker я делаю это с помощью -e .)

Обратите внимание, что переменные среды должны быть установлены перед запуском приложения, иначе оно выйдет из строя.

Комментарии:

1. Для ввода переменных в модуль лучше использовать ConfigMaps. Мы можем передавать переменные env с помощью kubectl , но могу ли я узнать, как вы пытаетесь запустить приложение? это как модуль или вы ожидаете комбинацию Yaml и ваших переменных env?

2. Я начинаю с kubectl create -f deployment.yaml . Я ожидал бы установить переменные env в этой командной строке, потому что они должны быть доступны приложению при его запуске.

Ответ №1:

Следуя комментарию Ansil выше, я использовал configmap и secret для передачи конфигурации следующим образом:

 kubectl create secret generic springdatasourcepassword --from-literal=SPRING_DATASOURCE_PASSWORD=postgres
kubectl create secret generic springdatasourceusername --from-literal=SPRING_DATASOURCE_USERNAME=postgres
kubectl create configmap springdatasourcedriverclassname --from-literal=SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver
kubectl create configmap springdatasourceurl --from-literal=SPRING_DATASOURCE_URL=jdbc:postgresql://172.18.0.1:5432/bookservice
 

Ссылки на них содержатся в развертывании.файл yaml, подобный этому:

 env:
- name: GET_HOSTS_FROM
  value: dns
- name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
  valueFrom:
    configMapKeyRef:
      name: springdatasourcedriverclassname
      key: SPRING_DATASOURCE_DRIVER_CLASS_NAME
- name: SPRING_DATASOURCE_URL
  valueFrom:
    configMapKeyRef:
      name: springdatasourceurl
      key: SPRING_DATASOURCE_URL
- name: SPRING_DATASOURCE_PASSWORD
  valueFrom:
    secretKeyRef:
      name: springdatasourcepassword
      key: SPRING_DATASOURCE_PASSWORD
- name: SPRING_DATASOURCE_USERNAME
  valueFrom:
    secretKeyRef:
      name: springdatasourceusername
      key: SPRING_DATASOURCE_USERNAME
 

Полное объяснение можно найти здесь .

Комментарии:

1. если я запускаю приложение spring boot в локальной среде, возможно ли использовать все секреты kubectl? поскольку да, где следует ссылаться на файл secret.yml и deployment.yml? переменные среды, созданные для этих 2 файлов, в моем случае не видны

Ответ №2:

У нас нет прямой опции с create подкомандой kubectl для передачи переменных среды.

Вы можете использовать Helm для настройки развертывания.

(Пример: https://docs.bitnami.com/kubernetes/how-to/deploy-java-application-kubernetes-helm /)

Комментарии:

1. Это передает учетные данные в . файл yaml, который вы не должны делать.