1 创建ConfigMap

1)通过YAML配置文件方式创建

demo 1:

[root@kube-master zh-go]# cat configMap-1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  rootDir: /www
  logDir: /var/log/nginx

# 创建
[root@kube-master zh-go]# kubectl apply -f configMap-1.yaml
configmap/nginx-config created

# 查看创建的configmap
[root@kube-master zh-go]# kubectl get configmap
NAME           DATA   AGE
nginx-config   2      26s

# 查看详细信息
[root@kube-master zh-go]# kubectl describe configmap nginx-config
...
[root@kube-master zh-go]# kubectl get configmap nginx-config -o yaml
...


demo 2:

[root@kube-master zh-go]# cat configMap-2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config-2
data:
  key-nginx-conf: |
    user = www
    root = /www
    aaaaaaaaaaaaaaaaaaaa
  key-nginx-conf-2: "yyyyyyyyyyyyyyyyyyyyyyyycccccccccccccccccccc"

# 创建
[root@kube-master zh-go]# kubectl apply -f configMap-2.yaml
configmap/nginx-config-2 created

# 查看创建的configmap
[root@kube-master zh-go]# kubectl get configmap
NAME             DATA   AGE
nginx-config-2   2      6m40s

# 查看详细信息
[root@kube-master zh-go]# kubectl describe configmap nginx-config-2
...
[root@kube-master zh-go]# kubectl get configmap nginx-config-2 -o yaml
...

 

2)通过命令行方式创建

demo 1:

1、key是www value是文件内容
[root@kube-master zh-go]# kubectl create configmap test-0 --from-file=www=test1.txt

2、不指定key的话 key默认是文件名 value是文件内容
[root@kube-master zh-go]# kubectl create configmap test-1 --from-file=test1.txt

3、如果指定一个目录 目录下的所有文件名将被设置成key,文件内容则被设置成对应的value
[root@kube-master zh-go]# kubectl create configmap test-2 --from-file=testDir/

4、key是name value是zzd ...
[root@kube-master zh-go]# kubectl create configmap test-3 --from-literal=name=zzd --from-literal=age=100

 

2 Pod中使用ConfigMap

1)通过环境变量的方式使用

demo 1:

# 创建configMap
[root@kube-master zh-go]# kubectl create configmap test-3 --from-literal=name=zzd --from-literal=age=100

# pod的yaml内容如下
[root@kube-master zh-go]# cat pod-configMap-1.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-1
spec:
  containers:
  - name: cm-test-1
    image: nginx
    env:
    - name: MY_NAME # 容器里的变量名
      valueFrom:
        configMapKeyRef:
          name: test-3  # configMap的名字
          key: name # name是configMap里的变量,对应的值将赋给容器里的MY_NAME
    - name: MY_AGE
      valueFrom:
        configMapKeyRef:
          name: test-3
          key: age

# 创建
[root@kube-master zh-go]# kubectl apply -f pod-configMap-1.yaml 
pod/cm-pod-1 created

# 查看结果
[root@kube-master zh-go]# kubectl exec cm-pod-1 env
MY_NAME=zzd
MY_AGE=100

 

demo 2:1.6版本以后则引入了下种方式(也可用于Secret资源对象)

# 创建configMap
[root@kube-master zh-go]# kubectl create configmap test-3 --from-literal=name=zzd --from-literal=age=100

# pod的yaml内容如下
[root@kube-master zh-go]# cat pod-configMap-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-2
spec:
  containers:
  - name: cm-test-2
    image: nginx
    envFrom:
    - configMapRef:
        name: test-3    # 根据configMap(test-3)中的key=value自动生成环境变量

# 创建
[root@kube-master zh-go]# kubectl apply -f pod-configMap-2.yaml
pod/cm-pod-2 created

# 查看结果
[root@kube-master zh-go]# kubectl exec cm-pod-2 env
age=100
name=zzd


注意:如果变量的名称包含非法字符,则系统跳过该条环境变量的创建,并记录一个Event来提示环境变量无法生成,但不阻止Pod的启动。

2)通过volumeMount的方式使用

