Развертывания K8S с общими переменными среды

У нас есть набор развертываний (наборов модулей), которые все используют один и тот же образ докера. Примеры:

  • веб-интерфейс
  • веб-администратор
  • рабочие узлы веб-задач
  • задачи данных рабочих узлов
  • ...

Все они требуют набора общих переменных среды, например, местоположения узла базы данных, секретных ключей для внешних служб и т. Д. У них также есть набор переменных среды, которые не являются общими.

Есть ли в любом случае, где можно было бы:

  1. Повторно используйте шаблон, в котором определены переменные среды
  2. Загрузите переменные среды из файла и установите их в модулях

Оптимальным решением было бы решение, учитывающее пространство имен, поскольку мы разделяем среду тестирования, этап и продукт с помощью пространств имен kubernetes.

Нечто похожее на докеры env_file было бы неплохо. Но я не могу найти какие-либо примеры или ссылки, связанные с этим. Единственное, что я могу найти, это установить env с помощью секретов, но это не совсем понятно, так как мне все еще нужно написать все переменные среды для каждого развертывания.

2 ответа

Решение

Вы можете создать ConfigMap со всеми общими kye:value пары переменных env.

Затем вы можете повторно использовать конфигурационную карту, чтобы объявить все значения configMap как среда в Deployment,

Вот пример, взятый из официальных документов Кубернеца.

Создайте ConfigMap, содержащий несколько пар ключ-значение.

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm

Используйте envFrom, чтобы определить все данные ConfigMap как переменные среды Pod. Ключ из ConfigMap становится именем переменной среды в модуле Pod.

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config # All the key-value pair will be taken as environment key-value pair
      env:
      - name: uncommon
        value: "uncommon value"
  restartPolicy: Never

Вы можете указать необычные переменные env в env поле.

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

$ kubectl logs -f test-pod 
KUBERNETES_PORT=tcp://10.96.0.1:443
SPECIAL_LEVEL=very
uncommon=uncommon value
SPECIAL_TYPE=charm
...

Здесь видно, что доступны все предоставленные среды.

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

      kubectl create secret generic jwt-secret --from-literal=JWT_KEY=my_awesome_jwt_secret_code
      apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: lord/auth
          resources:
            requests:
              memory: "128Mi"
              cpu: "250m"
            limits:
              memory: "256Mi"
              cpu: "500m"
          env:
            - name: JWT_KEY
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_KEY

      apiVersion: apps/v1
kind: Deployment
metadata:
  name: tickets-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tickets
  template:
    metadata:
      labels:
        app: tickets
    spec:
      containers:
        - name: tickets
          image: lord/tickets
          resources:
            requests:
              memory: "128Mi"
              cpu: "250m"
            limits:
              memory: "256Mi"
              cpu: "500m"
          env:
            - name: JWT_KEY
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_KEY
       process.env.JWT_KEY
Другие вопросы по тегам