首页 文章

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

提问于
浏览
9

我在Helm图表的templates目录中有我的deployment.yaml文件,其中包含我将使用Helm运行的容器的几个环境变量 .

现在我希望能够从运行helm的任何机器本地提取环境变量,这样我就可以隐藏秘密 .

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

这是我的deployment.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时,如何从本地环境变量中提取USERNAME和PASSWORD的值?

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

1 回答

  • 17

    您可以 export 变量并在运行 helm install 时使用它 .

    在此之前,您必须修改图表,以便在安装时值为 set .

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


    由于您不想公开数据,因此最好将其保存为kubernetes中的秘密 .

    首先,在 Values 文件中添加这两行,以便可以从外部设置这两个值 .

    username: root
    password: password
    

    现在,在 template 文件夹中添加 secret.yaml 文件 . 并将此代码段复制到该文件中 .

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

    现在调整部署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 ,则可以验证更改,

    $ 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 repo中 .

    关于这一点,在kubernetes/helm repo中也有一些讨论 . 您可以看到this issue以了解使用环境变量的所有其他方法 .

相关问题