Назад | Перейти на главную страницу

В конфигурации Helm Kubernetes, как я могу поделиться множеством переменных среды между несколькими файлами развертывания

Мы используем Helm для развертывания нашего приложения на K8s. В 4 разных файлах развертывания (по одному для каждой службы) и файле задания для миграции у нас должен быть идентичный набор env переменные. Когда нам нужно добавить новый, нам нужно добавить его ко всем 5 файлам. Есть ли способ поделиться ими, чтобы новые переменные окружения нужно было добавить только один раз, и все 5 файлов заберут их (а также не могут быть рассинхронизированы)?

Вот пример файла развертывания (с удаленными потенциально конфиденциальными значениями).

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "helm-chart.fullname" . }}-celery
  labels:
    app.kubernetes.io/name: {{ include "helm-chart.name" . }}-celery
    helm.sh/chart: {{ include "helm-chart.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}-celery
    app.kubernetes.io/managed-by: {{ .Release.Service }}
    app.kubernetes.io/component: worker-celery
spec:
  replicas: {{ .Values.replicaCountCelery }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "helm-chart.fullname" . }}-celery
      app.kubernetes.io/instance: {{ .Release.Name }}-celery
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "helm-chart.fullname" . }}-celery
        app.kubernetes.io/instance: {{ .Release.Name }}-celery
    spec:
      imagePullSecrets:
        - name: {{ .Values.imagePullSecretsName }}
      containers:
        - name: {{ .Chart.Name }}-celery
          image: "{{ .Values.appImage.repository }}:{{ .Values.imageTag }}"
          imagePullPolicy: {{ .Values.appImage.pullPolicy }}
          command: ["celery"]
          args: [REDACTED]
          env:
            - name: DJANGO_DEBUG
              value: "{{ .Values.djangoDebug }}"
            - name: DATABASE_NAME
              value: "{{ .Values.databaseName }}"
            - name: DATABASE_USER
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: DATABASE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: DATABASE_HOST
              value: "myapp-haproxy.{{ .Release.Namespace }}.svc.cluster.local"
            - name: MEMCACHED_HOST
              value: "myapp-memcached.{{ .Release.Namespace }}.svc.cluster.local"
            - name: SENDGRID_USER
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: SENDGRID_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: STRIPE_LIVE_PUBLIC_KEY
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: STRIPE_LIVE_SECRET_KEY
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: OBJECT_STORE_ENDPOINT_URL
              value: [REDACTED]
            - name: OBJECT_STORE_REGION_NAME
              value: [REDACTED]
            - name: OBJECT_STORE_KEY_ID
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: OBJECT_STORE_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: OBJECT_STORE_CDN_URL
              value: [REDACTED]
            - name: QUICKBOOKS_CLIENT_ID
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: QUICKBOOKS_CLIENT_SECRET
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: QUICKBOOKS_ENVIRONMENT
              value: production
            - name: XERO_CONSUMER_KEY
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: XERO_CONSUMER_SECRET
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: SAGE_CLIENT_ID
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: SAGE_CLIENT_SECRET
              valueFrom:
                secretKeyRef:
                  name: [REDACTED]
                  key: [REDACTED]
            - name: ACCOUNTANCY_REDIRECT_URI_PREFIX
              value: [REDACTED]
          resources:
            {{- toYaml .Values.celeryResources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}

Я не уверен, что это добавит каких-либо сложностей, но вы можете видеть, что некоторые из них используют переменные из values.yaml (Такие как {{ .Values.djangoDebug }}), некоторые имеют в виду секреты Kubernetes, а некоторые используют {{ .Release.Namespace }} переменная.

Кроме того, требуемый отступ для 4 deployment файлы, но разные для job файл.

Я пытаюсь поделиться кучей env values, но также можно при желании добавить некоторые дополнения к некоторым файлам.

Надеюсь это имеет смысл? И заранее спасибо за вашу помощь.

Если я вас правильно понимаю, вам нужен ConfigMap.

Многие приложения требуют настройки с помощью некоторой комбинации файлов конфигурации, аргументов командной строки и переменных среды. Эти артефакты конфигурации должны быть отделены от содержимого изображения, чтобы сохранять переносимость контейнерных приложений. Ресурс API ConfigMap предоставляет механизмы для внедрения контейнеров с данными конфигурации, сохраняя при этом независимость контейнеров от Kubernetes. ConfigMap можно использовать для хранения детальной информации, такой как отдельные свойства, или крупнозернистой информации, такой как целые файлы конфигурации или большие двоичные объекты JSON.

В основном вы создаете ConfigMap и настройте правильный key:value. После этого вы используете созданный ConfigMap объявить его ценности окружающей средой в вашем Deployments.

Здесь вы можете найти официальный пример:


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

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

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

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config
  restartPolicy: Never

Теперь вывод Pod включает переменные среды SPECIAL_LEVEL=very и SPECIAL_TYPE=charm


Приспособьтесь к вашим потребностям и дайте мне знать, помогло ли это.