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 <<EOF >./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 <<EOF >./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 <<EOF >./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:         <none>
Annotations:    <none>

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341

推荐阅读更多精彩内容

  • 1、在yaml文件中配置环境变量 (1)、配置固定值环境变量 env: - name: INTERVAL val...
    七月流火2019阅读 856评论 0 0
  • 应用部署的一个最佳实践是将应用所需的配置信息与程序进行分离,这样可以使得应用程序被更好地复用,通过不同的配置也能实...
    王勇1024阅读 20,350评论 0 5
  • 一、描述信息 ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行...
    小波同学阅读 1,117评论 0 1
  • 爱情是风也是雨 我心窝里的一捧雪花 无时无刻不在融化 我都无知,我的任性,我的无理取闹 一点点消耗阳光的温度 后来...
    蓝山小君阅读 350评论 4 4
  • 夫君子之行事,当忘忧患以破浪前行,此天理之所昭然也,今天下纷扰,虽无四方战乱之祸,而有上下相疑之忧,当此国运艰难之...
    3caf0a592c43阅读 194评论 0 2