[英]Can I create a kubernetes secret with the kubectl command using a .pfx certificate?
[英]Kubernetes: modify a secret using kubectl?
如何使用kubectl
修改 Kube.netes secret
中的值?
我使用kube.netes create secret generic
了秘密,但似乎沒有辦法修改秘密。 例如,向其中添加新的秘密值,或更改其中的秘密值。
我假設我可以 go '低級',然后編寫 yaml 文件並進行kubectl edit
,但我希望有更簡單的方法。
(我正在使用kube.netes 1.2.x
)
最直接(和交互)的方式應該是執行kubectl edit secret <my secret>
。 如果您想查看 Kubernetes 管理的機密列表,請運行kubectl get secrets
。
如果您更喜歡非交互式更新,這是一種方法:
kubectl get secret mysecret -o json | jq '.data["foo"]="YmFy"' | kubectl apply -f -
請注意, YmFy
是 base64 編碼的bar
字符串。 如果你想將值作為參數傳遞, jq
允許你這樣做:
kubectl get secret mysecret -o json | jq --arg foo "$(echo bar | base64)" '.data["foo"]=$foo' | kubectl apply -f -
我更喜歡使用jq
但如果您更喜歡 yaml 格式, yq
也應該完成這項工作。
當我發現自己需要修改一個秘密時,我來到了這里。
這是我發現的用於編輯(單行)機密的最方便的方法。
這詳細說明了上面 Timo Reimann 的kubectl edit secret <my secret>
。
kubectl edit secret <my secret>
將(在我的情況下)調用 vi。
現在,我將光標移動到要編輯的密碼的冒號后面的空間。
然后我按下r
和[enter]
,這會將 base64 編碼的值放到它自己的一行上。
現在我輸入:. ! base64 -D
:. ! base64 -D
:. ! base64 -D
將解碼當前行。
對值進行更改后,我輸入:. ! base64
:. ! base64
:. ! base64
將對更改的值進行編碼。
按k
[shift]J
將重新加入秘密名稱及其新值。
:wq
將寫入新的秘密文件並退出 vi。
PS如果秘密有一個多行值,打開行號( :set nu
),並在更改解碼值后,使用A,B ! base64
A,B ! base64
其中 A 和 B 是值的第一行和最后一行的行號。
PPS我剛剛學到了base64
將接收文本以附加換行符進行編碼的艱難方式:(如果這對您的值沒有問題-很好。否則我當前的解決方案是使用以下方法過濾掉它: .!perl -pe chomp | base64
源自“Skeeves”的答案:
Base64 編碼您的值:
echo -n 'encode_My_Password' | base64
在編輯模式下打開秘密:
kubectl edit secret my-secret
默認編輯器將打開,替換現有鍵的值或使用編碼值添加新行和新鍵。 保存並關閉文件。 更新的值或新的鍵值對現已添加到密鑰中。
從命令行最簡單的方法:
echo "This is my secret" | base64 | read output;kubectl patch secret my_secret_name -p="{\"data\":{\"secret_key\": \"$output\"}}" -v=1
它將編碼 value This is my secret
,並通過添加secret_key
密鑰和編碼值作為該秘密中的最后一個鍵值對來更新您的my_secret_name
秘密。
我為此實現了一個kubectl
插件。
使用 krew 安裝
kubectl krew update
kubectl krew install modify-secret
運行它
kubectl modify-secret xyz -n kube-system
演示
查看所有這些答案后,根據我的需要,最好的解決方案是刪除並重新創建:
kubectl delete secret generic
kubectl create secret generic # or whatever ..
如果您想以艱難的方式做到這一點:
edit
更改docker-registry
密碼我來這個問題是為了修改“docker-registry”風格的秘密。
簡單地使用kubectl edit secret
編輯它似乎令人擔憂,因為我不知道秘密值是什么樣的。
我使用kubectl create secret docker-registry generic-registry-secret --docker-server=docker.server --docker-username='my-cloud-usernname' --docker-password='my-auth-token' --docker-email='my@email.com'
這樣的命令創建了它kubectl create secret docker-registry generic-registry-secret --docker-server=docker.server --docker-username='my-cloud-usernname' --docker-password='my-auth-token' --docker-email='my@email.com'
我本可以對其進行編輯,在查看了此處的其他各種答案后,我想出了如何做到這一點-我將我的筆記包括在此處,以防它們對其他人有所幫助。
列出秘密: kubectl get secrets
特定秘密的詳細信息: kubectl describe secrets/generic-registry-secret
獲取秘密值: kubectl get secret generic-registry-secret -o jsonpath={.data}
解碼秘密值:首先獲取“map[.dockerconfigjson:”和“]”之間的所有內容,然后執行:
echo "x9ey_the_secret_encoded_value_here_X0b3=" | base64 --decode
然后,我可以從中獲取我正在尋找的特定身份驗證令牌值,並將其替換為新值。 然后通過| base 64
運行新的完整字符串 | base 64
來獲得 base 64 編碼,現在我終於可以自信地使用kubectl edit secret generic-registry-secret
更改值並輸入新的正確值。
但是刪除並重新創建是更簡單的選擇。
參考 :
我發現的最快方法:
# You need a version of micro that includes this commit https://github.com/zyedidia/micro/commit/9e8d76f2fa91463be660737d1de3bff61258c90d
kubectl get secrets my-secret -o json | jq -r .data.config | base64 -d | micro | base64 -w 0 | xclip -selection clipboard && kubectl edit secrets my-secret
並使用可以放入個人資料的 bash 函數:
function ks-edit { kubectl -n $1 get secrets $2 -o json | jq -r '.data."'$3'"' | base64 -d | micro | base64 -w 0 | xclip -selection clipboard && kubectl -n $1 edit secrets $2; }
你可以這樣稱呼它:
ks-edit <namespace> <secret> <key>
我強烈推薦使用k9s (不僅為此目的,而且作為輕量級的 k8s CLI 管理工具)。
正如您在下面看到的(忽略所有白色矩形),當您在終端上設置集群的上下文時,您只需鍵入k9s
,您將點擊一個不錯的終端,您可以在其中檢查所有集群資源。
只需鍵入":"
並輸入將出現在屏幕中間的資源名稱(在本例中為秘密)。
然后您可以使用向上和向下箭頭選擇一個密鑰並輸入e
進行編輯(綠色箭頭):
將新密鑰添加到現有密鑰。
kubectl patch secret $SECRET_NAME --type=json \
-p='[{
"op" : "add" ,
"path" : "/data/'$KEY'" ,
"value" : "'$(base64 <<< "$VALUE")'"
}]'
更新密鑰中的現有密鑰
kubectl patch secret $SECRET_NAME --type=json \
-p='[{
"op" : "replace" ,
"path" : "/data/'$KEY'" ,
"value" : "'$(base64 <<< "$VALUE")'"
}]'
我只能在文檔中找到replace
操作,沒有提到add
操作。 但是,它看起來符合RFC 6902 ,所以我使用add
進行了測試,它工作正常。 我希望 RFC 6902 定義的其他操作也能正常工作,盡管我還沒有測試過它們。
到目前為止,最簡單的方法是為每個秘密維護一個本地.env
文件。
例如
MY_SECRET=something
PASSWORD=anotherthing
趕緊跑
kubectl create secret generic <name> --from-env-file=.env
當你需要改變它時——只需刪除它並再次運行上面的命令。
不要亂用base64
在編輯之前總是獲取秘密的副本 - kubectl get secrets <your-secret-name> -n <namespace> -o yaml > mysecret.yaml
現在你可以編輯運行編輯命令來編輯你的秘密 - kubectl edit secrets <your-secret-name> -n <namespace>
或者你可以復制你的mysecret.yaml
文件並退出其中的秘密並運行 -
kubectl apply -f mysecret.yaml
確保您使用 base64 進行解碼和編碼,以分別查看和添加秘密。
這是我的一個班輪:
$ kubectl get secrets/my-secret -o yaml | yq '.dataStrings = (.data | map_values(@base64d)) | del(.data)' | vipe | yq '.data = (.dataStrings | map_values(@base64)) | del(.dataStrings)' | kubectl apply -f -
如果您想知道如何使用k9s
執行此操作,我將在此處添加有關如何逐步執行此操作的說明:
從這里安裝 krew https://krew.sigs.k8s.io/docs/user-guide/setup/install/ (如果您已經安裝,請跳過此步驟)
安裝修改秘密插件:
kubectl krew install modify-secret
運行以下命令或將其添加到~/.zshrc
或~/.bashrc
:
export XDG_CONFIG_HOME=~/
將以下內容添加到 ~/k9s/plugin.yml
plugin:
edit-secret:
shortCut: Ctrl-X
confirm: false
description: "Edit Decoded Secret"
scopes:
- secrets
command: kubectl
background: false
args:
- modify-secret
- --namespace
- $NAMESPACE
- --context
- $CONTEXT
- $NAME
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.