K8s 配置之ConfigMap

简介

ConfigMap用于保存配置。既可以保存为键值对格式,也可是保存为配置文件。可以在Pod的环境变量配置直接引用config map的值。或者是在数据卷(volume)中引用config map,把config map中的内容以文件形式放在volume中。

config map的创建

根据字面值创建ConfigMap

kubectl create configmap fortune-config --from-literal=sleep-interval=25

可以指定多个key-value

kubectl create configmap myconfigmap -from-literal=foo=bar --from-literal=bar=baz --from-literal=one=two

从yaml创建config map

apiVersion: v1
data:
    sleep-interval: "25"
kind: ConfigMap
metadata:
    name: fortune-config
    namespace: default

从文件创建config map。文件名为key,文件内容为value

kubectl create configmap my-config --from-file=config-file.conf

from-file参数可以指定多个。

指定自定义key

kubectl create configmap my-config --from-file=customkey=config-file.conf

from-env-file

可以从env file创建config map。
env file是包含一组环境变量的文件,特点为:

  • 每行格式为VAR=VAL
  • 以#开头的行会被忽略
  • 空行会被忽略
  • 不会对引号特殊处理,引号会成为值的一部分

从env file创建config map

kubectl create configmap game-config-env-file \
       --from-env-file=configure-pod-container/configmap/game-env-file.properties

注意:和from-file不同的是,如果参数中使用from-env-file多次,仅会使用最后一个env file。

从目录创建config map。

和从文件创建的方式类似,不同之处在于如果目录内的文件名不是合法的key名称,则此键值对不会被创建。

创建过程中遇到的不合法的变量名可以通过kubectl get events命令查看。

kubectl create configmap my-config --from-file=/path/to/dir

使用kustomization.yaml生成config map

configure-pod-container/configmap/game.properties生成config map

# Create a kustomization.yaml file with ConfigMapGenerator
cat <./kustomization.yaml
configMapGenerator:
- name: game-config-4
  files:
  - configure-pod-container/configmap/game.properties
EOF

再执行

kubectl apply -k .
configmap/game-config-4-m9dm2f92bt created

注意:生成的config map名字后面会自动添加后缀。确保每次内容修改之后创建出一个新的config map。

生成config map的时候指定key的名称

# Create a kustomization.yaml file with ConfigMapGenerator
cat <./kustomization.yaml
configMapGenerator:
- name: game-config-5
  files:
  - game-special-key=configure-pod-container/configmap/game.properties
EOF

从字面值生成config map

# Create a kustomization.yaml file with ConfigMapGenerator
cat <./kustomization.yaml
configMapGenerator:
- name: special-config-2
  literals:
  - special.how=very
  - special.type=charm
EOF

查看config map

查看config map的配置

kubectl describe configmaps game-config

返回内容和下方类似:

Name:           game-config
Namespace:      default
Labels:         
Annotations:    

Data
====
game.properties:        158 bytes
ui.properties:          83 bytes

获取config map的内容

kubectl get configmaps game-config -o yaml

返回内容和下方类似:

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: 2016-02-18T18:52:05Z
  name: game-config
  namespace: default
  resourceVersion: "516"
  uid: b4952dc3-d670-11e5-8cd0-68f728db1985
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

在pod中使用config map

pod的环境变量使用config map的值

apiVersion: v1
kind: Pod
metadata:
    name: fortune-env-from-configmap
spec:
    containers:
    - image: luksa/fortune:env
      env:
      - name: INTERVAL
        valueFrom:
            configMapKeyRef:
                name: fortune-config
                key: sleep-interval

如果指向的ConfigMap不存在,则container启动会失败。如果稍后创建出缺失的configMap,该容器会自动启动,无需手工重建。

可以同时使用多个config map中的值。例如:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.how
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: env-config
              key: log_level
  restartPolicy: Never

把configMap中所有内容加入env:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config
  restartPolicy: Never

