• Kubernetes基于ConfigMap实现配置分离


    2 使用ConfigMap

    2.1 通过环境变量的方式使用ConfigMap

    2.1.1 使用单个ConfigMap中的数据定义容器环境变量

    配置文件:创建一个名称为 single-cm-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了一个名称为 env-cm 的ConfigMap,并把其中的 DEPLOYMENT_ENV:test 配置项以环境变量的形式传给名称为 single-cm-deployment 的 Deployment。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: env-cm
    data:
      DEPLOYMENT_ENV: test
      
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: single-cm-deployment
      labels:
        app: single-cm
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: single-cm
      template:
        metadata:
          labels:
            app: single-cm
        spec:
          containers:
            - name: test-container
              image: my-app:latest
              imagePullPolicy: IfNotPresent
              args: ["--spring.profiles.active=$(DEPLOYMENT_ENV_KEY)"]
              ports:
                - containerPort: 8080
              env:
                - name: DEPLOYMENT_ENV_KEY
                  valueFrom:
                    configMapKeyRef:
                      name: env-cm
                      key: DEPLOYMENT_ENV

    部署配置:执行以下命令即可使用该部署文件进行部署。

    kubectl apply -f single-cm-demo.yaml

    部署结果:该 Deployment 中接收一个名称为 spring.profiles.active 的命令行参数,而传给该命令行参数的值则为名称为 DEPLOYMENT_ENV_KEY 的环境变量的值,即实际传的值为 test,由于该配置文件中使用的镜像 my-app:latest 是一个Spring Boot 程序应用,所以通过这个环境变量即是指定使用 test 配置环境来启动该应用时。\

    2.1.2 使用多个ConfigMap中的数据定义容器环境变量

    部署文件:创建一个名称为 multi-cm-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了两个名称分别为 app-cm 和 log-cm 的ConfigMap,并把其中的 APPLICATION_NAME: smart-classroom 配置项 和 LOG_LEVEL: INFO 配置项以环境变量的形式传给名称为 multi-cm-deployment 的 Deployment。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: app-cm
    data:
      APPLICATION_NAME: SMART-CLASSROOM
    
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: log-cm
    data:
      LOG_LEVEL: INFO
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: multi-cm-deployment
      labels:
        app: multi-cm
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: multi-cm
      template:
        metadata:
          labels:
            app: multi-cm
        spec:
          containers:
            - name: test-container
              image: busybox:latest
              imagePullPolicy: IfNotPresent
              command: [ "/bin/sh", "-c", "echo $(APPLICATION_NAME_KEY) $(LOG_LEVEL_KEY)" ]
              env:
                - name: APPLICATION_NAME_KEY
                  valueFrom:
                    configMapKeyRef:
                      name: app-cm
                      key: APPLICATION_NAME
                - name: LOG_LEVEL_KEY
                  valueFrom:
                    configMapKeyRef:
                      name: log-cm
                      key: LOG_LEVEL

    部署配置:执行以下命令即可使用该部署文件进行部署。

    kubectl apply -f multi-cm-demo.yaml

    部署结果:该 Deployment 会在创建的 POD 内部的日志中打印出名称分别为 APPLICATION_NAME_KEY 和 LOG_LEVEL_KEY 的环境变量的值,即会打印出以下结果。

    SMART-CLASSROOM INFO

    2.1.3 将ConfigMap中的所有键值对配置为容器环境变量

    部署文件:创建一个名称为 one-cm-multi-key-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了一个名称为 db-cm 的 ConfigMap,并把其中的所有配置项以环境变量的形式传给名称为 one-cm-multi-key-deployment 的 Deployment。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: db-cm
    data:
      HOST: 127.0.0.1
      PORT: "3306"
      USERNAME: admin
      PASSWORD: "123456"
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: one-cm-multi-key-deployment
      labels:
        app: one-cm-multi-key
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: one-cm-multi-key
      template:
        metadata:
          labels:
            app: one-cm-multi-key
        spec:
          containers:
            - name: test-container
              image: busybox:latest
              imagePullPolicy: IfNotPresent
              command: [ "/bin/sh", "-c", "env" ]
              envFrom:
                - configMapRef:
                    name: db-cm

    部署配置:执行以下命令即可使用该部署文件进行部署

    kubectl apply -f one-cm-multi-key-demo.yaml

    部署结果:该 Deployment 会在创建的 POD 内部的日志中打印出所有环境变量的名称和值,即打印结果中会包含以下内容。

    HOST=127.0.0.1
    PORT=3306
    USERNAME=admin
    PASSWORD=123456

    2.2 通过挂载的方式使用ConfigMap

    2.2.1 不指定挂载的文件路径

    部署文件:创建一个名称为 mount-no-path-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了一个名称为 mount-no-path-cm 的 ConfigMap,并把其中的所有配置项以挂载的形式挂载到了名称为 mount-no-path-deployment 的 Deployment的 /etc/config 目录下,即在 /etc/config 目录下会生成一个 log.config 文件和一个 db.config 文件。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mount-no-path-cm
    data:
      log.config: |
        LOG_LEVER: INFO
        LOG_FILE: /var/logs/test.log
      db.config: |
        HOST: 127.0.0.1
        PORT: "3306"
        USERNAME: admin
        PASSWORD: "123456"
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mount-no-path-deployment
      labels:
        app: mount-no-path
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mount-no-path
      template:
        metadata:
          labels:
            app: mount-no-path
        spec:
          containers:
            - name: test-container
              image: busybox:latest
              imagePullPolicy: IfNotPresent
              command: [ "/bin/sh", "-c", "/bin/sh", "-c", "ls /etc/config/ && echo --- && cat /etc/config/log.config && echo --- && cat /etc/config/db.config" ]
              volumeMounts:
                - name: mount-no-path-volume
                  mountPath: /etc/config
          volumes:
            - name: mount-no-path-volume
              configMap:
                name: mount-no-path-cm
    部署结果:该 Deployment 会在创建的 POD 内部的日志中打印出 /etc/config 目录下的所有文件和子目录列表,
    并且会打印出 /etc/config/log.config 文件和 /etc/config/db.config 文件的内容,结果如下图所示。

    2.2.2 指定挂载的文件路径

    部署文件:创建一个名称为 mount-path-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了一个名称为 mount-path-cm 的 ConfigMap,并把其中的两个配置项以挂载的形式分别挂载到了名称为 mount-no-path-deployment 的 Deployment的 /etc/config 目录下的 log/log.config 文件和 db/db.config 文件,即在 /etc/config 目录下会生成一个 log/log.config 文件和一个 db/db.config 文件。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mount-path-cm
    data:
      log.config: |
        LOG_LEVER: INFO
        LOG_FILE: /var/logs/test.log
      db.config: |
        HOST: 127.0.0.1
        PORT: "3306"
        USERNAME: admin
        PASSWORD: "123456"
      
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mount-path-deployment
      labels:
        app: mount-path
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mount-path
      template:
        metadata:
          labels:
            app: mount-path
        spec:
          containers:
            - name: test-container
              image: busybox:latest
              imagePullPolicy: IfNotPresent
              command: [ "/bin/sh", "-c", "ls /etc/config/ && echo --- && cat /etc/config/log/log.config && echo --- && cat /etc/config/db/db.config" ]
              volumeMounts:
                - name: mount-path-volume
                  mountPath: /etc/config
          volumes:
            - name: mount-path-volume
              configMap:
                name: mount-path-cm
                items: 
                - key: log.config
                  path: log/log.config
                - key: db.config
                  path: db/db.config

    部署配置:执行以下命令即可使用该部署文件进行部署。

    kubectl apply -f mount-path-demo.yaml

    部署结果:该 Deployment 会在创建的 POD 内部的日志中打印出 /etc/config 目录下的所有文件和子目录列表,并且会打印出 /etc/config/log/log.config 文件和 /etc/config/db/db.config 文件的内容,结果如下图所示。

    摘自

    https://blog.csdn.net/weixin_44516305/article/details/105774171

  • 相关阅读:
    placeholder在ie浏览器里不显示的问题解决
    条件注释判断浏览器版本<!--[if lt IE 9]>
    在CSS中,BOX的Padding属性的数值赋予顺序为
    PhpStorm的注册码、Key
    关于【bootstrap modal 模态框弹出瞬间消失的问题】
    python 常见算法
    scrapy 爬虫基础
    python中的小知识点
    python 数据结构简介
    前端插件定制--表头和表内容
  • 原文地址:https://www.cnblogs.com/fengjian2016/p/15930663.html
Copyright © 2020-2023  润新知