ConfigMap存在的意义

ConfigMap 功能在 Kubernetes1.2版本引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息,ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象

ConfigMap的创建

I、使用目录创建

## 创建目录
[root@Centos8 k8sYaml]# mkdir dir
[root@Centos8 k8sYaml]# cd dir/

## 创建2个文件,文件内存放值
[root@Centos8 dir]# cat << EOF > 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
> EOF

[root@Centos8 dir]# cat << EOF > ui.properties
> color.good=purple
> color.bad=yellow
> allow.textmode=true
> how.nice.to.look=fairlyNice
> EOF

[root@Centos8 dir]# ls 
game.properties  ui.properties

## 开始创建ConfigMap
[root@Centos8 dir]# kubectl create configmap game-config --from-file=/root/k8sYaml/dir
configmap/game-config created

### 查看ConfigMap
[root@Centos8 dir]# kubectl get cm
NAME          DATA   AGE
game-config   2      2m19s

[root@Centos8 dir]# kubectl describe cm game-config
Name:         game-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

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

Events:  <none>

--from-file= 表示指定该目录下所有的文件都会被用在ConfigMap里创建一个键值对,键的名字就是文件名,值就是文件内容

II、使用文件名创建

## 创建文件
[root@Centos8 dir]# cat wuzi.examplate 
NAME=wuzi
URL=www.wuzi.com

## 创建ConfigMap
[root@Centos8 dir]# kubectl create cm wuzi.com --from-file=/root/k8sYaml/dir/wuzi.examplate
configmap/wuzi.com created

## 查看cm
[root@Centos8 dir]# kubectl get cm 
NAME          DATA   AGE
game-config   2      7m37s
wuzi.com      1      41s

[root@Centos8 dir]# kubectl describe cm wuzi.com
Name:         wuzi.com
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
wuzi.examplate:
----
NAME=wuzi
URL=www.wuzi.com

Events:  <none>

--from-file 可以重复使用,当重复指定多个文件时,效果与直接指定目录相同

III、使用字面值创建(直接创建)

使用字面值创建使用 --from-literal 参数传递配置信息,该参数可以使用多次,格式如下:

## 创建cm
[root@Centos8 dir]# kubectl create cm spec.examplate --from-literal=spec.how=very --from-literal=spec.type=charm
configmap/spec.examplate created

## 查看cm
[root@Centos8 dir]# kubectl describe cm spec.examplate
Name:         spec.examplate
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
spec.how:
----
very
spec.type:
----
charm
Events:  <none>

## 也可以通过资源清单的方式来创建ConfigMap
vim map.yaml
...
apiVersion: v1
kind: ConfigMap
metadata:
  name: spec-config
  namespace: default
data:
  special.now: 6\.4
  special.time: 12\:00
...

## 查看
[root@Centos8 dir]# kubectl create -f map.yaml 
configmap/spec-config created

[root@Centos8 dir]# kubectl describe cm spec-config
Name:         spec-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
special.now:
----
6\.4
special.time:
----
12\:00
Events:  <none>

创建Pod 测试ConfigMap

I、使用ConfigMap设置环境变量

vim cm-test.yaml
...
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod
spec:
  containers:
  - name: cm-container
    image: hub.vfancloud.com/test/myapp:v1
    command: [ "/bin/sh","-c","env" ]
    env: 将名为spec.examplate的ConfigMap中名为spec.how的key的value赋值给环境变量SPEC_LEVEL_KEY
    - name: SPEC_LEVEL_KEY
      valueFrom:
        configMapKeyRef:
          name: spec.examplate
          key: spec.how
    - name: SPEC_TYPE_KEY
      valueFrom:
        configMapKeyRef:
          name: spec.examplate
          key: spec.type
    envFrom: 将名为wizi.com的ConfigMap中定义的所有key:value都导入环境变量
    - configMapRef:
        name: wuzi.com
  restartPolicy: Never
...

## 查看环境变量
[root@Centos8 dir]# kubectl log cm-pod | grep -E "SPEC_LEVEL_KEY|SPEC_TYPE_KEY|NAME|URL"
HOSTNAME=cm-pod
SPEC_LEVEL_KEY=very
wuzi.examplate=NAME=wuzi
URL=www.wuzi.com
SPEC_TYPE_KEY=charm

II、通过数据卷插件使用configMap

vim volum.yaml
...
apiVersion: v1
kind: Pod
metadata:
  name: volum-cm
spec:
  containers:
  - name: volum-ct
    image: hub.vfancloud.com/test/myapp:v1
    volumeMounts:  挂载共享数据卷
    - name: config-volume  要挂载共享数据卷的名字
      mountPath: /etc/config  挂载到指定的目录下
  volumes:  定义共享数据卷
  - name: config-volume  共享数据卷名称
    configMap:
      name: game-config  ConfigMap的名称
#      name: wuzi.com
#      name: spec-config
  restartPolicy: Never
...
[root@Centos8 dir]# kubectl create -f volum.yaml

### 分别以文章开头的第一步创建的ConfigMap类型(目录、文件、键值)三种形式进行试验
## ConfigMap类型为目录的,直接将此目录下的所有文件共享到了container指定目录中
/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

## ConfigMap类型为文件的,只将此文件共享到了container目录下
/etc/config ls
wuzi.examplate
/etc/config cat wuzi.examplate 
NAME=wuzi
URL=www.wuzi.com

## ConfigMap类型为键值对的,将key保存成了文件名,value保存为文件内容
/etc/config ls
special.now   special.time
/etc/config cat special.time 
12\:00/etc/config 
/etc/config cat special.now 
6\.4/etc/config 

滚动更新

## 先创建一个索引文件
[root@Centos8 dir]# cat index1.html 
Hello World

## 使用此文件创建ConfigMap
[root@Centos8 dir]# kubectl create cm nginx-cm --from-file=./index1.html
configmap/nginx-cm created

## 创建Deployment
[root@Centos8 dir]# vim nginx-cm.yaml
...
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-cm
  namespace: default
spec:
  replicas: 3
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx-cm
        image: hub.vfancloud.com/test/myapp:v1
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-nginx
          mountPath: /usr/share/nginx/html/config
      volumes:
      - name: config-nginx
        configMap:
          name: nginx-cm
...
kubectl apply -f nginx-cm.yaml

## 测试访问
[root@Centos8 dir]# curl http://10.244.3.170/config/index1.html
Hello World

## 现在创建一个新文件index2.html
[root@Centos8 dir]# cat index2.html 
It is a wonderful world

## 删除ConfigMap重建替换index1.html为index2.html
[root@Centos8 dir]# kubectl delete cm nginx-cm 
configmap "nginx-cm" deleted
[root@Centos8 dir]# kubectl get cm
No resources found.
[root@Centos8 dir]# kubectl create cm nginx-cm --from-file=./index2.html
configmap/nginx-cm created

## 再次测试,滚动更新完成
[root@Centos8 dir]# curl http://10.244.3.170/config/index2.html
It is a wonderful world

需要等一会才能同步更新,可能10-30s