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