Skip to content
Open Source

從應用程式範本部署

從 Zeabur Catalog 的範本挑一個應用程式,填好網域和必要欄位後部署到專案。

在專案選擇 新增 → 應用程式範本,挑一個應用程式,填好網域和必要欄位,按 檢查變更 後套用。範本來自這個 Zeabur 版本內建的 Zeabur Catalog,部署時不會連到外部下載範本。

  • 已有專案,並有建立服務的權限。範本的物件用你自己的權限建立,權限不夠的物件會在檢查變更時列出。
  • 範本需要的元件已經安裝,例如用 PostgreSQL 的範本需要 CloudNativePG。清單會在範本下方寫出 需要先安裝…。
  • 範本要公開網域時,準備一個指向叢集 Ingress 的網域。需要 HTTPS 的範本,Zeabur 要先指定憑證簽發者。

開啟 新增 → 應用程式範本。每個範本會寫出它的用途,以及需要多少 CPU 和記憶體。叢集剩下的記憶體或 CPU 不夠時,範本下方會提醒。可以在上方輸入名稱篩選。

範本需要的元件還沒安裝時,表單上方會寫出元件名稱,並附上 安裝… 按鈕。按下後會到 元件 頁面,照檢查並安裝叢集元件的步驟安裝,再回來部署。缺少元件時,檢查變更 不會繼續。

  • 公開網域:預設用範本名稱和專案名稱組成,可以改成自己的網域。
  • 部署前要知道的事:範本作者列出的已知風險和處理方式,預設收合,展開才看得到內容,目前只有英文。部署前先看一遍,例如首次啟動前誰能建立管理員帳號。
  • 其他欄位:名稱和說明會跟著介面語言顯示。標示 選填 的欄位可以留空。

密碼和金鑰會在你的瀏覽器產生,存進範本指定的機密,例如 Miniflux 的 miniflux-secrets。部署後,在用到這些值的服務的 環境變數 裡可以顯示它們。

按 檢查變更,確認要建立的物件後套用。會啟動的服務 會列出範本的服務、資料庫和網域,下方寫出尖峰時要用多少 CPU 和記憶體。同一個範本在這個專案已經部署過時,畫面會寫出已經存在的物件,要先刪掉它們,或改部署到別的專案。範本的物件都建立在這個專案的命名空間。

套用後,範本的服務和資料庫會出現在專案裡。打開各服務的 概覽,等副本就緒,再打開範本的公開網域,確認看到應用程式的頁面。

範本的每個物件,以及產生的密碼機密,都帶有三個標籤:app.kubernetes.io/instance 和 templates.zeabur.com/template 是範本 ID,app.kubernetes.io/version 是應用程式版本。用 kubectl 列出這次部署的物件:

kubectl -n shop get deploy,statefulset,svc,ingress,pvc,secret -l app.kubernetes.io/instance=miniflux

用到資料庫的範本,也要確認 operator 的物件已就緒,例如 kubectl -n shop get clusters.postgresql.cnpg.io -l app.kubernetes.io/instance=miniflux 的 STATUS 是 Cluster in healthy state。

Zeabur 用內建的 Zeabur Catalog 把範本轉成 YAML。轉換在 Zeabur 裡做,沒有對應的叢集物件,但你可以用 Catalog 的 catalog 指令得到同樣的 YAML,再用 kubectl 套用。

先查 Zeabur 用的 Catalog 版本:到 設定 的 關於,Zeabur Catalog 那一列是它的提交。在 Catalog 的原始碼切到這個提交,進入 nix develop 後執行:

umask 077
go run ./tools/cmd/catalog template inputs -namespace shop miniflux > secrets.json
go run ./tools/cmd/catalog template render -namespace shop \
-domain miniflux.example.com -cluster-issuer letsencrypt miniflux > plan.yaml
kubectl -n shop apply -f secrets.json
kubectl -n shop apply -f plan.yaml
  • template inputs 產生範本要的密碼和金鑰,每次執行都是新的值,只執行一次,之後升級沿用同一份機密。secrets.json 不要放進版本控制。
  • 範本有要你填的欄位時,把值寫成 JSON 物件,例如 Dify 的 {"storageRegion":"us-east-1", ...},用 -values inputs.json 傳入。欄位名稱在範本的 template.yaml 的 inputs。
  • 範本 requires 列出的元件要先裝好。

刪掉整個範本:

kubectl -n shop delete all,ingress,pvc,secret,configmap,networkpolicy -l app.kubernetes.io/instance=miniflux

資料庫等 operator 的物件也帶同樣的標籤,用 kubectl -n shop get <種類> -l app.kubernetes.io/instance=miniflux 找出來再刪。刪除磁碟區和資料庫會一起刪掉資料。

範本不會擋下整個專案的流量。誰能連進專案裡的 Pod,由專案的 zeabur-project 決定,見安全性。連出去的連線不擋,應用程式可以連到模型服務、Webhook、郵件伺服器和備份用的 S3。

想限制某個應用程式往外連,自己加一個 NetworkPolicy。下面的例子讓 Umami 只能查 DNS 和連它的資料庫:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: umami-egress
spec:
podSelector:
matchLabels:
templates.zeabur.com/template: umami
app.kubernetes.io/name: umami
policyTypes: [Egress]
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- {protocol: UDP, port: 53}
- {protocol: TCP, port: 53}
- to:
- podSelector:
matchLabels:
cnpg.io/cluster: umami-db
ports:
- {protocol: TCP, port: 5432}

用 kubectl apply -n <專案的命名空間> -f umami-egress.yaml 套用。podSelector 只選應用程式的 Pod,不要選到資料庫:資料庫要連 Kubernetes API 和備份用的 S3,擋掉後資料庫會停擺,備份也會失敗。

  • 名稱已存在:範本使用固定的物件名稱。同一個專案已經部署過同一個範本,或有同名的機密時,檢查變更會列出衝突。改在另一個專案部署。
  • 欄位格式不符:欄位下方會寫出它要的格式,照格式修改後再檢查。
  • 檢查變更說叢集不支援某種物件:範本需要的元件還沒裝好,或還在啟動。到 元件 頁面確認狀態。