使用 Init 容器定義環境變數值
Kubernetes v1.34 [alpha]
(預設停用)本頁面展示瞭如何透過檔案為 Pod 中的容器配置環境變數。
準備工作
你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在本教程中,在至少兩個不充當控制平面主機的節點組成的叢集上執行。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 遊樂場之一
你的 Kubernetes 伺服器版本必須是 v1.34。
要檢查版本,請輸入 kubectl version
。
設計工作原理
在本練習中,你將建立一個 Pod,它從檔案中獲取環境變數,並將這些值投影到正在執行的容器中。
apiVersion: v1
kind: Pod
metadata:
name: envfile-test-pod
spec:
initContainers:
- name: setup-envfile
image: nginx
command: ['sh', '-c', 'echo "DB_ADDRESS=address\nREST_ENDPOINT=endpoint" > /data/config.env']
volumeMounts:
- name: config
mountPath: /data
containers:
- name: use-envfile
image: nginx
command: [ "/bin/sh", "-c", "env" ]
env:
- name: DB_ADDRESS
valueFrom:
fileKeyRef:
path: config.env
volumeName: config
key: DB_ADDRESS
optional: false
restartPolicy: Never
volumes:
- name: config
emptyDir: {}
在此清單中,你可以看到 `initContainer` 掛載了一個 `emptyDir` 卷,並將環境變數寫入其中的檔案,而常規容器透過 `fileKeyRef` 欄位引用檔案和環境變數鍵,而無需掛載卷。當 `optional` 欄位設定為 false 時,`fileKeyRef` 中指定的 `key` 必須存在於環境變數檔案中。
該卷將僅掛載到寫入檔案的容器 (`initContainer`),而消耗環境變數的使用者容器將不會掛載該卷。
環境檔案格式遵循 Kubernetes 環境檔案標準。
在容器初始化期間,kubelet 從 `emptyDir` 卷中指定的檔案中檢索環境變數,並將其暴露給容器。
注意
所有容器型別(initContainer、常規容器、sidecar 容器和臨時容器)都支援從檔案載入環境變數。
雖然這些環境變數可以儲存敏感資訊,但 `emptyDir` 卷無法提供與專用 Secret 物件相同的保護機制。因此,透過此功能將機密環境變數暴露給容器不被視為安全最佳實踐。
建立 Pod
kubectl apply -f https://k8s.io/examples/pods/inject/envars-file-container.yaml
驗證 Pod 中的容器是否正在執行
# If the new Pod isn't yet healthy, rerun this command a few times.
kubectl get pods
檢查容器日誌中的環境變數
kubectl logs dapi-test-pod -c use-envfile | grep DB_ADDRESS
輸出顯示了選定環境變數的值
DB_ADDRESS=address
環境變數檔案語法
Kubernetes 環境變數檔案的格式源自 `.env` 檔案。
在 shell 環境中,`.env` 檔案通常使用 `source .env` 命令載入。
對於 Kubernetes,定義的環境變數檔案格式遵循更嚴格的語法規則
空行:空行將被忽略。
前導空格:所有行上的前導空格都將被忽略。
變數宣告:變數必須宣告為 `VAR=VAL`。 `=` 周圍的空格和尾隨空格將被忽略。
VAR=VAL → VAL
註釋:以 # 開頭的行被視為註釋並被忽略。
# comment VAR=VAL → VAL VAR=VAL # not a comment → VAL # not a comment
行繼續:變數宣告行末尾的反斜槓 (
\
) 表示值在下一行繼續。這些行將用一個空格連線。VAR=VAL \ VAL2 → VAL VAL2
下一步
- 瞭解更多關於環境變數的資訊。
- 閱讀 為容器定義環境變數
- 閱讀 透過環境變數向容器公開 Pod 資訊