Kubernetes: как избежать дублирования env при нескольких развертываниях?

У меня есть 4 развертывания Kubernetes / Helm (веб, электронная почта, работник, синхронизация), которые все должны использовать один и тот же ключ spec.template.spec.containers[].env. Ключи env довольно большие, и я бы не хотел копировать / вставлять их при каждом развертывании, например:

# ...
env:
- name: NODE_ENV
  value: "{{ .Values.node_env }}"
- name: BASEURL
  value: "{{ .Values.base_url }}"
- name: REDIS_HOST
  valueFrom:
    secretKeyRef:
      name: secret-redis
      key: host
- name: KUE_PREFIX
  value: "{{ .Values.kue_prefix }}"
- name: DATABASE_NAME
  value: "{{ .Values.database_name }}"
- name: DATABASE_HOST
  valueFrom:
    secretKeyRef:
      name: secret-postgres
      key: host
- name: DATABASE_USER
  valueFrom:
    secretKeyRef:
      name: secret-postgres
      key: username
- name: DATABASE_PASSWORD
  valueFrom:
    secretKeyRef:
      name: secret-postgres
      key: password
- name: AWS_KEY
  valueFrom:
    secretKeyRef:
      name: secret-bucket
      key: key
- name: AWS_SECRET
  valueFrom:
    secretKeyRef:
      name: secret-bucket
      key: secret
- name: AWS_S3_BUCKET
  valueFrom:
    secretKeyRef:
      name: secret-bucket
      key: bucket
- name: AWS_S3_ENDPOINT
  value: "{{ .Values.s3_endpoint }}"
- name: INSTAGRAM_CLIENT_ID
  valueFrom:
    secretKeyRef:
      name: secret-instagram
      key: clientID
# ...

Можно ли этого добиться с помощью yaml, Helm или Kubernetes?


person Olivier Lalonde    schedule 11.05.2017    source источник


Ответы (2)


Итак, я нашел решение с именованными шаблонами Helm: https://github.com/kubernetes/helm/blob/master/docs/chart_template_guide/named_templates.md

Я создал файл templates/_env.yaml со следующим содержанием:

{{ define "env" }}
            - name: NODE_ENV
              value: "{{ .Values.node_env }}"
            - name: BASEURL
              value: "{{ .Values.base_url }}"
            - name: REDIS_HOST
              valueFrom:
                secretKeyRef:
                  name: secret-redis
                  key: host
            - name: KUE_PREFIX
              value: "{{ .Values.kue_prefix }}"
            - name: DATABASE_NAME
              value: "{{ .Values.database_name }}"
            - name: DATABASE_HOST
              valueFrom:
                secretKeyRef:
                  name: secret-postgres
                  key: host
            - name: DATABASE_USER
              valueFrom:
                secretKeyRef:
                  name: secret-postgres
                  key: username
            - name: DATABASE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: secret-postgres
                  key: password
            - name: AWS_KEY
              valueFrom:
                secretKeyRef:
                  name: secret-bucket
                  key: key
            - name: AWS_SECRET
              valueFrom:
                secretKeyRef:
                  name: secret-bucket
                  key: secret
            - name: AWS_S3_BUCKET
              valueFrom:
                secretKeyRef:
                  name: secret-bucket
                  key: bucket
            - name: AWS_S3_ENDPOINT
              value: "{{ .Values.s3_endpoint }}"
            - name: INSTAGRAM_CLIENT_ID
              valueFrom:
                secretKeyRef:
                  name: secret-instagram
                  key: clientID
{{ end }}

А вот как я использую его в templates/deployment.yaml файлах:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: somedeployment
  # ...
spec:
  template:
    # ...
    metadata:
      name: somedeployment
    spec:
      # ...
      containers:
        - name: container-name
          image: someimage
          # ...
          env:
            {{- template "env" . }}
person Olivier Lalonde    schedule 11.05.2017

Взгляните на ConfigMap. Это позволяет собирать конфигурацию в одном ресурсе и использовать ее в нескольких развертываниях.

Не нужно возиться с какими-либо шаблонами.

person Graham Dumpleton    schedule 11.05.2017
comment
Спасибо, но, похоже, много повторений, если ваше приложение ожидает переменные среды. Вы должны явно указать каждый ключ env в каждом развертывании, как я уже делал с секретами. - person Olivier Lalonde; 16.05.2017
comment
К вашему сведению, возможность отображать все содержимое configmap как переменные среды доступна начиная с kubernetes 1.6: kubernetes.io/docs/tasks/configure-pod-container/ - person BostonHiker; 13.10.2017
comment
Для тех, кто все еще сталкивается с этим - вот конкретный раздел, который можно посмотреть на kubernetes.io/docs/tasks/configure-pod-container/ - person lewnelson; 07.06.2020