kran 文件

kran

用最簡單的方式,透過 krane 把應用部署到 Kubernetes。 一行指令搞定 build image、push、render krane 模板並部署。

Kran 是德文的「起重機」,也就是 Shopify 的 krane 這個字的由來。

kran 和 krane 是兩個不同的工具。 krane 是 Shopify 的部署工具,真正做事的是它;kran 是這個 gem,負責驅動它。兩者只差一個字母,看指令的時候請留意。

手動用 krane 部署

$ export DOCKER_HOST=ssh://builder@build.internal
$ export KUBECONFIG=$HOME/.kube/prod-east.yml

$ echo "$GITHUB_TOKEN" | docker login ghcr.io -u acme-deploy \
>   --password-stdin
Login Succeeded

$ docker build --platform linux/amd64 --push \
>   -t ghcr.io/acme/storefront:$(git rev-parse HEAD) .
pushed ghcr.io/acme/storefront:9c1f4d0b7a2e58c3d6f1b8a4e70925d3c8b1a6f2

$ krane render -f config/deploy --current-sha $(git rev-parse HEAD) \
>   | krane deploy storefront prod-east \
>       -f config/deploy/secrets.ejson -
Deploying resources
Successfully deployed 4 resources

上面每一個值,描述的都是這個專案本身:用哪個 registry、在哪台機器建置、目標平台、kubeconfig、 namespace、context、模板目錄。它們跟部署的流程無關,卻每次都得重打一遍。

改用 kran

把這些設定寫進 config/kran.yml,然後只要一行指令:

# kran 會把每一步先印出來再執行
$ kran deploy
printf '%s' '[REDACTED]' | docker login ghcr.io -u acme-deploy --password-stdin
docker build --platform linux/amd64 --push -t ghcr.io/acme/storefront:9c1f4d0b7a2e58c3d6f1b8a4e70925d3c8b1a6f2 .
krane render -f config/deploy --current-sha 9c1f4d0b7a2e58c3d6f1b8a4e70925d3c8b1a6f2 --bindings image=ghcr.io/acme/storefront:9c1f4d0b7a2e58c3d6f1b8a4e70925d3c8b1a6f2 | krane deploy storefront prod-east -f config/deploy/secrets.ejson -

一樣的 docker、一樣的 krane、一樣的模板。tag 取自 git sha,完整的 image 位址則以 image 這個變數 傳進 krane 模板。

平常會用到的指令:

kran logs -f
kran exec bin/rails db:migrate

# namespace 內的所有資源,以及 rollout 歷史
kran details
kran audit

# 定義在 config/kran.yml 裡的別名
kran shell
kran console

shellconsole 分別展開成 exec --interactive bashexec --interactive bin/rails console

用過 kamal 的話會覺得一樣簡單:熟悉的指令名稱、一個設定檔、一行指令部署, 只是目標從主機換成叢集。

它不是抽象層

kran 不產生 manifest、不發明資源型別、也不存任何狀態,只是把 dockerkranekubectl 的指令 組出來執行。

每個指令都支援 --dry-run,會完整印出將要執行的指令,但一行都不跑。