其他容器编排调度工具会大谈特谈“轻应用”、“十二要素应用”,这样就势必会对企业级复杂应用做很大的改动。Kubernetes是为了解决“如何合理使用容器支撑企业级复杂应用”这个问题而诞生的,所以它的设计理念是要支持绝大多数应用的原生形态。例如,很多应用程序的配置需要通过配置文件,命令行参数和环境变量的组合配置来完成(“十二要素应用”等均要求去配置)。这些配置应该从image内容中解耦,以此来保持容器化应用程序的可移植性。ConfigMap API资源提供了将配置数据注入容器的方式,同时保证该机制对容器来说是透明的。ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
ConfigMap API资源存储键/值对配置数据,这些数据可以在pods里使用。ConfigMap跟Secrets类似,但是ConfigMap可以更方便的处理不包含敏感信息的字符串。示例如下:
kind: ConfigMap
apiVersion: v1
metadata:
creationTimestamp: 2016-02-18T19:14:38Z
name: example-config
namespace: default
data:
example.property.1: hello
example.property.2: world
example.property.file: |-
property.1=value-1
property.2=value-2
property.3=value-3
通过示例代码可以看到:ConfigMap可以包含细粒度的配置项,如:example.property.1;也可以包含粗粒度的配置文件,如:example.property.file。
[root@k8s-master propertirs]# cat /home/yaml/propertirs/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
[root@k8s-master propertirs]# cat /home/yaml/propertirs/ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
[root@k8s-master propertirs]# kubectl create configmap game-config --from-file=/home/yaml/propertirs/
configmap "game-config" created
[root@k8s-master propertirs]# kubectl describe configmaps game-config
#该方法只能得到ConfigMap的Key和size
Name: game-config
Namespace: default
Labels:
Annotations:
Data
====
ui.properties: 83 bytes
game.properties: 158 bytes
#若想得到详细信息,可通过以下命令:
[root@k8s-master propertirs]# kubectl 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: 2017-03-21T03:22:34Z
name: game-config
namespace: default
resourceVersion: "3002770"
selfLink: /api/v1/namespaces/default/configmaps/game-config
uid: a04f90f0-0de5-11e7-b3d5-fa163ebba51b
[root@k8s-master propertirs]# kubectl create configmap game-config-2 --from-file=/home/yaml/propertirs/game.properties --from-file=/home/yaml/propertirs/ui.properties
configmap "game-config-2" created
[root@k8s-master propertirs]# kubectl 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: 2017-03-21T03:30:15Z
name: game-config-2
namespace: default
resourceVersion: "3003415"
selfLink: /api/v1/namespaces/default/configmaps/game-config-2
uid: b2e4dfab-0de6-11e7-b3d5-fa163ebba51b
[root@k8s-master propertirs]# kubectl create configmap game-config-3 --from-file=game-special-key=/home/yaml/propertirs/game.properties
configmap "game-config-3" created
[root@k8s-master propertirs]# kubectl get configmaps game-config-3 -o yaml
apiVersion: v1
data:
game-special-key: |
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: 2017-03-21T03:33:23Z
name: game-config-3
namespace: default
resourceVersion: "3003678"
selfLink: /api/v1/namespaces/default/configmaps/game-config-3
uid: 2345dad3-0de7-11e7-b3d5-fa163ebba51b
[root@k8s-master propertirs]# kubectl create configmap game-config-4 --from-literal=special.user=zhenyu --from-literal=special.passwd=yaodidiao
configmap "game-config-4" created
[root@k8s-master propertirs]# kubectl get configmaps game-config-4 -o yaml
apiVersion: v1
data:
special.passwd: yaodidiao
special.user: zhenyu
kind: ConfigMap
metadata:
creationTimestamp: 2017-03-21T03:36:12Z
name: game-config-4
namespace: default
resourceVersion: "3003915"
selfLink: /api/v1/namespaces/default/configmaps/game-config-4
uid: 8802f6d2-0de7-11e7-b3d5-fa163ebba51b
创建一个Pod,并将一个已经创建好的ConfigMap作为环境变量,注入到Pod中。
[root@k8s-master propertirs]# kubectl get configmaps game-config-4 -o yaml
apiVersion: v1
data:
special.passwd: yaodidiao
special.user: zhenyu
kind: ConfigMap
metadata:
creationTimestamp: 2017-03-21T03:36:12Z
name: game-config-4
namespace: default
resourceVersion: "3003915"
selfLink: /api/v1/namespaces/default/configmaps/game-config-4
uid: 8802f6d2-0de7-11e7-b3d5-fa163ebba51b
[root@k8s-master propertirs]# cat testEnv.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
name: testenv
role: master
name: testenv
spec:
containers:
- name: testenv
image: busybox
imagePullPolicy: IfNotPresent
env:
- name: SPECIAL_USER
valueFrom:
configMapKeyRef:
name: game-config-4
key: special.user
command:
- sleep
- "360000"
[root@k8s-master propertirs]# kubectl create -f testEnv.yaml
pod "testenv" created
[root@k8s-master propertirs]# kubectl exec -ti testenv sh
/ # echo $SPECIAL_USER
zhenyu
/ #
[root@k8s-master propertirs]# kubectl 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: 2017-03-21T03:22:34Z
name: game-config
namespace: default
resourceVersion: "3002770"
selfLink: /api/v1/namespaces/default/configmaps/game-config
uid: a04f90f0-0de5-11e7-b3d5-fa163ebba51b
[root@k8s-master propertirs]# cat testVolume.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
name: testvolume
role: master
name: testvolume
spec:
containers:
- name: testvolume
image: busybox
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /etc/config
command:
- sleep
- "360000"
volumes:
- name: config-volume
configMap:
name: game-config
[root@k8s-master propertirs]# kubectl create -f testVolume.yaml
pod "testvolume" created
[root@k8s-master propertirs]# kubectl exec -ti testvolume sh
/ # cd /etc/config/
/etc/config # ls
game.properties ui.properties
/etc/config # cat 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
/etc/config # cat ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
/etc/config #
[root@k8s-master propertirs]# cat testVolume.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
name: testvolume
role: master
name: testvolume
spec:
containers:
- name: testvolume
image: busybox
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /etc/config
command:
- sleep
- "360000"
volumes:
- name: config-volume
configMap:
name: game-config-4
[root@k8s-master propertirs]# kubectl get configmaps game-config-4 -o yaml
apiVersion: v1
data:
special.passwd: yaodidiao
special.user: zhenyuyaodidiao
kind: ConfigMap
metadata:
creationTimestamp: 2017-03-21T06:29:29Z
name: game-config-4
namespace: default
resourceVersion: "3018779"
selfLink: /api/v1/namespaces/default/configmaps/game-config-4
uid: bd086dca-0dff-11e7-b3d5-fa163ebba51b
[root@k8s-master propertirs]# kubectl create -f testVolume.yaml
pod "testvolume" created
[root@k8s-master propertirs]# kubectl exec -ti testvolume sh
/ # cd /etc/config/
/etc/config # ls
special.passwd special.user
/etc/config # cat special.user
zhenyuyaodidiao/etc/config #
/etc/config # exit
当ConfigMap以数据卷的形式挂载进Pod的时,这时更新ConfigMap(或删掉重建ConfigMap),Pod内挂载的配置信息会热更新。这时可以增加一些监测配置文件变更的脚本,然后reload对应服务。