ConfigMap
ConfigMap概述
供容器使用的典型用法
- 生成容器内的环境变量。
- 设置容器启动命令的启动参数(需设置为环境变量)。
- 以Volume的形式挂载为容器内部的文件或目录。
使用ConfigMap的限制条件
使用ConfigMap的限制条件
- ConfigMap必须在Pod之前创建,Pod才能引用它
- 如果Pod使用envFrom基于ConfigMap定义环境变量,则无效的环境变量名称(例如名称以数字开头)将被忽略,并在事件中被记录为InvalidVariableNames
- ConfigMap受命名空间限制,只有处于相同命名空间中的Pod才可以引用它
- ConfigMap无法用于静态Pod
创建ConfigMap资源对象
通过YAML文件方式创建
将几个应用所需的变量定义为ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appvars
data:
apploglevel: info
appdatadir: /var/data
# 运行kubectl create命令创建该ConfigMap
# kubectl create -f cm-appvars.yaml
# 查看创建好的 ConfigMap
# kubectl get configmap
# kubectl describe configmap cm-appvars
# kubectl get configmap cm-appvars -o yaml
将 两 个 配 置 文 件 server.xml 和logging.properties定义为ConfigMap的用法,设置key为配置文件的别名,value则是配置文件的全部文本内容
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appconfigfiles
data:
key-serverxml: |
<html>
<head>
<meta charset="utf-8">
<title>是一个html文件</title>
</head>
<body>
<h1>是一个html文件</h1>
<p>是一个html文件。</p>
</body>
</html>
key-loggingproperties: "key-loggingproperties 是一个文本文件"
# 运行kubectl create命令创建该ConfigMap
# kubectl create -f cm-appconfigfiles.yaml
# 查看创建好的ConfigMap
# kubectl get configmap cm-appconfigfiles
# kubectl describe configmap cm-appconfigfiles
# 查看已创建的ConfigMap的详细内容
# kubectl get configmap cm-appconfigfiles -o yaml
通过kubectl命令行方式创建
-
通过–from-file参数从文件中进行创建,可以指定key的名称,也可以在一个命令行中创建包含多个key的ConfigMap
kubectl create configmap NAME --from-file=[key]source --from-file=[key]source -
通过–from-file参数在目录下进行创建,该目录下的每个配置文件名都被设置为key,文件的内容被设置为value,
kubectl create configmap NAME --from-file=config-files-dir -
使用–from-literal时会从文本中进行创建,直接将指定的key#=value#创建为ConfigMap的内容
kubectl create configmap NAME --files-literal=key1=value1 --files-literal=key2=value2
kubectl命令行方式创建示例
-
创建一个包含 server.xml 文件内容的 ConfigMap,ConfigMap 名称为 cm-server.xml
kubectl create configmap cm-server.xml --from-file=server.xml
kubectl describe configmap cm-server.xml -
创建包含多个个文件内容的 ConfigMap ,两个文件所在目录为 configfiles ,configmap 名称为 cm-appconf
kubectl create cofigmap cm-appconf --from-file=configfiles
kubectl describe cofnigmap cm-appconf -
使用 --from-literal 参数进行创建 key-value ,configmap名称为 cm-appenv
kubectl create configmap cm-appenv --from-literal=loglevel=info --from-literal=appdatadir=/var/data
kubectl describe configmap cm-appenv
容器应用对ConfigMap的使用的两种方法
- 通过环境变量获取ConfigMap中的内容
- 通过Volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录
在Pod中使用ConfigMap
通过环境变量方式使用ConfigMap
创建的 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appvars
data:
apploglevel: info
appdatadir: /var/data
# kubectl create -f cm-appvars.yaml
将ConfigMap中的内容以环境变量(APPLOGLEVEL和APPDATADIR)方式设置为容器内部的环境变量,容器的启动命令将显示这两个环境变量的值(“env|grepAPP”)
apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod
spec:
containers:
- name: cm-test
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c", "env | grep APP"]
env:
- name: APPLOGLEVEL # 定义环境变量的名称
valueFrom: # key"applogleve1”对应的值
configMapKeyRef:
name: cm-appvars #环境变量的值取自 cm-appvars:
key: apploglevel #key为apploglevel
- name: APPDATADIR #定义环境变量的名称
valueFrom: # key “appdatadir”对应的值
configMapKeyRef:
name: cm-appvars #环境变量的值取自 cm-appvars
key: appdatadir # key为appdatadir
restartPolicy: Never
# 创建
# kubectl create -f cm-test-pod.yaml
# 查看pod
# kubectl get pods
# kubectl logs cm-test-pod
# 输出
# APPDATADIR=/var/data
# APPLOGLEVEL=info
字段envFrom,实现了在Pod环境中将ConfigMap(也可用于Secret资源对象)中所有定义的key=value自动生成为环境变量
apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod
spec:
containers:
- name: cm-test
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: cm-appvars #根据cm-appvars中的key=value自动生成环境变量
restartPolicy: Never
# 创建
# kubectl create -f cm-test.yaml
# 查看日志输出
# kubectl logs cm-test-pod
通过volumeMount使用ConfigMap
cm-appconfigfiles.yaml例子中包含两个配置文件的定义:server.xml和logging.properties
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appconfigfiles
data:
key-serverxml: |
<html>
<head>
<meta charset="utf-8">
<title>是一个html文件</title>
</head>
<body>
<h1>是一个html文件</h1>
<p>是一个html文件。</p>
</body>
</html>
key-loggingproperties: "key-loggingproperties 是一个文本文件"
# 运行kubectl create命令创建该ConfigMap
# kubectl create -f cm-appconfigfiles.yaml
# 查看创建好的ConfigMap
# kubectl get configmap cm-appconfigfiles
# kubectl describe configmap cm-appconfigfiles
# 查看已创建的ConfigMap的详细内容
# kubectl get configmap cm-appconfigfiles -o yaml
将ConfigMap“cm-appconfigfiles”中的内容以文件的形式挂载到容器内部的/configfiles目录下
apiVersion: v1
kind: Pod
metadata:
name: cm-test-app
spec:
containers:
- name: cm-test-app
#image: kubeguide/tomcat-app:v1
image: busybox:latest
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
#ports:
#- containerPort: 8080
volumeMounts:
- name: serverxml #引用Volume 的名称
mountPath: /configfiles #挂载到容器内的目录
volumes:
- name : serverxml #定义volume的名称
configMap:
name: cm-appconfigfiles #使用ConfigMap " cm-appconfigfiles”
items:
- key: key-serverxml # key=key-serverxml
path: server.xml # value将server. xm1 文件名进行挂载
- key : key-loggingproperties # key=key-loggingproperties
path: logging.properties # value将logging.properties 文件名进行挂载
# 创建
# kubectl create -f cm-test-app.yaml
# 查看挂载
# kubectl exec -it cm-test-app -- cat /configfiles/server.xml
# kubectl exec -it cm-test-app -- cat /configfiles/logging.properties
在引用ConfigMap时不指定items,则使用volumeMount方式在容器内的目录下为每个item都生成一个文件名为key的文件
apiVersion: v1
kind: Pod
metadata:
name: cm-test-app
spec:
containers:
- name: cm-test-app
#image: kubeguide/tomcat-app:v1
image: busybox:latest
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
#ports:
#- containerPort: 8080
volumeMounts:
- name: serverxml #引用Volume 的名称
mountPath: /configfiles #挂载到容器内的目录
volumes:
- name : serverxml #定义volume的名称
configMap:
name: cm-appconfigfiles #使用ConfigMap " cm-appconfigfiles”
# 创建
# kubectl create -f cm-test-app.yaml
# 查看挂载
# kubectl exec -it cm-test-app -- ls /configfiles/
# kubectl exec -it cm-test-app -- cat /configfiles/key-serverxml
# kubectl exec -it cm-test-app -- cat /configfiles/key-loggingproperties