K8s 配置之ConfigMap

作者: AlienPaul | 来源:发表于2020-02-04 16:14 被阅读0次

    简介

    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

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

    相关文章

      网友评论

        本文标题:K8s 配置之ConfigMap

        本文链接:https://www.haomeiwen.com/subject/pwwrxhtx.html