背景
应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常复杂。k8s从1.2版本开始提供了一种统一的应用配置管理方案--ConfigMap
简介
ConfigMap是一种API对象,用来将非机密性的数据保存到键值对中。ConfigMap将环境配置信息和容器镜像解耦,便于应用配置的修改。
ConfigMap供容器使用的典型用法如下:
- 生成容器内的环境变量
- 设置容器启动命令的启动参数(需设置为环境变量)
- 以Volume的形式挂载为容器内部的文件或目录
注:
ConfigMap 并不提供保密或者加密功能。 如果想存储的数据是机密的,应使用Secret,或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap
创建ConfigMap资源对象
- 例子test-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 类属性键;每一个键都映射到一个简单的值
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# 类文件键
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
- 创建
kubectl apply -f test-configmap.yaml
在pod中使用ConfigMap
- Pod示例configmap-demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
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 的一组键,将被创建为文件
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
- 创建
kubectl apply -f configmap-demo-pod.yaml
- 查看详情
kubectl describe pod configmap-demo-pod
- 查看环境变量
kubectl exec -it configmap-demo-pod -- /bin/sh
ConfigMap的限制条件
- ConfigMap必须在Pod之前创建,Pod才能引用它
- 如果Pod使用envFrom基于ConfigMap定义环境变量,则无效的环境变量名称(例如名称以数字开头)将被忽略,并在事件中被记录为InvalidVariableNames
- ConfigMap受命名空间限制,只有处于相同命名空间的Pod才可以引用它
- ConfigMap无法用于静态Pod