[英]kubectl patch secret with bash gcloud identity-token, heredoc and printf
我想創建一個簡單的 k8s cronjob 來保持 gcp 身份令牌的新鮮度。
一個我無法解決的相對簡單的問題
給定的
kubectl patch secret token-test --type json -p=<< END
[
{
"op": "replace",
"path": "/data/token.jwt",
"value": "$(gcloud auth print-identity-token | base64 )"
}
]
END
我希望將其與kubectl patch secret token-test --type json -p=$(printf "'%s'" "$json")
我嘗試了很多變體,奇怪的是,如果我粘貼 printf 的 heredoc 插入的結果,它會起作用。 但是我所有的努力都失敗了(也在一行上嘗試了一個 json 文檔)
$ kubectl patch secret token-test --type json -p=$(printf "'%s'" "$json")
error: unable to parse "'[{": yaml: found unexpected end of stream
而這實際上有效:
printf "'%s'" "$json"|pbcopy
kubectl patch secret sudo-token-test --type json -p '[{ "op": "replace","path": "/data/token.jwt","value": "ZX...Zwo="}]'
secret/token-test patched
當它失敗時,我無法理解有什么不同。 我知道 bash 在處理字符串時有點棘手,但我不確定這是 bash 問題還是 kubectl 中的問題。
$ json='[{ "op": "replace","path": "/data/token.jwt","value": "'"$(gcloud auth print-identity-token | base64 )"'"}]'
$ kubectl patch secret token-test --type json -p="$json"
secret/token-test patched
通過在heredoc中附加插入的字符串,這解決了。 仍然不知道為什么其他方法失敗了
這是一種稍微不同的方法,但是,怎么樣:
printf "foo" > test
kubectl create secret generic freddie \
--namespace=default \
--from-file=./test
kubectl get secret/freddie \
--namespace=default \
--output=jsonpath="{.data.test}" \
| base64 --decode
foo
X="$(printf "bar" | base64)"
kubectl patch secret/freddie \
--namespace=default \
--patch="{\"data\":{\"test\":\"${X}\"}}"
kubectl get secret/freddie \
--namespace=default \
--output=jsonpath="{.data.test}" \
| base64 --decode
bar
請注意,以這種方式使用您的用戶 (
gcloud auth print-identity-token
) 憑據不是最佳做法。 首選服務帳戶。 服務帳戶旨在用於機器(而不是人工)身份驗證,它們可以更輕松地撤銷。用戶憑據授予持有者用戶帳戶的所有權力(這可能是廣泛的)。
有一種可移植的替代方法,您可以在其中從服務帳戶密鑰創建 Kubernetes 機密:
kubectl create secret generic your-key \\ --from-file=your-key.json=/path/to/your-key.json
有一個很酷的孩子,他們主要使用 GKE 方法,稱為Workload Identity
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.