Мы используем 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
Приспособьтесь к вашим потребностям и дайте мне знать, помогло ли это.