Estamos usando o Helm para implantar nosso aplicativo no K8s. Em 4 arquivos de implantação diferentes (um para cada serviço) e um arquivo de trabalho para migrações, temos que ter um conjunto idêntico de env
variáveis. Sempre que precisamos adicionar um novo, precisamos adicioná-lo a todos os 5 arquivos. Existe uma maneira de compartilhar esses novos env vars só precisam ser adicionados uma vez e todos os 5 arquivos os pegarão (e também nunca poderão ficar fora de sincronia)?
Aqui está um exemplo de um arquivo de implantação (com valores potencialmente confidenciais editados).
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 }}
Não tenho certeza se isso adiciona alguma complicação, mas você pode ver que alguns estão usando variáveis de values.yaml
(como {{ .Values.djangoDebug }}
), alguns estão se referindo a segredos do Kubernetes e alguns usam a {{ .Release.Namespace }}
variável.
Além disso, o recuo necessário é o mesmo para os 4 deployment
arquivos, mas diferente para o job
arquivo.
Estou tentando compartilhar env
vários valores, mas também poder adicionar opcionalmente alguns extras a alguns arquivos.
Espero que faça sentido? E desde já agradeço sua ajuda.
Se eu entendi corretamente, o que você precisa é de um arquivo
ConfigMap
.Basicamente você cria um ConfigMap e configura um arquivo
key:value
. Depois disso, você usa o criadoConfigMap
para declarar seus valores como ambiente em seu arquivoDeployments
.Aqui você pode encontrar o exemplo oficial :
Crie um ConfigMap contendo vários pares de valores-chave.
Use
envFrom
para definir todos osConfigMap’s
dados como variáveis de ambiente do contêiner. A chave doConfigMap
se torna o nome da variável de ambiente no pod.Agora, a saída do Pod inclui variáveis de ambiente
SPECIAL_LEVEL=very
eSPECIAL_TYPE=charm
Ajuste às suas necessidades e, por favor, deixe-me saber se isso ajudou.