首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Kubernetes secrets作为配置映射中的环境变量

使用Kubernetes secrets作为配置映射中的环境变量
EN

Stack Overflow用户
提问于 2019-11-28 14:04:19
回答 2查看 3.1K关注 0票数 1

我在容器中有一个应用程序,它从configMap中读取特定数据,如下所示

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  application.yaml: |
        server:
          port: 8080
          host: 0.0.0.0

        ##
        ## UCP configuration.
        ## If skipped, it will default to looking inside of the connections.xml file.
        database:
            ApplicationDB:
                username: username
                password: hello123

现在,我为密码创建了一个秘密,并在启动容器时挂载为env变量。

代码语言:javascript
复制
apiVersion: v1
kind: Secret
metadata:
  name: appdbpassword
type: Opaque
stringData:
  password: hello123

我的pod看起来像:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: {{ .Values.pod.name }}
spec:
  containers:
    - name: {{ .Values.container.name }}
      image: {{ .Values.image }}
      command: [ "/bin/sh", "-c", "--" ]
      args: [ "while true; do sleep 30; done;"]
      env:
      - name: password
        valueFrom:
          secretKeyRef:
            name: appdbpassword
            key: password
      volumeMounts:
      - name: config-volume
        mountPath: /app/app-config/application.yaml
        subPath: application.yaml
  volumes:
    - name: config-volume
      configMap:
        name: app-config

我尝试在configMap中使用这个环境变量:

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  application.yaml: |
        server:
          port: 8080
          host: 0.0.0.0

        ##
        ## UCP configuration.
        ## If skipped, it will default to looking inside of the connections.xml file.
        database:
            ApplicationDB:
                username: username
                **password: ${password}**

但我的应用程序无法读取此密码。我是不是漏掉了什么?

编辑:

当我的服务器在源路径中查找application.yaml时,我不能将application.yaml更改为任何其他形式。我们有没有办法在values.yaml(helm)文件中使用该环境变量,并在配置映射中使用它?

EN

回答 2

Stack Overflow用户

发布于 2019-11-28 16:13:10

您的${password}变量不会替换为其值,因为application.yaml是静态文件。如果您在某些配置中使用此yaml文件,则它可能会被它的值替换。

考虑这样一种场景,传递这个文件而不是application.yaml

代码语言:javascript
复制
application.sh: |
       echo "${password}"

现在进入/app/app-config,您将看到application.sh文件。现在执行sh application.sh,您将看到环境变量的值。

我希望这能澄清你的观点。

票数 1
EN

Stack Overflow用户

发布于 2019-11-28 19:55:46

您不能在ConfigMap中使用密码,因为它们是针对非敏感数据(See here)的。

此外,您不应该使用env's传递Secrets,因为它会产生潜在的风险(请阅读更多here为什么不应该使用env )。应用程序通常在错误报告中转储env变量,甚至在启动时将其写入应用程序日志,这可能会导致Secrets暴露。

最好的方法是将Secret挂载为文件。下面是一个简单的示例,如何将其挂载为文件:

代码语言:javascript
复制
spec:
  template:
    spec:
      containers:
      - image: "my-image:latest"
        name: my-app
        ...
        volumeMounts:
          - mountPath: "/var/my-app"
            name: ssh-key
            readOnly: true
      volumes:
        - name: ssh-key
          secret:
            secretName: ssh-key

Kubernetes documentation很好地解释了如何使用和挂载秘密。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59082646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档