設定環境變數
修改服務啟動時讀取的設定,或讓多個服務讀取同一組共用變數。
開啟服務的 環境變數,按 編輯,改完後從頁面下方 檢查變更 並套用。直接設定在服務上的變數會隨著新副本啟動而生效。如果值來自共用設定檔或機密,要到來源修改,並確認哪些服務需要重新啟動。
- 已有一個服務,並且有權修改它。如果服務標示由 Helm、Argo CD 或 Flux 管理,要回到原本的 values 或 Git 儲存庫修改。
- 知道應用程式需要的變數名稱和值,例如
APP_URL或LOG_LEVEL。這裡設定的是容器執行時的環境變數。從 Git 部署的建置變數在建置設定中修改。 - 密碼或 API 金鑰適合放在機密中。直接設定 的值會顯示在服務設定裡。共用變數選 Secret 後,只有有權讀取機密的人能顯示值。
修改這個服務的變數
Section titled “修改這個服務的變數”進入專案,選擇服務,再開啟 環境變數 → 編輯。在 直接設定 修改名稱或值,按 新增變數 加一列。有多個容器時,為新變數選擇要讀取它的容器。
在名稱欄貼上多行 NAME=value,可以一次新增多個變數。單一容器也可以切到 .env 編輯方式:
APP_URL=https://app.example.comLOG_LEVEL=info.env 編輯器支援引號、export 和 # 註解。從編輯內容拿掉原本的一行,會把該變數列為移除。
查看標成 新增、已修改 或 將移除 的列,再按頁面下方 檢查變更。確認容器、變數名稱及其他一起等待套用的設定,再套用這批變更。
直接修改變數會更新服務的 Pod template。Deployment、StatefulSet 這類持續執行的服務會用新設定替換副本。CronJob 則從下一次執行開始讀到新值。
確認應用程式讀到新設定
Section titled “確認應用程式讀到新設定”回到 概覽 等待副本就緒,再從應用程式的實際行為或 日誌 確認,例如新產生的連結是否使用新的 APP_URL。環境變數清單會顯示儲存後的設定。
尚未套用時,按 捨棄 可放棄這批草稿。已套用的變更,要把值改回去,再次檢查並套用。
修改來自設定檔或機密的值
Section titled “修改來自設定檔或機密的值”來自設定檔和機密 列出每個變數的來源。點來源名稱即可開啟編輯器。來源若是機密,按 顯示值 才會讀取目前的值。也可以直接填入新值,不必先顯示舊值。標成 二進位 的設定檔資料要用 YAML 修改。
先看編輯器上方的 讀取它的服務。例如 web 和 worker 都讀取 app-config,從 web 開啟編輯器後改值,兩個服務的來源都會改。把它掛成檔案的服務也會列在裡面。
修改鍵或按 新增鍵 後,送出檢查。從服務頁面開啟的來源編輯器會把修改加入該服務的草稿,仍要從頁面下方 檢查變更 並套用。從專案 設定 開啟同一個來源時,則會直接開啟變更檢查。
讓正在執行的服務讀到新值
Section titled “讓正在執行的服務讀到新值”改 ConfigMap 或 Secret 的內容後,已啟動的容器環境變數會保留舊值。變更檢查會列出需要重新啟動的服務,以及可能由 Reloader 自動重新啟動的服務。
- 手動處理時,對每個需要新值的服務執行 重新啟動,再檢查副本是否就緒。
- 要自動處理,進入服務 設定 → 運算資源,開啟 設定檔或機密變數變更時自動重新啟動,再檢查並套用。叢集要有正在執行的 Stakater Reloader,單獨開啟選項不會重新啟動服務。
- 開啟後,不論是在 Zeabur 還是用其他工具修改來源,服務都會重新啟動。如果讀取這個來源的服務都開了這個選項,它們會一起重新啟動。
看到 重新啟動前可能仍在使用舊的值,表示來源在某個副本啟動後才改過。展開提示可以看到是哪些副本。已經跑完的 Job 不會因為來源改了而重新執行。
建立共用變數並接到服務
Section titled “建立共用變數並接到服務”新增一組共用變數
Section titled “新增一組共用變數”進入專案 設定 的 共用變數,按 新增共用變數。輸入 名稱,在 值的保存方式 選 Secret 或 明文,再於 變數 每行輸入一個 NAME=value。
按 檢查變更,確認後按 建立。這一步只建立共用變數,服務還不會讀取它。
選擇服務要讀取的鍵
Section titled “選擇服務要讀取的鍵”回到服務的 環境變數,按 使用共用變數。選擇剛建立的那組變數。服務有多個容器時,也要選擇容器。
- 所有鍵:每個鍵都會成為環境變數,之後新增的鍵也會納入。
- 單一個鍵:選 鍵,再設定容器裡的 變數名稱,例如把
api-token讀成API_TOKEN。
這個側邊面板有自己的 檢查變更 和套用步驟,不會加入服務頁面下方的草稿。套用後,持續執行的服務會替換副本,新副本就會讀到這些變數。
確認讀取關係
Section titled “確認讀取關係”在服務的 來自設定檔和機密 確認來源名稱,再回到專案 設定 → 共用變數,確認 使用的服務 出現該服務。等新副本就緒後,再確認應用程式的設定。
用 kubectl 做同樣的事
Section titled “用 kubectl 做同樣的事”環境變數寫在工作負載的 Pod template 裡,共用變數是一般的 ConfigMap 或 Secret,Zeabur 沒有另外保存任何資料。以下以專案 demo、服務 web 為例。
直接設定和移除一個變數,等於修改容器的 env:
kubectl -n demo set env deployment/web NODE_ENV=productionkubectl -n demo set env deployment/web NODE_ENV-共用變數就是帶 zeabur.com/shared-variables: "true" 標籤的 ConfigMap 或 Secret。專案 設定 → 共用變數 依這個標籤列出它們:
apiVersion: v1kind: ConfigMapmetadata: name: app-config namespace: demo labels: zeabur.com/shared-variables: "true"data: APP_URL: https://app.example.com LOG_LEVEL: info---apiVersion: v1kind: Secretmetadata: name: app-secrets namespace: demo labels: zeabur.com/shared-variables: "true"type: OpaquestringData: api-token: change-me服務讀取共用變數的方式寫在容器上。所有鍵 是 envFrom,單一個鍵 是 env 的 valueFrom。設定檔或機密變數變更時自動重新啟動 是工作負載本身(不是 Pod template)的 annotation reloader.stakater.com/auto: "true",只有 Deployment、StatefulSet 和 DaemonSet 能開:
apiVersion: apps/v1kind: Deploymentmetadata: name: web namespace: demo labels: app.kubernetes.io/name: web annotations: reloader.stakater.com/auto: "true"spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: web template: metadata: labels: app.kubernetes.io/name: web spec: containers: - name: web image: nginxinc/nginx-unprivileged:1.29 env: - name: NODE_ENV value: production - name: API_TOKEN valueFrom: secretKeyRef: name: app-secrets key: api-token - name: LOG_LEVEL valueFrom: configMapKeyRef: name: app-config key: LOG_LEVEL - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name envFrom: - configMapRef: name: app-config只開關自動重新啟動,用 annotate 就好,它不會替換副本:
kubectl -n demo annotate deployment web reloader.stakater.com/auto=truekubectl -n demo annotate deployment web reloader.stakater.com/auto-改了共用來源、又沒有 Reloader 時,自己重新啟動讀取它的服務:
kubectl -n demo rollout restart deployment/web移除 Zeabur 之後,這些變數照樣由 Kubernetes 注入容器。Reloader 是獨立的元件,也會繼續依 annotation 重新啟動服務。
在 環境變數 分頁,直接設定的變數列在 直接設定,從共用變數讀來的列在 來自設定檔和機密,並寫出來源名稱。專案 設定 → 共用變數 的 使用的服務 會列出讀取它的服務。
用 kubectl 看 Pod template 裡的設定,和實際在容器裡的值:
kubectl -n demo get deployment web -o jsonpath='{.spec.template.spec.containers[0].env}'kubectl -n demo get configmap,secret -l zeabur.com/shared-variables=truekubectl -n demo exec deploy/web -- printenv NODE_ENVprintenv 印出新值,表示副本已經用新設定啟動。印出舊值時,等新副本就緒,或照上面的步驟重新啟動。
| 畫面或結果 | 接著處理 |
|---|---|
| 另一個變數已經用了這個名稱 或 設定檔、機密或 Kubernetes 已經設定了這個名稱 | 到該變數的來源修改,或換一個名稱。同一個容器裡的同名變數只會有一個值生效。 |
| 沒有 使用共用變數 | 先到專案 設定 建立至少一組共用變數。服務正在編輯變數或由其他工具管理時,也不會顯示這個按鈕。 |
| 你沒有讀取 Secret 的權限,所以值會隱藏。 | 顯示機密需要讀取 Secret 的權限,和修改服務的權限分開,見權限。 |
| 共用來源已改,應用程式仍使用舊值 | 重新啟動讀取它的服務。如果已開啟自動重新啟動,到服務 設定 → 運算資源 看 Reloader 是否在執行。 |
| 顯示變更已過期 | 重新檢查目前的來源和值,再套用新的變更。 |
停止讀取或清除設定
Section titled “停止讀取或清除設定”直接設定的變數可在 編輯 中按該列的移除按鈕,再檢查並套用。
整組匯入的變數,在來源列選 停止讀取,再檢查並套用。這會移除服務的讀取關係,保留共用來源。
只讀取單一鍵的變數,在來源旁選 移除變數,再檢查並套用。共用來源和其中所有的鍵都會保留,只移除服務上的這個變數。
要刪掉整組共用變數,先在專案 設定 → 共用變數 確認 使用的服務 已經清空,再到專案 物件 開啟對應的 ConfigMap 或 Secret,在 YAML 按 刪除,檢查後套用。如果還有服務讀取其中的鍵,之後啟動的副本會因為找不到這個來源而無法啟動。