prefix为可选,如果指定了prefix,创建出的环境变量名称会加上prefix前缀。

spec:
    containers:
    - image: some-image
      envFrom:
      - prefix: CONFIG_
        configMapRef:
            name: my-config-map

命令行参数使用环境变量(环境变量来源于configMap的内容)

apiVersion: v1
kind: Pod
metadata:
    name: fortune-args-from-configmap
spec:
    containers:
    - image: luksa/fortune:args
      env:
      - name: INTERVAL
        valueFrom:
            configMapKeyRef:
            name: fortune-config
            key: sleep-interval
      args: ["$(INTERVAL)"]

另一个例子

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: SPECIAL_LEVEL
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: SPECIAL_TYPE
  restartPolicy: Never

Volume中使用config map

以如下config map为例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm

创建如下所示的pod:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        # Provide the name of the ConfigMap containing the files you want
        # to add to the container
        name: special-config
  restartPolicy: Never

然后我们查看pod中的/etc/config/会发现有如下两个文件:

SPECIAL_LEVEL
SPECIAL_TYPE

注意:如果pod原本在/etc/config/有文件,这些文件会被覆盖掉。

加载config map的配置到volume特定的path下

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh","-c","cat /etc/config/keys" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
        items:
        - key: SPECIAL_LEVEL
          path: keys
  restartPolicy: Never

我们查看这个pod的/etc/config/keys文件,发现它的内容如下:

very

另一个例子

apiVersion: v1
kind: Pod
metadata:
    name: fortune-configmap-volume
spec:
    containers:
    - image: nginx:alpine
      name: web-server
      volumeMounts:
      ...
      - name: config
        mountPath: /etc/nginx/conf.d
        readOnly: true
        ...
    volumes:
    - name: config
      configMap:
        name: fortune-config
        items:
        - key: my-nginx-config.conf
          path: gzip.conf

会在/etc/nginx/conf.d目录下生成gzip.conf文件,内容为my-nginx-config.conf的内容。

为了避免目标目录的内容被覆盖,可以单独挂载volume中的一个文件,配置方法如下:

spec:
    containers:
    - image: some/image
      volumeMounts:
      - name: myvolume
        mountPath: /etc/someconfig.conf
        subPath: myconfig.conf

在这个例子中,myvolume数据卷中的myconfig.conf文件被挂载到pod中/etc/someconfig.conf文件。

在Volume中使用config map的自动更新特性

如果config map的值发生修改,那么使用这个config map的volume中的内容会随之发生变更。但是这个更新过程是由延迟的。默认来说kubelet的同步周期是1min,config map的缓存有效期是1min。因此采用默认配置时,自动同步的时间延迟可能会长达2分钟。可以通过修改pod annotation立刻触发内容同步。

注意:使用类似前一个例子这种subPath方式的volume不会自动更新。

指定configMap作为volume挂载文件的权限

volumes:
- name: config
  configMap:
    name: fortune-config
    defaultMode: "6600"

附录:pod启动时向镜像中传递参数的方式

有如下3种方式:

  • 命令行参数
  • 自定义环境变量
  • 挂载配置文件到容器

命令行参数传递内容:

  • ENTRYPOINT 定义容器启动入口命令
  • CMD 定义其他启动参数(追加到ENTRYPOINT之后)

K8s中重写命令行参数:

kind: Pod
spec:
    containers:
    - image: some/image
      command: ["/bin/command"]
      args: ["arg1", "arg2", "arg3"]

k8s Pod指定env:

kind: Pod
spec:
    containers:
    - image: luksa/fortune:env
        env:
        - name: INTERVAL
          value: "30"
        name: html-generator

环境变量相互引用:

env:
- name: FIRST_VAR
  value: "foo"
- name: SECOND_VAR
  value: "$(FIRST_VAR)bar"

例子中SECOND_VAR的值为foobar

挂载配置文件到容器已经提及,此处不再赘述。

你可能感兴趣的:(K8s 配置之ConfigMap)