代码之家  ›  专栏  ›  技术社区  ›  uberrebu

如何使用Helm图表提取环境变量

  •  113
  • uberrebu  · 技术社区  · 6 年前

    我有我的部署。Helm图表的templates目录中的yaml文件,其中包含我将使用Helm运行的容器的多个环境变量。

    现在,我希望能够从运行舵机的任何机器中本地提取环境变量,以便以这种方式隐藏秘密。

    当我使用helm运行应用程序时,如何传入这些信息并让helm在本地获取环境变量?

    这是我部署的一部分。yaml文件

    ...
    ...
        spec:
          restartPolicy: Always
          containers:
            - name: sample-app
              image: "sample-app:latest"
              imagePullPolicy: Always
              env:          
                - name: "USERNAME"
                  value: "app-username"
                - name: "PASSWORD"
                  value: "28sin47dsk9ik"
    ...
    ...
    

    当我运行helm时,如何从本地环境变量中提取用户名和密码的值?

    这可能吗?如果是,那么我该怎么做?

    8 回复  |  直到 6 年前
        1
  •  136
  •   jhanschoo Abdullah Al Maruf - Tuhin    5 年前

    你可以 export 变量,并在运行时使用它 helm install

    在此之前,您必须修改图表,以便可以 set 安装时。

    如果您已经知道如何设置模板字段,请跳过此部分。


    因为您不想公开数据,所以最好在kubernetes中将其保存为机密。

    首先,在 Values 文件,以便可以从外部设置这两个值。

    username: root
    password: password
    

    现在,添加 secret.yaml 在您的 template 文件夹然后,将此代码段复制到该文件中。

    apiVersion: v1
    kind: Secret
    metadata:
      name: {{ .Release.Name }}-auth
    data:
      password: {{ .Values.password | b64enc }}
      username: {{ .Values.username | b64enc }}
    

    现在调整部署yaml模板,并在 env 节,像这样

    ...
    ...
        spec:
          restartPolicy: Always
          containers:
            - name: sample-app
              image: "sample-app:latest"
              imagePullPolicy: Always
              env:          
              - name: "USERNAME"
                valueFrom:
                  secretKeyRef:
                    key:  username
                    name: {{ .Release.Name }}-auth
              - name: "PASSWORD"
                valueFrom:
                  secretKeyRef:
                    key:  password
                    name: {{ .Release.Name }}-auth
    ...
    ...
    

    如果已为正确修改模板 --set 旗帜 您可以使用环境变量设置此值。

    $ export USERNAME=root-user
    

    现在在运行helm install时使用此变量,

    $ helm install --set username=$USERNAME ./mychart
    

    如果你运行这个 舵安装 在里面 dry-run 模式,您可以验证更改,

    $ helm install --dry-run --set username=$USERNAME --debug ./mychart
    [debug] Created tunnel using local port: '44937'
    
    [debug] SERVER: "127.0.0.1:44937"
    
    [debug] Original chart version: ""
    [debug] CHART PATH: /home/maruf/go/src/github.com/the-redback/kubernetes-yaml-drafts/helm-charts/mychart
    
    NAME:   irreverant-meerkat
    REVISION: 1
    RELEASED: Fri Apr 20 03:29:11 2018
    CHART: mychart-0.1.0
    USER-SUPPLIED VALUES:
    username: root-user
    
    COMPUTED VALUES:
    password: password
    username: root-user
    
    HOOKS:
    MANIFEST:
    
    ---
    # Source: mychart/templates/secret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: irreverant-meerkat-auth
    data:
      password: password
      username: root-user
    ---
    # Source: mychart/templates/deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: irreverant-meerkat
      labels:
        app: irreverant-meerkat
    spec:
      replicas: 1
      template:
        metadata:
          name: irreverant-meerkat
          labels:
            app: irreverant-meerkat
        spec:
          containers:
          - name: irreverant-meerkat
            image: alpine
            env:
            - name: "USERNAME"
              valueFrom:
                secretKeyRef:
                  key:  username
                  name: irreverant-meerkat-auth
            - name: "PASSWORD"
              valueFrom:
                secretKeyRef:
                  key:  password
                  name: irreverant-meerkat-auth
    
            imagePullPolicy: IfNotPresent
          restartPolicy: Always
      selector:
        matchLabels:
          app: irreverant-meerkat
    

    您可以看到,机密用户名的数据已更改为 root-user

    我已添加 this example 进入github回购。

    中也有一些讨论 kubernetes/helm 回购协议。你可以看到 this issue 了解使用环境变量的所有其他方法。

        2
  •  28
  •   Oliver    3 年前

    通过如下设置部署yaml,可以从值yaml中传递env键值:

    spec:
      restartPolicy: Always
      containers:
        - name: sample-app
          image: "sample-app:latest"
          imagePullPolicy: Always
          env:          
            {{- range $name, $value := .Values.env }}
            - name: {{ $name }}
              value: {{ $value }}
            {{- end }}
    

    在值中。yaml:

    env:          
     - name: "USERNAME"
       value: ""
     - name: "PASSWORD"
       value: ""
    

    安装图表时,可以传递用户名密码值

    helm install chart_name --name release_name --set env.USERNAME="app-username" --set env.PASSWORD="28sin47dsk9ik"
    
        3
  •  21
  •   diavol    4 年前

    对于那些希望为其env变量文件使用数据结构而不是列表的人来说,这对我很有用:

    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          env:          
          {{- range $key, $val := .Values.env }}
            - name: {{ $key }}
              value: {{ $val | quote }}
          {{- end }}
    
    

    价值观yaml:

    env:          
     FOO: "BAR"
     USERNAME: "CHANGEME"
     PASWORD: "CHANGEME"
    

    这样,我可以通过名称访问helm图表其他部分中的特定值,并通过helm命令行传递敏感值。

        4
  •  13
  •   zimvak    4 年前

    要避免手动设置每个机密,您可以使用:

    export MY_SECRET=123
    envsubst < values.yaml | helm install my-release . --values -
    

    其中${MY\u SECRET}在您的值中引用。yaml文件,如:

    mychart:
      secrets:
        secret_1: ${MY_SECRET}
    
        5
  •  8
  •   Alessandro Dentella    3 年前

    我想问题是如何在图表中查找env变量,方法是查看它自身的env变量,而不是将其与--set一起传递。

    例如:我已经设置了一个键“my\u db\u password”,并且不支持通过查看env变量中的值来更改值。

    我不太确定on-GO模板,但我猜这是禁用的,正如他们在helm文档中解释的那样。“出于安全原因,我们删除了两个:env和expandenv(这将使图表作者能够访问Tiller的环境)。” https://helm.sh/docs/developing_charts/#know-your-template-functions

        6
  •  5
  •   Walid Natat    4 年前

    作为传递局部环境变量的替代方法,我喜欢将这些敏感值存储在VCS忽略的文件夹中,并使用Helm .Files 对象读取它们并向模板提供值。

    在我看来,它的优势在于,它不需要操作掌舵图的主机设置任何特定于操作系统的环境变量,并且使图表自包含,同时不公开这些值。

    # In a folder not committed, e.g. <chart_base_directory>/secrets
    username: app-username
    password: 28sin47dsk9ik
    

    然后在图表模板中:

    # In deployment.yaml file
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: {{ .Release.Name }}-auth
    stringData::
    {{ .Files.Get "<chart_base_directory>/secrets" | indent 2 }}
    

    因此,可以从定义其他所有内容的目录中访问图表所需的所有内容。它不需要设置系统范围的env变量,只需要一个文件。

    此文件可以自动生成,也可以使用伪值从提交的模板复制。如果未定义错误,Helm也会在安装/更新早期触发错误,而不是使用 username="" password="" 如果尚未定义环境变量,那么只有将更改应用到集群后,这一点才会变得明显。

        7
  •  5
  •   Björn Kraus    3 年前

    Helm 3.1支持后期渲染( https://helm.sh/docs/topics/advanced/#post-rendering )它在将清单实际发送到Kubernetes API之前将其传递给脚本。后期呈现允许以多种方式操纵清单(例如使用 kustomize公司 在舵的顶部)。

    替换预定义环境值的最简单形式的APAST渲染器如下所示:

    #!/bin/sh
    envsubst <&0
    

    注意:这将替换 每一个 发生 $<VARNAME> 这可能会与模板中的变量发生冲突,比如liveness探测器中的shell脚本。因此,最好明确定义要替换的变量: envsubst '${USERNAME} ${PASSWORD}' <&0

    在shell中定义环境变量:

    export USERNAME=john PASSWORD=my-secret
    

    在tempaltes(例如。 secret.yaml )使用中定义的值 values.yaml :

    apiVersion: v1
    kind: Secret
    metadata:
        name: {{ .Release.Name }}-auth
    data:
        username: {{ .Values.username }}
        password: {{ .Values.password }}
    

    请注意,在Helm已经处理完所有YAML文件之后,您不能在清单中注入字符串时,在字符串上应用b64enc之类的字符串转换。相反,如果需要,可以在后期渲染器中对其进行编码。

    价值观亚马尔 使用变量占位符:

    ...
    username: ${USERNAME}
    password: ${PASSWORD}
    

    参数 --post-renderer 在多个舵命令中得到支持,例如。

    helm install --dry-run --post-renderer ./my-post-renderer.sh my-chart
    

    通过使用 后期渲染器 变量/占位符自动替换为 envsubst 无需其他脚本。

        8
  •  5
  •   WUJ    3 年前

    我认为一个简单的方法就是 直接设置值 。例如,在您的值中。yml,您要传递服务名称:

    ...
    myapp:
      service:
        name: ""
    ...
    

    您的服务。yml只需像往常一样使用此值:

    {{ .Values.myapp.service.name }}
    

    然后使用 --set ,例如: --set myapp.service.name=hello


    然后,例如,如果要使用环境变量,请在此之前进行导出:

    #set your env variable 
    export MYAPP_SERVICE=hello
    
    #pass it to helm
    helm install myapp --set myapp.service.name=$MYAPP_SERVICE.
    

    如果执行以下调试操作:

    helm install myapp --set myapp.service.name=$MYAPP_SERVICE --debug --dry-run ./myapp
    

    您可以在设置“hello”的yml开头看到此信息。

    USER-SUPPLIED VALUES:
    myapp:
      service:
        name: hello