赞
踩
注意:ConfigMap并不提供保密或加密功能。如果你想存储的数据是机密性的,请使用Secret,或者使用其他第三方工具来保存你的数据的私密性,而不是用ConfigMap。
DATABASE_HOST
,在本地运行时,你将这个变量设置为localhost
,在云上,你将其设置为引用Kubernetes集群中的公开数据库组件的服务。说明:ConfigMap在设计上不是用来存储大量的数据的。在ConfigMap中保存的数据不可超过1M。如果你需要保存超出尺寸限制的数据,你可能希望考虑挂载存储卷或者使用独立的数据库或文件服务。
ConfigMap是一个让你可以额存储其他对象所需使用的配置的API对象。和其他Kubernetes对象都有一个spec
不同的是,ConfigMap使用data
和binaryData
字段。这些字段能够结构键-值对作为其取值。data
和binaryData
字段都是可选的。data
字段设计用来保存UTF-8字符串,而binartyData
则被设计用来保存二进制数据作为base64编码的字符串。
ConfigMap的名字必须是一个合法的DNS子域名。
data
或binaryData
字段下面的每个键的名称都必须又字母数字字符或者-
、_
或.
组成。在data
下保存的键名不可以与在binaryData
下出现的键名有重叠。
从v1.19开始,你可以添加一个immutable
字段到ConfigMap定义中,创建不可更得ConfigMap。
你可以写一个引用ConfigMap得Pod的spec
,并根据ConfigMap中的数据在该Pod中配置容器。这个Pod和ConfigMap必须要在同一个名称空间中(名称空间是Kubernetes用来支持隔离的单个集群中的资源组的一种抽象)。
说明:静态Pod中的spec字段不能引用ConfigMap或任何其他API对象。
[root@master ~]# vim 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
# 应用ConfigMap资源
[root@master ~]# kubectl apply -f configmap.yaml
# 查看ConfigMap的详细信息 [root@master ~]# kubectl describe configmap game-demo Name: game-demo Namespace: default Labels: <none> Annotations: <none> Data ==== user-interface.properties: ---- color.good=purple color.bad=yellow allow.textmode=true game.properties: ---- enemy.types=aliens,monsters player.maximum-lives=5 player_initial_lives: ---- 3 ui_properties_file_name: ---- user-interface.properties BinaryData ==== Events: <none>
你可以使用四种方式使用ConfigMap配置Pod中的容器:
这些不同的方法适用于不同的数据使用方式。对于前三个方法,kubelet使用ConfigMap中的数据在Pod中启动容器。
第四种方法意味着你必须要编写代码才能读取ConfigMap和它的数据。然而,由于你是直接使用Kubernetes API,因此只要ConfigMap发生更改,你的应用就能够通过订阅来获取更新,并且在这样的情况发生的时候做出反应。通过直接进入kubernetes API,这个技术也可以让你能够获取到不同的名称空间里的ConfigMap。
下面是一个Pod引用ConfigMap的示例,它通过使用game-demo
中的值来配置一个Pod:
[root@master ~]# vim pod-configmap.yaml apiVersion: "v1" kind: Pod metadata: name: configmap-demp-pod spec: containers: - name: demo image: alpine:latest imagePullPolicy: IfNotPresent 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: # 提供你要想挂载的ConfigMap的名字 name: game-demo # 来自ConfigMap的一组键,将被创建为文件挂载到Pod中,并且文件名是path字段指定的 items: - key: "game.properties" path: "game.properties" - key: "user-interface.properties" path: "user-interface.properties" # 备注:volumes中定义的items字段可以更精准的控制configmap中的哪些键值被变换为文件挂载到容器中。如果不指定items那么将把configmap中的所有键都转换为文件挂载到容器中
# 应用资源清单
[root@master ~]# kubectl apply -f pod-configmap.yaml
/config
文件夹挂载到demo
容器内,创建两个文件,/config/game.properties
和/config/user-interface.properties
,尽管ConfigMap中包含了四个键,这是因为Pod定义中在volumes
节指定了一个items
数组。如果你完全忽略items
数组,则ConfigMap中的每个键都会变成一个与该键同名的文件,因此你会得到四个文件。[root@master ~]# kubectl exec -it configmap-demp-pod -- sh
/ # echo $PLAYER_INITIAL_LIVES
3
/ # echo $UI_PROPERTIES_FILE_NAME
user-interface.properties
[root@master ~]# kubectl exec -it configmap-demp-pod -- sh
/ # ls /config/
game.properties user-interface.properties
/ # cat /config/game.properties
enemy.types=aliens,monsters
player.maximum-lives=5
/ # cat /config/user-interface.properties
color.good=purple
color.bad=yellow
allow.textmode=true
spec.volumes[]
下添加一个卷。为该卷设置任意名称,之后将spec.volumes[].configMap.name
字段设置为对你的ConfigMap对象的引用。.spec.containers[].volumeMounts[]
。设置.spec.containers[].volumeMounts[].readOnly=true
并将.spec.containers[].volumeMounts[].mountPath
设置为一个未使用的目录名,ConfigMap的内容将出现在该目录中data
键会变成mountPath
下面的一个文件名。[root@master ~]# vim pod-1.yaml apiVersion: "v1" kind: Pod metadata: name: mypod spec: containers: - name: mypod image: alpine:latest imagePullPolicy: IfNotPresent command: ["sleep","3600"] volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo configMap: # 注意:如果是以这种情况挂载到Pod中,那么将会把这个ConfigMap里面所有的键全部转换为与键名相同名字的文件挂载到Pod中 name: game-demo
# 应用资源清单
[root@master ~]# kubectl apply -f pod-1.yaml
# 验证
# 通过查看我们可以得知,如果再不指定itmes数组的情况下,会把configmap中的所有键转为文件挂载容器中
[root@master ~]# kubectl exec -it mypod -- ls /etc/foo
game.properties ui_properties_file_name
player_initial_lives user-interface.properties
volumeMounts
块,但针对每个ConfigMap,你只需要设置一个spec.volumes
块,一个Pod多个容器类似于下面的示例[root@master ~]# cat pod-1.yaml apiVersion: "v1" kind: Pod metadata: name: mypod spec: containers: - name: mypod1 image: alpine:latest imagePullPolicy: IfNotPresent command: ["sleep","3600"] volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true - name: mypod2 image: alpine:latest imagePullPolicy: IfNotPresent command: ["sleep","3600"] volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo configMap: # 注意:如果是以这种情况挂载到Pod中,那么将会把这个ConfigMap里面所有的键全部转换为与键名相同名字的文件挂载到Pod中 name: game-demo [root@master ~]# kubectl apply -f pod-1.yaml [root@master ~]# kubectl exec -it mypod -c mypod1 -- ls /etc/foo game.properties ui_properties_file_name player_initial_lives user-interface.properties [root@master ~]# kubectl exec -it mypod -c mypod2 -- ls /etc/foo game.properties ui_properties_file_name player_initial_lives user-interface.properties
使用configmap在Pod中设置环境变量
1、对于Pod规约中的每个容器,为要使用的每个ConfigMap键添加一个环境变量到env[].valueFrom.configMapKeyRef
字段
2、修改你的镜像或命令行,以便程序查找指定变量中的值。
下面是一个将ConfigMap定义为Pod的环境变量的示例
[root@master ~]# vim pod-2.yaml apiVersion: "v1" kind: Pod metadata: name: env-configmap spec: containers: - name: envars-test-container image: alpine:latest imagePullPolicy: IfNotPresent command: ["sleep","3600"] env: - name: CONFIGMAP_USERNAME # 新变量的变量名 valueFrom: configMapKeyRef: name: game-demo # 要进行取值的configmap名称 key: game.properties # 要进行取值的键名 # 需要注意的是,Pod中环境变量名称允许的字符范围是有限的。如果某些变量名不满足这些规则,则即使Pod可以被启动,你的容器也无法访问这些环境变量
# 应用资源清单
[root@master ~]# kubectl apply -f pod-2.yaml
# 验证
[root@master ~]# kubectl exec -it env-configmap -- sh
/ # echo $CONFIGMAP_USERNAME
enemy.types=aliens,monsters player.maximum-lives=5
immutable
字段设置为true
创建不可变更的ConfigMap[root@master ~]# vim 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 immutable: true
# 应用资源清单
[root@master ~]# kubectl apply -f configmap.yaml
# 验证
# 以下我把player_initial_lives变量的值改为10查看效果
player_initial_lives: "10"
# 可以看出设置为了不可变更的configmap之后,里面的内容是不允许更改的
[root@master ~]# kubectl apply -f configmap.yaml
The ConfigMap "game-demo" is invalid: data: Forbidden: field is immutable when `immutable` is set
data
或binaryData
·字段的内容。你只能删除并重建ConfigMap。因为现有的Pod会维护一个已被删除的ConfigMap的挂载点,建议重新创建这些PodCopyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。