kubernetes:使用cli修改秘密?

时间:2016-05-12 07:34:37

标签: kubernetes kubernetes-secrets

如何使用cli修改kubernetes密码中的值?

我用kubernetes create secret generic创建了秘密,但似乎没有办法修改秘密。例如,向其添加新的秘密值,或更改其中的秘密值。

我认为我可以去低级'并编写yaml文件并执行kubectl edit但我希望有一种更简单的方法。

(我使用kubernetes 1.2.x

8 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:7)

如果您希望使用非交互式更新,这是一种实现方式:

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也可以完成这项工作。

答案 2 :(得分:6)

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

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

这在上面的蒂莫·赖曼(Timo Reimann)的kubectl edit secret <my secret>中有详细阐述。

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

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

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

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

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

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

:wq将写入新的秘密文件并退出vi。

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

PPS 我刚刚了解了base64会收到以附加的换行符进行编码的文本的艰难方法:(如果这对您的值没有问题-很好。否则,我当前的解决方案可以用.!perl -pe chomp | base64

过滤掉

答案 3 :(得分:5)

从命令行最简单的方法:

echo "This is my secret" | base64 | read output;kubectl patch secret my_secret_name -p="{\"data\":{\"secret_key\": \"$output\"}}" -v=1

它将对值This is my secret进行编码,并通过添加my_secret_name键和编码值作为该机密中的最后一个键值对来更新您的secret_key机密。

答案 4 :(得分:1)

我为此专门实现了kubectl plugin

要使用krew安装

kubectl krew update
kubectl krew install modify-secret

要运行

kubectl modify-secret xyz -n kube-system

演示

<img src="https://github.com/rajatjindal/kubectl-modify-secret/raw/master/demo/usage.gif" alt="using kubectl-modify-secret plugin" style="max-width:100%;">

答案 5 :(得分:1)

我找到最快的方法:

# 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

答案 6 :(得分:0)

接着是“ Skeeve”

echo -n 'encode_My_Password' |base64

kubectl edit secret my-secret

默认编辑器将打开,替换现有秘密元素的值或使用上面生成的编码密码添加新的行元素。 保存文件并关闭,更新的值或新值将被添加到k8s秘密中。

答案 7 :(得分:0)

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

查看所有这些答案后,对我而言,最好的解决方案是删除并重新创建:

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 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运行新的完整字符串以获取基本64编码,现在我终于可以放心地使用kubectl edit secret generic-registry-secret更改值并输入新的正确值。

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


参考文献: