2.5. 创建和使用配置映射
以下部分定义配置映射以及如何创建和使用它们。
2.5.1. 了解配置映射
许多应用程序需要使用配置文件、命令行参数和环境变量的某些组合来进行配置。在 Red Hat OpenShift Service on AWS 中,这些配置工件与镜像内容分离,以便使容器化应用程序可以移植。
ConfigMap
对象提供将容器注入配置数据的机制,同时保持容器与 Red Hat OpenShift Service on AWS 无关。配置映射可用于存储细粒度信息(如个别属性)或粗粒度信息(如完整配置文件或 JSON blob)。
ConfigMap
对象包含配置数据的键值对,这些数据可在 Pod 中消耗或用于存储控制器等系统组件的配置数据。例如:
ConfigMap
对象定义
kind: ConfigMap apiVersion: v1 metadata: creationTimestamp: 2016-02-18T19:14:38Z name: example-config namespace: my-namespace data: 1 example.property.1: hello example.property.2: world example.property.file: |- property.1=value-1 property.2=value-2 property.3=value-3 binaryData: bar: L3Jvb3QvMTAw 2
从二进制文件(如镜像)创建配置映射时,您可以使用 binaryData
字段。
可以在 Pod 中以各种方式消耗配置数据。配置映射可用于:
- 在容器中填充环境变量值
- 设置容器中的命令行参数
- 填充卷中的配置文件
用户和系统组件可以在配置映射中存储配置数据。
配置映射与 secret 类似,但设计为能更加便捷地支持与不含敏感信息的字符串配合。
配置映射限制
在 pod 中可以消耗它的内容前,必须创建配置映射。
可以编写控制器来容许缺少的配置数据。根据具体情况使用配置映射来参考各个组件。
ConfigMap
对象驻留在一个项目中。
它们只能被同一项目中的 pod 引用。
Kubelet 只支持为它从 API 服务器获取的 pod 使用配置映射。
这包括使用 CLI 创建或间接从复制控制器创建的 pod。它不包括使用 Red Hat OpenShift Service on AWS 节点的 --manifest-url 标志、its-
config
标志或其 REST API 创建的 pod,因为这些不是创建 pod 的通用方法。
2.5.2. 在 Red Hat OpenShift Service on AWS Web 控制台中创建配置映射
您可以在 Red Hat OpenShift Service on AWS Web 控制台中创建配置映射。
流程
以集群管理员身份创建配置映射:
-
在 Administrator 视角中,选择
Workloads
Config Maps
。 - 在该页面右上方选择 Create Config Map。
- 输入配置映射的内容。
- 选择 Create。
-
在 Administrator 视角中,选择
以开发者身份创建配置映射:
-
在 Developer 视角中,选择
Config Maps
。 - 在该页面右上方选择 Create Config Map。
- 输入配置映射的内容。
- 选择 Create。
-
在 Developer 视角中,选择
2.5.3. 使用 CLI 创建配置映射
您可以使用以下命令从目录、特定文件或文字值创建配置映射。
流程
创建配置映射:
$ oc create configmap <configmap_name> [options]
2.5.3.1. 从目录创建配置映射
您可以使用 --from-file
标志从目录创建配置映射。这个方法允许您使用目录中的多个文件来创建配置映射。
目录中的每个文件用于在配置映射中填充键,其中键的名称是文件名,键的值是文件的内容。
例如,以下命令会创建一个带有 example-files
目录内容的配置映射:
$ oc create configmap game-config --from-file=example-files/
查看配置映射中的密钥:
$ oc describe configmaps game-config
输出示例
Name: game-config Namespace: default Labels: <none> Annotations: <none> Data game.properties: 158 bytes ui.properties: 83 bytes
您可以看到,映射中的两个键都是从命令中指定的目录中的文件名创建的。这些密钥的内容可能非常大,因此 oc describe
的输出只显示键的名称及其大小。
前提条件
您必须有一个目录,其中包含您要使用填充配置映射的数据的文件。
以下流程使用这些示例文件:
game.properties
和ui.properties
:$ cat example-files/game.properties
输出示例
enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30
$ cat example-files/ui.properties
输出示例
color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice
流程
输入以下命令,创建包含此目录中每个文件内容的配置映射:
$ oc create configmap game-config \ --from-file=example-files/
验证
使用带有
-o
选项的oc get
命令以查看键的值:$ oc get configmaps game-config -o yaml
输出示例
apiVersion: v1 data: game.properties: |- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: | color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:34:05Z name: game-config namespace: default resourceVersion: "407" selflink: /api/v1/namespaces/default/configmaps/game-config uid: 30944725-d66e-11e5-8cd0-68f728db1985
2.5.3.2. 从文件创建配置映射
您可以使用 --from-file
标志从文件创建配置映射。您可以多次将 --from-file
选项传递给 CLI。
您还可以通过将 key=value
表达式传递给 --from-file
选项,在配置映射中为从文件中导入的内容指定要设置的键。例如:
$ oc create configmap game-config-3 --from-file=game-special-key=example-files/game.properties
如果从文件创建一个配置映射,您可以在不会破坏非 UTF8 数据的项中包含非 UTF8 的数据。Red Hat OpenShift Service on AWS 会检测二进制文件,并透明地将文件编码为 MIME
。在服务器上,MIME
有效负载被解码并存储而不会损坏数据。
前提条件
您必须有一个目录,其中包含您要使用填充配置映射的数据的文件。
以下流程使用这些示例文件:
game.properties
和ui.properties
:$ cat example-files/game.properties
输出示例
enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30
$ cat example-files/ui.properties
输出示例
color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice
流程
通过指定特定文件来创建配置映射:
$ oc create configmap game-config-2 \ --from-file=example-files/game.properties \ --from-file=example-files/ui.properties
通过指定键值对来创建配置映射:
$ oc create configmap game-config-3 \ --from-file=game-special-key=example-files/game.properties
验证
使用
-o
选项为对象输入oc get
命令,以查看文件中的键值:$ oc get configmaps game-config-2 -o yaml
输出示例
apiVersion: v1 data: game.properties: |- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: | color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:52:05Z name: game-config-2 namespace: default resourceVersion: "516" selflink: /api/v1/namespaces/default/configmaps/game-config-2 uid: b4952dc3-d670-11e5-8cd0-68f728db1985
使用
-o
选项为对象输入oc get
命令,以查看键值对中的键值:$ oc get configmaps game-config-3 -o yaml
输出示例
apiVersion: v1 data: game-special-key: |- 1 enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:54:22Z name: game-config-3 namespace: default resourceVersion: "530" selflink: /api/v1/namespaces/default/configmaps/game-config-3 uid: 05f8da22-d671-11e5-8cd0-68f728db1985
- 1
- 这是您在前面的步骤中设置的密钥。
2.5.3.3. 从字面值创建配置映射
您可以为配置映射提供字面值。
--from-literal
选项采用 key=value
语法,它允许直接在命令行中提供字面值。
流程
通过指定字面值来创建配置映射:
$ oc create configmap special-config \ --from-literal=special.how=very \ --from-literal=special.type=charm
验证
使用带有
-o
选项的oc get
命令以查看键的值:$ oc get configmaps special-config -o yaml
输出示例
apiVersion: v1 data: special.how: very special.type: charm kind: ConfigMap metadata: creationTimestamp: 2016-02-18T19:14:38Z name: special-config namespace: default resourceVersion: "651" selflink: /api/v1/namespaces/default/configmaps/special-config uid: dadce046-d673-11e5-8cd0-68f728db1985
2.5.4. 用例: 在 pod 中使用配置映射
以下小节描述了在 pod 中消耗 ConfigMap
对象时的一些用例。
2.5.4.1. 使用配置映射在容器中填充环境变量
您可以使用配置映射在容器中填充各个环境变量,或从构成有效环境变量名称的所有键填充容器中的环境变量。
例如,请考虑以下配置映射:
有两个环境变量的 ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: special-config 1 namespace: default 2 data: special.how: very 3 special.type: charm 4
带有一个环境变量的ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: env-config 1 namespace: default data: log_level: INFO 2
流程
您可以使用
configMapKeyRef
部分在 pod 中使用此ConfigMap
的键。配置为注入特定环境变量的
Pod
规格示例apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: 1 - name: SPECIAL_LEVEL_KEY 2 valueFrom: configMapKeyRef: name: special-config 3 key: special.how 4 - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config 5 key: special.type 6 optional: true 7 envFrom: 8 - configMapRef: name: env-config 9 securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never
当此 pod 运行时,pod 日志包括以下输出:
SPECIAL_LEVEL_KEY=very log_level=INFO
示例输出中没有列出 SPECIAL_TYPE_KEY=charm
,因为设置了 optional: true
。
2.5.4.2. 使用配置映射为容器命令设置命令行参数
您可以通过 Kubernetes 替换语法 $(VAR_NAME)
,使用配置映射来设置容器中的命令或参数的值。
例如,请考虑以下配置映射:
apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: special.how: very special.type: charm
流程
要将值注入到容器中的一个命令中,使用您要用作环境变量的键。然后,您可以使用
$(VAR_NAME)
语法在容器的命令中引用它们。配置为注入特定环境变量的 pod 规格示例
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] 1 env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never
- 1
- 使用您要用作环境变量的键将值注入到容器中的命令中。
当此 pod 运行时,test-container 容器中运行的 echo 命令的输出如下:
very charm
2.5.4.3. 使用配置映射将内容注入卷
您可以使用配置映射将内容注入卷。
ConfigMap
自定义资源(CR)示例
apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: special.how: very special.type: charm
流程
您可以使用配置映射将内容注入卷中有两个不同的选项。
使用配置映射将内容注入卷的最基本方法是在卷中填充键为文件名称的文件,文件的内容是键值:
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "cat", "/etc/config/special.how" ] volumeMounts: - name: config-volume mountPath: /etc/config securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] volumes: - name: config-volume configMap: name: special-config 1 restartPolicy: Never
- 1
- 包含密钥的文件。
当这个 pod 运行时,cat 命令的输出将是:
very
您还可以控制投射配置映射键的卷中的路径:
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "cat", "/etc/config/path/to/special-key" ] volumeMounts: - name: config-volume mountPath: /etc/config securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] volumes: - name: config-volume configMap: name: special-config items: - key: special.how path: path/to/special-key 1 restartPolicy: Never
- 1
- 配置映射键的路径。
当这个 pod 运行时,cat 命令的输出将是:
very