kubernetes:使用cli修改秘密?

gab*_*bor 24 kubernetes kubernetes-secrets

如何secret使用cli 修改秘密中的值?

我创建了秘密kubectl,但似乎没有办法修改秘密.例如,向其添加新的秘密值,或更改其中的秘密值.

我假设我可以去'低级',并编写yaml文件并做一个kubernetes create secret generic但我希望有一个更简单的方法.

(我正在使用kubectl edit)

Tim*_*ann 23

最直接(和交互式)的方式应该是执行kubectl edit secret <my secret>.kubectl get secrets如果您想查看Kubernetes管理的秘密列表,请运行.

  • `echo -n"admin"| base64`并将结果添加到.yaml文件中(命令`kubectl edit`) (11认同)
  • ...如果要直接编辑base64编码数据. (5认同)
  • 对不起,只是为了澄清,你的答案是"没有没有这样的方式",对吧? (3认同)

Ske*_*eve 13

当我发现自己需要修改秘密时,我就来到了这里。

这是我发现的用于编辑(单行)机密的最方便的方法。

这在kubectl edit secret <my secret>上面的Timo Reimann 上进行了详细说明。

kubectl edit secret <my secret> (以我为例)将调用vi。

现在,将光标移动到要编辑的秘密冒号后面的空间。

然后按r[enter]这会将base64编码的值放在其自己的一行上。

现在,我输入:. ! base64 -D将解码当前行。

更改值后,我输入:. ! base64将对更改后的值进行编码。

按下k [shift]J将重新加入秘密名称及其新值。

:wq 将写入新的secretfile并退出vi。

PS如果密钥具有多行值,请打开行号(:set nu),并在更改解码值后使用A,B ! base64其中A和B是值的第一行和最后一行的行号。

PPS我刚刚学习了一种很难的方法,base64可以用附加的换行符来接收文本进行编码:(如果这对您的值没有问题-很好。否则,我当前的解决方案是使用以下方法将其过滤掉:.!perl -pe chomp | base64

  • 为了重新编码多行秘密,我建议 vim 视觉模式和 `. !base64 -w0`。 (2认同)

kri*_*ris 12

最简单的方法:删除并重新创建秘密

查看所有这些答案后,根据我的需要,最好的解决方案是删除并重新创建:

kubectl delete secret generic
kubectl create secret generic # or whatever .. 
Run Code Online (Sandbox Code Playgroud)

如果你想以困难的方式做到这一点:

用于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 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

然后我可以从中获取我正在寻找的特定身份验证令牌值,并将其替换为新的。然后通过 a 运行新的完整字符串以| base 64获得 Base 64 编码,现在我终于可以自信地通过使用更改值kubectl edit secret generic-registry-secret并放入新的正确值。

但删除并重新创建是更简单的选择。


参考 :


vdi*_*rov 10

如果您更喜欢非交互式更新,这是这样做的一种方法:

kubectl get secret mysecret -o json | jq '.data["foo"]="YmFy"' | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

请注意,这YmFy是一个base64编码的bar字符串。如果要将值作为参数传递,则jq可以执行以下操作:

kubectl get secret mysecret -o json | jq --arg foo "$(echo bar | base64)" '.data["foo"]=$foo' | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

我使用起来比较舒服,jq但是yq如果您喜欢yaml格式,也应该做。

  • 在 echo 后不添加换行符,添加 -n optin `kubectl get secret mysecret -o json | jq --arg foo "$(echo -n bar | base64)" '.data["foo"]=$foo' | kubectl apply -f -` (6认同)
  • 对于长字符串,“base64”命令每 76 个字符包含换行符,这会破坏 k8s 对长字符串的解码。我建议在其末尾添加“-w 0”。所以最终的命令是`kubectl get Secret mysecret -o json | jq --arg foo "$(echo -n bar | base64 -w 0)" '.data["foo"]=$foo' | kubectl apply -f -` 来源:https://superuser.com/questions/1225134/why-does-the-base64-of-a-string-contain-n (3认同)

小智 10

来自'Skeeves'的答案:

Base64 编码您的值:
echo -n 'encode_My_Password' | base64
在编辑模式下打开秘密:
kubectl edit secret my-secret

默认编辑器将打开,替换现有键的值或使用编码值添加新行和新键。保存并关闭文件。更新后的值或新的键值对现已添加到密钥中。


小智 7

从命令行最简单的方法:

echo "This is my secret" | base64 | read output;kubectl patch secret my_secret_name -p="{\"data\":{\"secret_key\": \"$output\"}}" -v=1
Run Code Online (Sandbox Code Playgroud)

它将通过添加密钥和编码值作为该秘密中的最后一个键值对来编码值This is my secret并更新您的秘密。my_secret_namesecret_key


小智 5

我为此实现了一个kubectl 插件

使用 krew 安装

kubectl krew update
kubectl krew install modify-secret
Run Code Online (Sandbox Code Playgroud)

运行它

kubectl modify-secret xyz -n kube-system
Run Code Online (Sandbox Code Playgroud)

演示

使用 kubectl-modify-secret 插件

  • 现在这是一个真正的答案! (3认同)

lbe*_*tto 5

向现有密钥添加新密钥。

kubectl patch secret $SECRET_NAME --type=json \
  -p='[{
    "op" : "add" ,
    "path" : "/data/'$KEY'" ,
    "value" : "'$(base64 <<< "$VALUE")'"
  }]'
Run Code Online (Sandbox Code Playgroud)

更新机密中的现有密钥

kubectl patch secret $SECRET_NAME --type=json \
  -p='[{
    "op" : "replace" ,
    "path" : "/data/'$KEY'" ,
    "value" : "'$(base64 <<< "$VALUE")'"
  }]'
Run Code Online (Sandbox Code Playgroud)

我只能replace在文档中找到该操作,但没有提及该add操作。然而,它看起来符合RFC 6902,所以我进行了测试add,它工作得很好。我希望 RFC 6902 定义的其他操作也能正常工作,尽管我还没有测试过它们。