从configMap和secret中连接值

3

我有一个configMap文件:

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    owner: testdb
  name: testdb-configmap 
data:
  host: postgres
  port: "5432" 

还有一个秘密文件:

aapiVersion: v1
kind: Secret
type: Opaque
metadata:
  labels:
    owner: testdb
  name: testdb-secret
  namespace: test
data:
  user: dGVzdA==
  pwd: dGVzdA==

我想要建立一个环境变量CONNECTION_STRING,如下所示:

env:
 - name: CONNECTION_STRING
   value: "Host=<host-from-configmap>;Username=<user-from-secret>;Password=<password-from-secret>;Port=<port-from-configmap>;Pooling=False;"

我想知道这是否可能,如果是,那么如何实现?我也尝试使用.tpl(命名模板),但无法找到方法。


注意

由于我无法访问需要CONNECTION_STRING的图像,因此我必须以这种方式构建它。这些configmap和secret文件也将保持不变。


2个回答

11

Kubernetes可以根据其他环境变量设置环境变量。这是Kubernetes Pod的核心功能,不依赖于Helm的任何内容。

您的值使用了四个组件,其中两个来自ConfigMap,另外两个来自Secret。您需要将每个组件声明为单独的环境变量,然后声明一个主要的环境变量将它们连接在一起。

env:
  - name: TESTDB_HOST
    valueFrom:
      configMapKeyRef:
        name: testdb-configmap # {{ include "chart.name" . }}
        key: host
  - name: TESTDB_PORT
    valueFrom:
      configMapKeyRef:
        name: testdb-configmap
        key: port
  - name: TESTDB_USER
    valueFrom:
      secretKeyRef:
        name: testdb-secret
        key: user
  - name: TESTDB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: testdb-secret
        key: password
  - name: CONNECTION_STRING
    value: Host=$(TESTDB_HOST);Username=$(TESTDB_USER);Password=$(TESTDB_PASSWORD);PORT=$(TESTDB_PORT);Pooling=False;

谢谢。它起作用了。 - Alpesh
对于在我之后来到这里的其他人,实际上yaml中应该使用configMapKeyRef而不是configMapRef。 - wackazong
已修复。 (随意使用[编辑]链接进行此类技术更正。) - David Maze

1
我不相信你要做的事情是可能的。此外,不要使用配置映射来存储这种信息。最佳实践是使用 secrets,然后将它们作为文件或 ENV 变量挂载到容器中。我建议放弃你现在的想法,重新评估你的目标。

正如您所看到的,我没有将configmap用于任何敏感信息,我有一个秘密文件来处理这些信息。我可以将单个值挂载到ENV变量中,但需要将它们连接成一个值。 - Alpesh
你是正确的。我误读了configmap和secrets。 - Derek Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接