簡體   English   中英

Kube.netes:使用 kubectl 修改秘密?

[英]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-modify-secret 插件

最簡單的方法:刪除並重新創建秘密

查看所有這些答案后,根據我的需要,最好的解決方案是刪除並重新創建:

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>

在使用 kubectl 編輯機密之前...

我強烈推薦使用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執行此操作,我將在此處添加有關如何逐步執行此操作的說明:

  1. 從這里安裝 krew https://krew.sigs.k8s.io/docs/user-guide/setup/install/ (如果您已經安裝,請跳過此步驟)

  2. 安裝修改秘密插件:

    kubectl krew install modify-secret

  3. 運行以下命令或將其添加到~/.zshrc~/.bashrc

    export XDG_CONFIG_HOME=~/

  4. 將以下內容添加到 ~/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM