• Kubernetes外挂配置管理—ConfigMap介绍


    目录贴:Kubernetes学习系列

      其他容器编排调度工具会大谈特谈“轻应用”、“十二要素应用”,这样就势必会对企业级复杂应用做很大的改动。Kubernetes是为了解决“如何合理使用容器支撑企业级复杂应用”这个问题而诞生的,所以它的设计理念是要支持绝大多数应用的原生形态。例如,很多应用程序的配置需要通过配置文件,命令行参数和环境变量的组合配置来完成(“十二要素应用”等均要求去配置)。这些配置应该从image内容中解耦,以此来保持容器化应用程序的可移植性。ConfigMap API资源提供了将配置数据注入容器的方式,同时保证该机制对容器来说是透明的。ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。

      ConfigMap API资源存储键/值对配置数据,这些数据可以在pods里使用。ConfigMap跟Secrets类似,但是ConfigMap可以更方便的处理不包含敏感信息的字符串。示例如下:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      creationTimestamp: 2016-02-18T19:14:38Z
      name: example-config
      namespace: default
    data:
      example.property.1: hello
      example.property.2: world
      example.property.file: |-
        property.1=value-1
        property.2=value-2
        property.3=value-3

      通过示例代码可以看到:ConfigMap可以包含细粒度的配置项,如:example.property.1;也可以包含粗粒度的配置文件,如:example.property.file。

    1、创建ConfigMap

    1.1 从文件夹创建

    [root@k8s-master propertirs]# cat /home/yaml/propertirs/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
    [root@k8s-master propertirs]# cat /home/yaml/propertirs/ui.properties 
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
    [root@k8s-master propertirs]# kubectl create configmap game-config --from-file=/home/yaml/propertirs/
    configmap "game-config" created
    [root@k8s-master propertirs]# kubectl describe configmaps game-config  
    #该方法只能得到ConfigMap的Key和size
    Name:        game-config
    Namespace:    default
    Labels:        <none>
    Annotations:    <none>
    
    Data
    ====
    ui.properties:        83 bytes
    game.properties:    158 bytes
    #若想得到详细信息,可通过以下命令:
    [root@k8s-master propertirs]# kubectl get configmaps game-config -o yaml
    apiVersion: v1
    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
    kind: ConfigMap
    metadata:
      creationTimestamp: 2017-03-21T03:22:34Z
      name: game-config
      namespace: default
      resourceVersion: "3002770"
      selfLink: /api/v1/namespaces/default/configmaps/game-config
      uid: a04f90f0-0de5-11e7-b3d5-fa163ebba51b

    1.2 从文件创建

    [root@k8s-master propertirs]# kubectl create configmap game-config-2 --from-file=/home/yaml/propertirs/game.properties --from-file=/home/yaml/propertirs/ui.properties
    configmap "game-config-2" created
    [root@k8s-master propertirs]# kubectl get configmaps game-config-2 -o yaml
    apiVersion: v1
    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
    kind: ConfigMap
    metadata:
      creationTimestamp: 2017-03-21T03:30:15Z
      name: game-config-2
      namespace: default
      resourceVersion: "3003415"
      selfLink: /api/v1/namespaces/default/configmaps/game-config-2
      uid: b2e4dfab-0de6-11e7-b3d5-fa163ebba51b

    1.3  指定data中的key

    [root@k8s-master propertirs]# kubectl create configmap game-config-3 --from-file=game-special-key=/home/yaml/propertirs/game.properties
    configmap "game-config-3" created
    [root@k8s-master propertirs]# kubectl get configmaps game-config-3 -o yaml
    apiVersion: v1
    data:
      game-special-key: |
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
    kind: ConfigMap
    metadata:
      creationTimestamp: 2017-03-21T03:33:23Z
      name: game-config-3
      namespace: default
      resourceVersion: "3003678"
      selfLink: /api/v1/namespaces/default/configmaps/game-config-3
      uid: 2345dad3-0de7-11e7-b3d5-fa163ebba51b

    1.4  指定具体的值

    [root@k8s-master propertirs]# kubectl create configmap game-config-4 --from-literal=special.user=zhenyu --from-literal=special.passwd=yaodidiao
    configmap "game-config-4" created
    [root@k8s-master propertirs]# kubectl get configmaps game-config-4 -o yaml
    apiVersion: v1
    data:
      special.passwd: yaodidiao
      special.user: zhenyu
    kind: ConfigMap
    metadata:
      creationTimestamp: 2017-03-21T03:36:12Z
      name: game-config-4
      namespace: default
      resourceVersion: "3003915"
      selfLink: /api/v1/namespaces/default/configmaps/game-config-4
      uid: 8802f6d2-0de7-11e7-b3d5-fa163ebba51b

    2、使用ConfigMap

    2.1 环境变量或参数

      创建一个Pod,并将一个已经创建好的ConfigMap作为环境变量,注入到Pod中。

    [root@k8s-master propertirs]# kubectl get configmaps game-config-4 -o yaml
    apiVersion: v1
    data:
      special.passwd: yaodidiao
      special.user: zhenyu
    kind: ConfigMap
    metadata:
      creationTimestamp: 2017-03-21T03:36:12Z
      name: game-config-4
      namespace: default
      resourceVersion: "3003915"
      selfLink: /api/v1/namespaces/default/configmaps/game-config-4
      uid: 8802f6d2-0de7-11e7-b3d5-fa163ebba51b
    [root@k8s-master propertirs]# cat testEnv.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        name: testenv
        role: master
      name: testenv
    spec:
      containers:
        - name: testenv
          image: busybox
          imagePullPolicy: IfNotPresent
          env:
            - name: SPECIAL_USER
              valueFrom:
                configMapKeyRef:
                  name: game-config-4
                  key: special.user
          command:
          - sleep
          - "360000"
    [root@k8s-master propertirs]# kubectl create -f testEnv.yaml 
    pod "testenv" created
    [root@k8s-master propertirs]# kubectl exec -ti testenv sh
    / # echo $SPECIAL_USER
    zhenyu
    / #

    2.2 挂载文件数据卷

    [root@k8s-master propertirs]# kubectl get configmaps game-config -o yaml
    apiVersion: v1
    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
    kind: ConfigMap
    metadata:
      creationTimestamp: 2017-03-21T03:22:34Z
      name: game-config
      namespace: default
      resourceVersion: "3002770"
      selfLink: /api/v1/namespaces/default/configmaps/game-config
      uid: a04f90f0-0de5-11e7-b3d5-fa163ebba51b
    [root@k8s-master propertirs]# cat testVolume.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        name: testvolume
        role: master
      name: testvolume
    spec:
      containers:
        - name: testvolume
          image: busybox
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
          command:
          - sleep
          - "360000"
      volumes:
        - name: config-volume
          configMap:
            name: game-config
    [root@k8s-master propertirs]# kubectl create -f testVolume.yaml 
    pod "testvolume" created
    [root@k8s-master propertirs]# kubectl exec -ti testvolume sh
    / # cd /etc/config/
    /etc/config # ls
    game.properties  ui.properties
    /etc/config # cat 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
    /etc/config # cat ui.properties 
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
    /etc/config #

    2.3 挂载信息数据卷

    [root@k8s-master propertirs]# cat testVolume.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        name: testvolume
        role: master
      name: testvolume
    spec:
      containers:
        - name: testvolume
          image: busybox
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
          command:
          - sleep
          - "360000"
      volumes:
        - name: config-volume
          configMap:
            name: game-config-4
    [root@k8s-master propertirs]# kubectl get  configmaps game-config-4 -o yaml
    apiVersion: v1
    data:
      special.passwd: yaodidiao
      special.user: zhenyuyaodidiao
    kind: ConfigMap
    metadata:
      creationTimestamp: 2017-03-21T06:29:29Z
      name: game-config-4
      namespace: default
      resourceVersion: "3018779"
      selfLink: /api/v1/namespaces/default/configmaps/game-config-4
      uid: bd086dca-0dff-11e7-b3d5-fa163ebba51b
    [root@k8s-master propertirs]# kubectl create -f testVolume.yaml 
    pod "testvolume" created
    [root@k8s-master propertirs]# kubectl exec -ti testvolume sh
    / # cd /etc/config/
    /etc/config # ls
    special.passwd  special.user
    /etc/config # cat special.user 
    zhenyuyaodidiao/etc/config # 
    /etc/config # exit

    2.4 热更新

      当ConfigMap以数据卷的形式挂载进Pod的时,这时更新ConfigMap(或删掉重建ConfigMap),Pod内挂载的配置信息会热更新。这时可以增加一些监测配置文件变更的脚本,然后reload对应服务。

  • 相关阅读:
    day38 20-Spring与Junit整合
    day38 19-Spring整合web开发
    day38 18-Spring的XML和注解的结合使用
    day38 17-Spring的Bean的属性注入:注解方式
    day38 16-Spring的Bean的装配:注解的方式
    day38 15-Spring的配置文件引入的问题
    day38 14-Spring的Bean的属性的注入:集合属性的注入
    day38 13-Spring的Bean的属性的注入:SpEL注入
    day38 12-Spring的Bean的属性的注入:名称空间p
    SqlServer与.NET的数据类型映射关系图
  • 原文地址:https://www.cnblogs.com/zhenyuyaodidiao/p/6594410.html
Copyright © 2020-2023  润新知