kran 文件

kran exec

用法kran exec [-i|--interactive] [--] COMMAND...

挑一個符合 app.selector 且正在執行的 pod,在裡面跑指令。

選項

選項 說明
-i--interactive 配一個終端機(kubectl exec -it
-d NAME config/kran.NAME.yml 疊到 config/kran.yml
--dry-run 只印出指令,不執行

實際執行的指令

$ kran exec bin/rails db:migrate --dry-run
pod=$(KUBECONFIG=/home/dana/.kube/prod-east.yml kubectl --context prod-east --namespace storefront get pods -l app=storefront --field-selector status.phase=Running -o 'jsonpath={.items[0].metadata.name}') && test -n "$pod" || { echo 'No running pod matches app=storefront' >&2; exit 1; }
KUBECONFIG=/home/dana/.kube/prod-east.yml kubectl --context prod-east --namespace storefront exec "$pod" -- bin/rails db:migrate

第一行是去問 API 要「第一個符合 selector 且階段是 Running 的 pod」,因為 PendingTerminatingCrashLoopBackOff 的 pod 沒辦法接受 exec。

加上 -i 時第二行會變成 kubectl exec -it "$pod" -- ...;設了 app.container 則會多出 -c <container>

指令本身帶旗標時

$ kran exec -- bin/rails runner -e production 'puts Rails.env' --dry-run
... exec "$pod" -- bin/rails runner -e production 'puts Rails.env'

指令自己有旗標時,前面補一個單獨的 -- kran 會先解析自己的選項,少了 ---e 就會被 當成 kran 的選項而被拒絕。

$ kran exec
ERROR: exec needs a command to run, for example `kran exec bin/rails db:migrate`
$ kran exec bin/rails db:migrate
No running pod matches app=storefront

會選到哪一個 pod

API 回傳的第一個符合條件的 pod,沒有排序保證。要指定特定 pod 的話,從 kran details 拿名稱, 再直接用 kubectl exec

shell 與 console

模板裡的兩個別名就是一般的 kran exec,分別展開成 exec --interactive bashexec --interactive bin/rails console。見別名