2 votes

Dans la configuration Helm Kubernetes, comment puis-je partager de nombreuses variables d'environnement entre plusieurs fichiers de déploiement

Nous utilisons Helm pour déployer notre application sur K8s. Dans 4 fichiers de déploiement différents (un pour chaque service) et un fichier de tâche pour les migrations, nous devons avoir un ensemble identique de variables env. Chaque fois que nous devons en ajouter une nouvelle, nous devons l'ajouter à tous les 5 fichiers. Existe-t-il un moyen de partager celles-ci afin que les nouvelles variables d'environnement n'aient besoin d'être ajoutées qu'une seule fois et que les 5 fichiers les récupèrent (et ne puissent jamais être désynchronisés) ?

Voici un exemple de fichier de déploiement (avec des valeurs potentiellement sensibles masquées).

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 }}

Je ne suis pas sûr si cela complique les choses, mais vous pouvez voir que certaines utilisent des variables du fichier values.yaml (comme {{ .Values.djangoDebug }}), certaines font référence à des secrets Kubernetes et d'autres utilisent la variable {{ .Release.Namespace }}.

De plus, l'indentation requise est la même pour les 4 fichiers de déploiement mais différente pour le fichier tâche.

J'essaie de partager un ensemble de valeurs env mais aussi de pouvoir éventuellement en ajouter quelques-unes en plus à certains fichiers.

J'espère que cela est clair ? Et merci d'avance pour votre aide.

2voto

jonathan Points 346

Si je vous comprends correctement, ce dont vous avez besoin est un ConfigMap.

De nombreuses applications nécessitent une configuration via une combinaison de fichiers de configuration, d'arguments de ligne de commande et de variables d'environnement. Ces artefacts de configuration doivent être découplés du contenu de l'image afin de garder les applications conteneurisées portables. La ressource API ConfigMap offre des mécanismes pour injecter des conteneurs avec des données de configuration tout en gardant les conteneurs agnostiques de Kubernetes. ConfigMap peut être utilisé pour stocker des informations fines comme des propriétés individuelles ou des informations grossières comme des fichiers de configuration entiers ou des blobs JSON.

Essentiellement, vous créez un ConfigMap et configurez une bonne clé:valeur. Ensuite, vous utilisez le ConfigMap créé pour déclarer ses valeurs comme environnement dans vos Déploiements.

Vous pouvez trouver l'exemple officiel ici:


Créez un ConfigMap contenant de multiples paires clé-valeur.

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

Utilisez envFrom pour définir toutes les données du ConfigMap en tant que variables d'environnement du conteneur. La clé du ConfigMap devient le nom de la variable d'environnement dans le Pod.

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

Maintenant, la sortie du Pod inclut les variables d'environnement SPECIAL_LEVEL=very et SPECIAL_TYPE=charm


Adaptez selon vos besoins et veuillez me faire savoir si cela vous a aidé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X