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 檔案的内容,結果如下圖所示。