kubernetes configmap

1、在yaml文件中配置环境变量

(1)、配置固定值环境变量

env:

- name: INTERVAL

  value: "30"

2、通过configmap配置环境变量

Kubemetes 允许将配置选项分离到单独的资源对象 ConfigMap 中, 本质上就是一个键 / 值对映射,值可以是短字面量,也可以是完整的配置文件 。

(1)、可以通过文件来创建comfigMap

kubectl create configmap fortune-config --from-file=configmap-files

(2)、引用cm

volumeMounts:

  - name: config

    mountPath: /etc/nginx/conf.d        --挂载configMap卷到这个目录

    readOnly: true

...

volumes:

- name: config

  configMap:

    name: fortune-config               --卷定义引用configMap  fortune-config

(3)、 挂载某一文件夹会隐藏该文件夹中已存在的文件

将卷挂载至某个文件夹,意味着容器镜像中/etc/nginx/conf.d文件夹下原本存在的任何文件都会被隐藏。

Linux 系统挂载文件系统至非空文件夹时通常表现如此。文件夹中只会包含被挂载文件系统中的文件,即便文件夹中原本的文件是不可访问的也是同样如此。

(4)、 ConfigMap独立文件被挂载且不隐藏文件夹中的其他文件

volumeMounts:

- name: myvolume

  mountPath: /etc/someconfig.conf        --挂载到某一文件,而不是文件夹

  subPath: myconfig.conf                 --仅挂载指定的条目 myconfig.conf,而不是完整的configMap 卷

(5)、更新应用配置且不重启应用程序 (挂载完整卷才会自动加载,如果只是挂载卷中的某个文件则不会)

 使用环境变量或者命令行参数作为配置源的弊端在于无法在进程运行时更新配置。 将ConfigMap暴露为卷可以达到配置热更新的效果, 无须重新创建pod或者重启容器。

ConfgMap被更新之后, 卷中引用它的所有文件也会相应更新, 进程发现文件被改变之后进行重载。 Kubemetes同样支待文件更新之后手动通知容器。

3、两种创建configmap的方式

(1)、通过yaml文件创建

apiVersion: v1

kind: ConfigMap

metadata:

  name: test-cfg

  namespace: default

data:

  cache_host: memcached-gcxt

  cache_port: "11211"

  cache_prefix: gcxt

  my.cnf: |

    [mysqld]

    log-bin = mysql-bin

  app.properties: |

    property.1 = value-1

    property.2 = value-2

    property.3 = value-3

kubectl create -f test-cfg.yml

(2)、通过命令行创建

kubectl create configmap test-config --from-file=./configs        --configs是实际配置文件

kubectl create configmap test-config3 --from-literal=db.host=10.5.10.116 --from-listeral=db.port='3306'    --在命令行中传递参数

4、configmap挂载使用的三种方式

(1)、直接传递给pod(cm中定义的是key-value形式时使用)

apiVersion: v1

kind: ConfigMap

metadata:

  name: special-config

  namespace: default

data:

  special.how: very

  special.type: charm

---

apiVersion: v1

kind: Pod

metadata:

  name: dapi-test-pod

spec:

  containers:

    - name: test-container

      image: gcr.io/google_containers/busybox

      command: [ "/bin/sh", "-c", "env" ]

      env:

        - name: SPECIAL_LEVEL_KEY

          valueFrom:

            configMapKeyRef:

              name: special-config

              key: special.how

        - name: SPECIAL_TYPE_KEY

          valueFrom:

            configMapKeyRef:

              name: special-config

              key: special.type

  restartPolicy: Never

(2)、通过在pod命令行下引用

apiVersion: v1

kind: ConfigMap

metadata:

  name: special-config

  namespace: default

data:

  special.how: very

  special.type: charm

---

apiVersion: v1

kind: Pod

metadata:

  name: dapi-test-pod

spec:

  containers:

    - name: test-container

      image: gcr.io/google_containers/busybox

 command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]

      env:

        - name: SPECIAL_LEVEL_KEY

          valueFrom:

            configMapKeyRef:

              name: special-config

              key: special.how

        - name: SPECIAL_TYPE_KEY

          valueFrom:

            configMapKeyRef:

              name: special-config

              key: special.type

  restartPolicy: Never

(3)、使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容,下面是一个示例。  

此种引用方式一般在comfigMap是通过配置文件创建的时候使用,可以直接将某个配置文件或者某些配置文件挂载到容器的指定目录下

apiVersion: v1

kind: ConfigMap

metadata:

  name: special-config

  namespace: default

data:

  special.how: very

  special.type: charm

--

apiVersion: v1

kind: Pod

metadata:

  name: dapi-test-pod

spec:

  containers:

    - name: test-container

      image: gcr.io/google_containers/busybox

      command: [ "/bin/sh", "-c", "cat /etc/config/special.how" ]

      volumeMounts:

      - name: config-volume

        mountPath: /etc/config

  volumes:

    - name: config-volume

      configMap:

        name: special-config

  restartPolicy: Never

5、问题:configMap热更新讨论测试?

测试一:更新使用ConfigMap挂载的Env

#vim nginx-cm.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: env-config

  namespace: default

data:

  log_level: INFO

#vim nginx-deployment.yaml

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: my-nginx

spec:

  replicas: 1

  template:

    metadata:

      labels:

        app: my-nginx

    spec:

      containers:

      - name: my-nginx

        image: nginx:1.10

        ports:

        - containerPort: 80

        envFrom:

        - configMapRef:

            name: env-config

等待应用启动之后,进入应用pod容器查看环境变量:

env|grep log_level

#输出:

log_level=INFO

修改configmap:env-config,修改日志登记为DEBUG,再次进入应用pod容器查看环境变量,发现日志等级没有发生任何变化。

重启应用,再次进入应用pod容器,查看环境变量,发现环境变量log_level=DEBUG。

测试结果:未实现热更新,需要重启应用才能生效。

测试二:更新使用ConfigMap挂载的Volume

#vim nginx-cm2.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: special-config

  namespace: default

data:

  log_level: INFO

#vim nginx-deployment-v.yaml

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: my-nginx-2

spec:

  replicas: 1

  template:

    metadata:

      labels:

        app: my-nginx-2

    spec:

      containers:

      - name: my-nginx-2

        image: nginx:1.10

        ports:

        - containerPort: 80

        volumeMounts:

        - name: config-volume

          mountPath: /etc/config

      volumes:

        - name: config-volume

          configMap:

            name: special-config

等待应用启动后,进入应用pod容器查看环境变量:

cat /etc/config/log_level

#输出:

INFO

修改configmap:special-config,修改日志登记为DEBUG,再次进入应用pod容器查看环境变量,一分钟左右发现日志级别发生改变。从INFO变化为DEBUG。

测试结果:实现热更新。

结论:

更新 ConfigMap 后:

(1)、使用该 ConfigMap 挂载的 Env 不会同步更新

(2)、使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概1分钟)才能同步更新

ENV 是在容器启动的时候注入的,启动之后 kubernetes 就不会再改变环境变量的值。

更多文章请关注我的知乎账号:https://www.zhihu.com/people/dengjiabo/activities

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