在 Helm Kubernetes 配置中,如何在多个部署文件之间共享多个环境变量

在 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 个文件所需的缩进相同,deploymentjob文件所需的缩进不同。

我正在尝试分享一系列env价值观,但也可以选择向某些文件添加一些额外内容。

希望您说得有道理?提前感谢您的帮助。

答案1

如果我理解正确的话,你需要的是一个ConfigMap

许多应用程序需要通过配置文件、命令行参数和环境变量的某种组合进行配置。这些配置工件应与镜像内容分离,以保持容器化应用程序的可移植性。ConfigMap API 资源提供了向容器注入配置数据的机制,同时使容器与 Kubernetes 无关。ConfigMap 可用于存储细粒度信息(如单个属性)或粗粒度信息(如整个配置文件或 JSON blob)。

基本上你创建一个配置图 并设置适当的key:value。之后,您使用创建的ConfigMap来将其值声明为您的环境中Deployments

您可以在这里找到官方示例


创建一个包含多个键值对的 Co​​nfigMap。

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

用于envFrom将所有ConfigMap’s数据定义为容器环境变量。 中的键ConfigMap将成为 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

现在,Pod 的输出包括环境变量SPECIAL_LEVEL=verySPECIAL_TYPE=charm


根据您的需要进行调整,如果有帮助请告诉我。

相关内容