前言
使用 ConfigMap 来将你的配置数据和应用程序代码分开。比如,假设你正在开发一个应用,它可以在你自己的电脑上(用于开发)和在云上(用于实际流量)运行。你的代码里有一段是用于查看环境变量 DATABASE_HOST
,在本地运行时,你将这个变量设置为 localhost
,在云上,你将其设置为引用 Kubernetes 集群中的公开数据库 Service 中的组件。这让你可以获取在云中运行的容器镜像,并且如果有需要的话,在本地调试完全相同的代码。
ConfigMap 对象
ConfigMap 是一个 API 对象,让你可以存储其他对象所需要使用的配置。和其他 Kubernetes 对象都有一个 spec 不同的是,ConfigMap 使用 data 块来存储元素(键名)和它们的值。ConfigMap 的名字必须是一个合法的 DNS 子域名。
ConfigMaps 和 Pods
你可以写一个引用 ConfigMap 的 Pod 的 spec
,并根据 ConfigMap 中的数据在该 Pod 中配置容器。这个 Pod 和 ConfigMap 必须要在同一个 命名空间 中。这是一个 ConfigMap 的示例,它的一些键只有一个值,其他键的值看起来像是配置的片段格式。
apiVersion: v1 kind: Pod metadata: name: configmap-demo-pod spec: containers: - name: demo image: game.example/demo-game env: # 定义环境变量 - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的 valueFrom: configMapKeyRef: name: game-demo # 这个值来自 ConfigMap key: player_initial_lives # 需要取值的键 - name: UI_PROPERTIES_FILE_NAME valueFrom: configMapKeyRef: name: game-demo key: ui_properties_file_name volumeMounts: - name: config mountPath: "/config" readOnly: true volumes: # 您可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中 - name: config configMap: # 提供你想要挂载的 ConfigMap 的名字 name: game-demo
ConfigMap 不会区分单行属性值和多行类似文件的值,重要的是 Pods 和其他对象如何使用这些值。比如,定义一个卷,并将它作为 /config
文件夹安装到 demo
容器内,并创建四个文件:
/config/player_initial_lives
/config/ui_properties_file_name
/config/game.properties
/config/user-interface.properties
如果你要确保 /config
只包含带有 .properties
扩展名的文件,可以使用两个不同的 ConfigMaps,并在 spec
中同时引用这两个 ConfigMaps 来创建 Pod。第一个 ConfigMap 定义了 player_initial_lives
和 ui_properties_file_name
,第二个 ConfigMap 定义了 kubelet 放进 /config
的文件。
注意:ConfigMap 最常见的用法是为同一命名空间里某 Pod 中运行的容器执行配置。您也可以单独使用 ConfigMap。比如,您可能会遇到基于 ConfigMap 来调整其行为的 插件 或者 operator