kran 文件

指令

指令 kamal 執行
kran init kamal init 產生 config/kran.yml
kran deploy kamal deploy docker logindocker build --pushkrane render \| krane deploy
kran build push kamal build push docker logindocker build --push
kran build details kamal build details docker versiondocker buildx ls
kran logs kamal app logs kubectl logs -l <selector> --prefix --timestamps
kran exec kamal app exec kubectl get pods,再 kubectl exec
kran shell kamal shell kran exec --interactive bash 的別名
kran console kamal console kran exec --interactive bin/rails console 的別名
kran details kamal details kubectl get all -o wide
kran audit kamal audit kubectl rollout history deployment -l <selector>
kran version kamal version docker --versionkrane versionkubectl version --client

全域選項

每個指令都收這兩個。

選項 意義
-d NAME--destination NAME config/kran.NAME.yml 深層合併到 config/kran.yml
--dry-run 印出會執行的每一行指令,但一行都不跑

--dry-run 同時跳過工具是否安裝的檢查,密碼會顯示成 printf '%s' '[REDACTED]' | docker login ...

所有指令的共通行為

每個 kubectl 指令都長成 KUBECONFIG=<kubeconfig> kubectl --context <context> --namespace <namespace> ...,值由 config/kran.yml 帶進去。kran 不會去動你 shell 選好的 context。

所有外部指令都在 Bundler.with_unbundled_env 裡跑。kran 常常是透過 bundle exec 啟動的,而 krane 和 ejson 本身也是 Ruby 程式;少了這層隔離,它們會繼承 RUBYOPTBUNDLE_GEMFILE,根本起不來。

工具在跑第一行指令之前就檢查完,所以不會發生「image 推上去了、卻沒部署成功」這種事。

kamal 有但 kran 沒有的指令

kamal 管的是一台主機的生命週期,在 Kubernetes 上那些是叢集和模板的事: