我們時常會使用環境變數來讓Pod區分當前的環境為Production或Stagging,以及使用環境變數來帶入連接資料庫的各種資訊,像是Host、User、Password等等。
設定環境變數的方法有很多種,可以使用Docker的方法(CLI、Docker Compose、Dockerfile),或是使用Linux的作法(export)等等。
那在使用Kubernetes時,要怎麼讓Container使用我們所設定的環境變數呢?
kubectl run --env:類似於Docker的作法,要調整時較為麻煩。
kubectl run envar-demo --image gcr.io/google-samples/node-hello:1.0 --env DEMO_GREETING="Hello from the environment" -l purpose=demonstrate-envars
YAML中設置env:在env中,以key-value形式設置環境變數。
kind: Pod
metadata:
name: envar-demo
labels:
purpose: demonstrate-envars
spec:
containers:
- name: envar-demo-container
image: gcr.io/google-samples/node-hello:1.0
env:
- name: DEMO_GREETING
value: "Hello from the environment"
- name: DEMO_FAREWELL
value: "Such a sweet sorrow"
ConfigMap & Secret:兩者很相似,但是Secret的值必須經過Base64編碼,這部分明天來詳談。
apiVersion: v1
kind: Pod
metadata:
name: envar-demo
labels:
purpose: demonstrate-envars
spec:
containers:
- name: envar-demo-container
image: gcr.io/google-samples/node-hello:1.0
env:
- name: DEMO_GREETING
valueFrom:
secretKeyRef:
name: mysecret
key: DEMO_GREETING
optional: false # 此職為默認值,意思是"mysecret"
# 必須存在且包含"DEMO_GREETING"這個key
- name: DEMO_FAREWELL
valueFrom:
configMapKeyRef:
name: myconfigmap
key: DEMO_FAREWELL
直接將Pod的資訊當作環境變數:這樣如果事先無法確認會被部署到哪個Node、被分配什麼IP,就可以透過這種方式取得。
apiVersion: v1
kind: Pod
metadata:
name: envar-demo
labels:
purpose: demonstrate-envars
spec:
containers:
- name: envar-demo-container
image: gcr.io/google-samples/node-hello:1.0
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
明天會來詳談ConfigMap與Secret~