天天看点

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 文件的内容,结果如下图所示。      
Kubernetes基于ConfigMap实现配置分离

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 文件的内容,结果如下图所示。

Kubernetes基于ConfigMap实现配置分离

继续阅读