在k8s中通过导入文件来填充ConfigMap

24

我有一个需求,需要将一堆键值对推送到文本/JSON文件中。在此之后,我想将键值数据导入到configMap中,并使用kubernetes-client API在POD内使用这个configMap。

如何完成这个需求,有什么指针或建议吗?

TIA

3个回答

46

有两种方法可以做到。

将文件直接创建为ConfigMap。

在这种情况下,您将获得一个以文件名作为键,以文件数据作为值的ConfigMap。

例如,您有一个名为your-file.json的文件,其内容为{key1: value1, key2: value2, keyN: valueN}

还有一个名为your-file.txt的文件,其内容为:

key1: value1 key2: value2 keyN: valueN

kubectl create configmap name-of-your-configmap --from-file=your-file.json
kubectl create configmap name-of-your-configmap-2 --from-file=your-file.txt

结果如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: name-of-your-configmap
data:
  your-file.json: |
    {key1: value1, key2: value2, keyN: valueN}

apiVersion: v1
kind: ConfigMap
metadata:
  name: name-of-your-configmap-2
data:
  your-file.txt: |
    key1: value1
    key2: value2
    keyN: valueN

完成后,您可以将任何一个ConfigMap挂载到Pod上,例如让我们挂载your-file.json

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh","-c","cat /etc/config/keys" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: name-of-your-configmap
        items:
        - key: your-file.json
          path: keys
restartPolicy: Never

现在您可以从Pod内获取/etc/config/your-file.json中的任何信息。请记住,这些数据是只读的。

使用环境变量创建ConfigMap

您可以使用特殊语法来定义文件中的key:value对。以下规则适用:

  • 文件中的每行都必须采用VAR=VAL格式。
  • 以#开头(即注释)的行将被忽略。
  • 空白行将被忽略。
  • 没有引号的特殊处理(即它们将成为ConfigMap值的一部分)。

您有一个名为your-env-file.txt的文件,其内容如下:

key1=value1 key2=value2 keyN=valueN

kubectl create configmap name-of-your-configmap-3 --from-env-file=you-env-file.txt

因此:

apiVersion: v1
kind: ConfigMap
metadata:
  name: name-of-your-configmap-3
data:
  key1: value1
  key2: value2
  keyN: valueN

现在您可以将ConfigMap数据用作Pod环境变量:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod-2
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: name-of-your-configmap-3
              key: key1
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: name-of-your-configmap-3
              key: key2
        - name: SOME_VAR
          valueFrom:
            configMapKeyRef:
              name: name-of-your-configmap-3
              key: keyN
  restartPolicy: Never
现在你可以在 Pod 内使用这些变量。
要获取更多信息,请查阅文档

1
关于项目: - 键:your-file.json 路径:keys 文件存储为 keys 而不是 your-file.json。无论如何,谢谢! - RAbraham

5
我可以推荐Kustomize来完成此任务。您可以将其用作部署管道的一部分,以生成K8s配置(不仅限于ConfigMaps,还包括Deployments、NetworkPolicies、Services等)。
在kustomize中,您需要一个ConfigMapGenerator。有不同的选项。在您的情况下,env是合适的。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
configMapGenerator:
# generate a ConfigMap named my-system-env-<some-hash> where each key/value pair in the
# env.txt appears as a data entry (separated by \n).
- name: my-system-env
  env: env.txt

其他选项,如files,将整个文件的内容加载到ConfigMap的单个值中。


2
请注意,在较新的 kustomize 版本中,该键已更改为 envs,并且现在接受列表。 - prentice
感谢您添加这些最新信息,@prentice。 - Peter Wippermann

0

使用以下方法将环境变量或文本文件中的键值对导出为容器环境变量中相同的内容:

  • 使用configmap从configmap创建配置映射
kubectl  create configmap special-config --from-env-file=<key value pairs file>

更新容器规范,以包含这些键值对的Pod所需。
      envFrom:
      - configMapRef:
          name: special-config

例子:

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

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