# configMap内容如下
[root@kube-master zh-go]# cat configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  key-nginx-conf: |
    server {
      listen 80 default_server;
      server_name _;
      return 403;
    }
  key-nginx-conf-2: |
    xxxxxxxxxxxxxxxxxxxxxxxx

# 创建
[root@kube-master zh-go]# kubectl apply -f configMap.yaml
configmap/nginx-config created

# pod的yaml内容如下
[root@kube-master zh-go]# cat pod-configMap-3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-3
spec:
  containers:
  - name: cm-test-3
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nginx-conf-volume    # 引用volume的名称
      mountPath: /tmp            # 挂载到容器内的目录
  volumes:
  - name: nginx-conf-volume      # 定义的volume名称
    configMap:
      name: nginx-config         # 使用的ConfigMap(nginx-config)
      items:
      - key: key-nginx-conf      # ConfigMap(nginx-config)里的key名
        path: nginx.conf         # value将nginx.conf文件名进行挂载
      - key: key-nginx-conf-2
        path: nginx-2.conf

# 创建
[root@kube-master zh-go]# kubectl apply -f pod-configMap-3.yaml
pod/cm-pod-3 created

#查看结果
[root@kube-master zh-go]# kubectl exec cm-pod-3 ls /tmp
nginx-2.conf
nginx.conf

[root@kube-master zh-go]# kubectl exec cm-pod-3 cat /tmp/nginx.conf
server {
  listen 80 default_server;
  server_name _;
  return 403;
}

[root@kube-master zh-go]# kubectl exec cm-pod-3 cat /tmp/nginx-2.conf
xxxxxxxxxxxxxxxxxxxxxxxx
[root@kube-master zh-go]#

## 如果把configMap里key对应的值修改后,容器里的挂载也会随之变化
# 把configMap(nginx-config)里的key(key-nginx-conf-2)对应的值改成aaaaaaaaaaaaaaaaaaaa

# 应用
[root@kube-master zh-go]# kubectl apply -f configMap.yaml 
configmap/nginx-config configured

# 再次查看容器内的挂载,nginx-2.conf的内容已经变成了aaaaaaaaaaaaaaaaaaaa
[root@kube-master zh-go]# kubectl exec cm-pod-3 cat /tmp/nginx-2.conf
aaaaaaaaaaaaaaaaaaaa

 

demo 3:如果在引用ConfigMap时不指定items,则使用volumeMount方式在容器内的目录下为每个item都生成一个文件名为key的文件

# pod的yaml内容如下
[root@kube-master zh-go]# cat pod-configMap-4.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-4
spec:
  containers:
  - name: cm-test-4
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nginx-conf-volume
      mountPath: /tmp
  volumes:
  - name: nginx-conf-volume
    configMap:
      name: nginx-config

# 创建
[root@kube-master zh-go]# kubectl apply -f pod-configMap-4.yaml
pod/cm-pod-4 created

# 结果如下
[root@kube-master zh-go]# kubectl exec cm-pod-4 ls /tmp/
key-nginx-conf
key-nginx-conf-2

[root@kube-master zh-go]# kubectl exec cm-pod-4 cat /tmp/key-nginx-conf
server {
  listen 80 default_server;
  server_name _;
  return 403;
}

[root@kube-master zh-go]# kubectl exec cm-pod-4 cat /tmp/key-nginx-conf-2
aaaaaaaaaaaaaaaaaaaa


注意:

  • ConfigMap必须在Pod之前创建。
  • ConfigMap受Namespace限制,只有处于相同的Namespace中的Pod才可以应用它。
  • kubelet只支持可以被APIServer管理的Pod使用ConfigMap。kublet在本Node上通过--manifest-url或--config自动创建的静态Pod将无法引用ConfigMap
  • 在Pod对ConfigMap进行挂载(volumeMount)操作时,在容器内部只能挂载为“目录”,无法挂载为“文件”。挂载到容器内部后,目录下将包含ConfigMap定义的每个item,如果在该目录下原来还有其他文件,则容器内的该目录将被挂载的ConfigMap覆盖。如果应用程序需要保留原来的其他文件 可以将ConfigMap挂载到容器内容部的临时目录,在通过启动脚本将配置文件复制或链接到应用所用的实际配置目录下。