configMap 使用方法

什么是configMap

configmap 是将配置和应用程序分离的最佳实践, 这样可以使应用程序更好的被复用,通过不同的配置实现更加灵活的功能, 可以通过环境变量方式和volume挂载方式使用.

使用configMap

通过yaml文件创建 , 示例 : cm-appvars.yaml

1
2
3
4
5
6
7
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appvars
data:
appv1: app1var
appv2: /var/data

创建configMap

1
kubectl create -f cm-appvars.yaml 

通过命令行创建
不使用yaml文件, 直接通过 kubectl create configmap 创建 可以使用参数 --from-file --from-literal 指定内容, 并且可以在一行命令中指定多个参数

1
2
3
#在目录下使用 --from-file 目录下的每个文件名 都会被创建成key 内容为 value
#指定文件为单文件, 文件名字为key
kubectl crate configmap appv1 --from-file=appfile
1
2
#--from-literal 以指定内容创建
kubectl create configmap appv1 --from-literal=appv1=app1var --from-literal=appv2=/var/data

获取configMap内容

获取方式有两种

  • 通过环境变量获取内容
  • 通过vloume挂载的方式将configmap挂载到容器指定的内部文件或目录进行读取

通过环境变量获取

  • 指定字段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    apiVersion: v1
    kind: pod
    metadata:
    name: test-pod
    spec:
    containers:
    - name: test
    image: busybox
    command: [ "/bin/bash","-C","env|grep app" ]
    env:
    - name: appv1 #定义环境变量的名字
    valueForm:
    configMapKeyRef:
    name: cm-appvars #环境变量取指来自 cm-appvars
    key: appv1 # cm-appvars的key
    - name: appv2 #定义环境变量名字
    valueFrom:
    configMapKeyRef:
    name: cm-appvars #环境变量取指来自 cm-appvars
    key: appv2 # cm-appvars的key
  • envFrom 将configmap中的所有key-value 自动生成环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
            apiVersion: v1
    kind: pod
    metadata:
    name: test-pod
    spec:
    containers:
    - name: test
    image: busybox
    command: [ "/bin/bash","-C","env|grep app" ]
    envFrom:
    - configMapRef:
    name: cm-appvars #根据cm-appvars中的所有key-value 生成变量
    ```

    通过vloume挂载方式获取
    * items参数

    ```bash
    xxxxxxx
    spec:
    containres:
    - name: test
    image: busybox
    command: [ "/bin/bash","-C","env|grep app" ]
    volumeMount:
    - name: serverconfig #引用vloume的名称
    mountPath: /config #挂载到容器config下面
    volumes:
    - name: serverconfig #定义vloume的名称
    configMap:
    name: cm-appvars #引用那个map
    items:
    - key: appv1
    path: alias-appv1 #将appv1 挂载为alias-appv1
    - key: appv2
    path: alias-appv2 #将appv2 挂载为alias-appv2

    ## 会生成 alias-appv2 alias-appv2 等文件
  • 不指定items, 则为每一个itesm生成一个文件名为key的文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
      volumeMount:
    - name: serverconfig #引用vloume的名称
    mountPath: /config #挂载到容器config下面
    volumes:
    - name: serverconfig #定义vloume的名称
    configMap:
    name: cm-appvars #引用那个map

    ## 会生成 appv1 appv2 等文件

使用configMap的限制条件

  • configMap必须在pod之前创建, pod才能引用它
  • 如果pod使用envForm 来引用变量, 则无效的环境变量(比如数字开头)将会被忽略, 并在事件中被记录为 InvalidVariableNames.
  • configMap受命名中间影响,只有处于相同namespace下才能被引用
  • configMap 无法用于静态pod

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!