Kubernetes: 如何从多个文件创建和使用 ConfigMap

10

我有关于配置地图的文档:

https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#define-container-environment-variables-using-configmap-data

据我理解,我可以使用game.properties和ui.properties这两个文件创建一个名为game-config-2的配置映射(config map)。
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/kubectl/game.properties --from-file=configure-pod-container/configmap/kubectl/ui.properties

现在我看到了配置映射。
kubectl describe configmaps game-config-2
Name:           game-config-2
Namespace:      default
Labels:         <none>
Annotations:    <none>

Data
====
game.properties:        158 bytes
ui.properties:          83 bytes

我该如何使用那个配置映射呢?我试过这样:

    envFrom:
    - configMapRef:
        name: game-config-2

但是这并没有起作用,环境变量没有从configmap中获取。或者我可以在envFrom下有两个configMapRef吗?


你期望的环境变量是否以键值对的形式存在于这些文件中?如果是,那么你应该使用 --from-env-file 而不是 --from-file - Emruz Hossain
6个回答

13

是的,一个 pod 或 deployment 可以从一组 configMapRef 条目获取环境变量:

    spec:
      containers:
      - name: encouragement-api
        image: registry-......../....../encouragement.api
        ports:
        - containerPort: 80
        envFrom:
          - configMapRef:
              name: general-config
          - configMapRef:
              name: private-config

最好使用yaml文件为k8s创建配置,以确保法律和秩序:
config_general.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: general-config
data:
  HOSTNAME: Develop_hostname
  COMPUTERNAME: Develop_compname
  ASPNETCORE_ENVIRONMENT: Development

encouragement-api/config_private.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: private-config
data:
  PRIVATE_STUFF: real_private

应用这两个 ConfigMap:

kubectl apply -f config_general.yaml
kubectl apply -f encouragement-api/config_private.yaml

执行 env |grep PRIVATE && env |grep HOSTNAME 命令来进入 pod 并运行。

我有一个名为 config_general.yaml 的文件与开发人员的代码放在同一个仓库中,他们可以自由更改。密码和敏感信息存储在 config_private.yaml 文件中,该文件位于其他地方(一个 S3 加密存储桶),其中的值经过 base64 编码以增加一定的安全性。


2
只是一个小提示 - 对于密码和敏感数据,最好使用 k8s 的 Secret 而不是 ConfigMap。它们是专门为这种情况设计的。 - Ruslan Bes
1
同意vdd + base64编码根本不安全,只是编码而已:任何人都可以使用"在线base64解码"或者像"base64 -d <<< aUFtR3Jvb3QK"这样的命令行来读取它。 - Gremi64
确实,尽管秘密很少有好处,除非它们被加密了。 - Nahshon paz
确实,尽管秘密很少有好处,除非它们被加密了。 - undefined

6

解决此问题的一种方法是创建一个包含多个数据键/值的ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: conf
data:
  game.properties: |
    <paste file content here>
  ui.properties: |
    <paste file content here>

记得在粘贴文件内容之前加上 | 符号。


我已经创建了这个配置映射,但是当我在 pod yaml 中使用它时,它没有获取到环境变量的值。我已经在问题中强调了这一点。 - Vikas Rathore
在 pod.yaml 文件中,您有 envFrom 字段: - configMapRef: name: conf? - Ivan Aracki
你能发布 kubectl describe pod <your_pod_name> 的输出吗? - Ivan Aracki
我们能否引用文件,而不是粘贴文件内容? - SANDEEP MACHIRAJU
也许可以查看这个链接:https://dev59.com/ilUM5IYBdhLWcg3wAsZF - Ivan Aracki

2
如果您使用Helm,那么这将变得更加简单。 创建一个像这样的ConfigMap模板。
kind: ConfigMap
apiVersion: v1
metadata:
  name: {{ .Values.configMapName }}
data:
  {{ .Values.gameProperties.file.name }}: |
  {{ tpl (.Files.Get .Values.gameProperties.file.path) }}
  {{ .Values.uiProperties.file.name }}: |
  {{ tpl (.Files.Get .Values.uiProperties.file.path) }}

还有两个带有键值对的文件,格式如下:game.properties

GAME_NAME: NFS

还有另外一个文件 ui.properties


GAME_UI: NFS UI

并且values.yaml应该像这样

configMapName: game-config-2
gameProperties:
  file:
    name: game.properties
    path: "properties/game.properties"
uiProperties:
  file:
    name: ui.properties
    path: "properties/ui.properties"

您可以通过运行命令helm template .来验证模板是否从values.yaml文件中插值出值,预期输出如下。
kind: ConfigMap
apiVersion: v1
metadata:
  name: game-config-2
data:
  game.properties: |
    GAME_NAME: NFS
  ui.properties: |
    GAME_UI: NFS UI

2

不允许使用多个 --from-env-file 参数。 您可以使用多个 --from-file 参数。

例如:

cat config1.txt 
    var1=val1

cat config2.txt 
    var3=val3
    var4=val4

kubectl create cm details2 --from-env-file=config1.txt --from-env-file=config2.txt -o yaml --dry-run

输出

apiVersion: v1
data:
  var3: val3
  var4: val4
kind: ConfigMap
  name: details2

k create cm details2 --from-file=config1.txt --from-file=config2.txt -o yaml --dry-run 

输出

apiVersion: v1
data:
  config1.txt: |
    var1=val1
  config2.txt: |
    var3=val3
    var4=val4
kind: ConfigMap
  name: details2

0

我不确定您是否可以将配置映射中特定文件中的所有键值对作为环境变量加载到 Pod 中。但是,您可以将特定配置映射中的所有键值对作为环境变量加载到 Pod 中。请参见以下示例:

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

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config
  restartPolicy: Never

验证Pod显示以下环境变量

SPECIAL_LEVEL=very
SPECIAL_TYPE=charm

-2
正如@Emruz_Hossain所提到的那样,如果game.properties和ui.properties只有环境变量,那么这对您可能有效。
kubectl create configmap game-config-2 --from-env-file=configure-pod-container/configmap/kubectl/game.properties --from-env-file=configure-pod-container/configmap/kubectl/ui.properties

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