天天看點

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實作配置分離

繼續閱讀