kubernetes ConfigMap 使用说明

环境信息

  • Kubernetes 1.24

ConfigMap 是 Kubernetes 用来向应用 Pod 中注入配置数据的方法。[1]

使用 ConfigMap 数据定义容器环境变量

使用单个 ConfigMap 中的数据定义容器环境变量

  1. ConfigMap 中将环境变量定义为键值对:
    kubectl create configmap special-config --from-literal=special.how=very
  2. 将 ConfigMap 中定义的 special.how 赋值给 Pod 规约中的 SPECIAL_LEVEL_KEY 环境变量。
    apiVersion: v1

    kind: Pod

    metadata:

    name: dapi-test-pod

    spec:

    containers:

    - name: test-container

    image: registry.k8s.io/busybox

    command: [ "/bin/sh", "-c", "env" ]

    env:

    # 定义环境变量

    - name: SPECIAL_LEVEL_KEY

    valueFrom:

    configMapKeyRef:

    # ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值

    name: special-config

    # 指定与取值相关的键名

    key: special.how

    restartPolicy: Never
    现在,Pod 的输出包含环境变量 SPECIAL_LEVEL_KEY=very

使用来自多个 ConfigMap 的数据定义容器环境变量

创建 ConfigMap [2]

apiVersion: v1

kind: ConfigMap

metadata:

name: special-config

namespace: default

data:

special.how: very

---

apiVersion: v1

kind: ConfigMap

metadata:

name: env-config

namespace: default

data:

log_level: INFO

在 Pod 规约中定义环境变量。

apiVersion: v1

kind: Pod

metadata:

name: dapi-test-pod

spec:

containers:

- name: test-container

image: registry.k8s.io/busybox

command: [ "/bin/sh", "-c", "env" ]

env:

- name: SPECIAL_LEVEL_KEY

valueFrom:

configMapKeyRef:

name: special-config

key: special.how

- name: LOG_LEVEL

valueFrom:

configMapKeyRef:

name: env-config

key: log_level

restartPolicy: Never

将 ConfigMap 中的所有键值对配置为容器环境变量

创建一个包含多个键值对的 ConfigMap。

apiVersion: v1

kind: ConfigMap

metadata:

name: special-config

namespace: default

data:

SPECIAL_LEVEL: very

SPECIAL_TYPE: charm

使用 envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称。

apiVersion: v1

kind: Pod

metadata:

name: dapi-test-pod

spec:

containers:

- name: test-container

image: registry.k8s.io/busybox

command: [ "/bin/sh", "-c", "env" ]

envFrom:

- configMapRef:

name: special-config

restartPolicy: Never

将 ConfigMap 内容挂载到容器中的文件

下面是一个将 ConfigMap 以卷的形式进行挂载的 Pod 示例: [3]

apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
configMap:
name: myconfigmap

挂载之后,configMap 中的每个键会变成 spec.containers[].volumeMounts[].mountPath 下面的一个文件名。

configMap 暴露为卷可以达到配置热更新的效果,当 configMap 更新后,卷中引用它的所有文件也会相应更新,进程发现文件被改变后进行重载(需要进程有此功能),无需重新创建 Pod 或者重启容器。

脚注