如何修改 Kubernetes 中的secret
值kubectl
?
我用 创造了秘密kubernetes create secret generic
,但似乎没有办法修改秘密。例如,向其中添加新的秘密值,或更改其中的秘密值。
我假设我可以去'低级',编写yaml文件并做一个kubectl edit
但我希望有一个更简单的方法。
(我正在使用kubernetes 1.2.x
)
如何修改 Kubernetes 中的secret
值kubectl
?
我用 创造了秘密kubernetes create secret generic
,但似乎没有办法修改秘密。例如,向其中添加新的秘密值,或更改其中的秘密值。
我假设我可以去'低级',编写yaml文件并做一个kubectl edit
但我希望有一个更简单的方法。
(我正在使用kubernetes 1.2.x
)
最直接(和互动)的方式应该是执行kubectl edit secret <my secret>
. kubectl get secrets
如果您想查看 Kubernetes 管理的机密列表,请运行。
如果您更喜欢非交互式更新,这是一种方法:
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
,但yq
如果您更喜欢 yaml 格式,我也应该这样做。
当我发现自己需要修改一个秘密时,我来到了这里。
这是我发现的用于编辑(单行)机密的最方便的方法。
这详细说明了kubectl edit secret <my secret>
上面的 Timo Reimann。
kubectl edit secret <my secret>
将(在我的情况下)调用 vi。
现在,我将光标移动到要编辑的密码的冒号后面的空间。
然后我按下r
and [enter]
,它将把 base64 编码的值放到它自己的一行上。
现在我输入:. ! base64 -D
它将解码当前行。
对值进行更改后,我输入:. ! base64
将对更改的值进行编码的值。
按下k
[shift]J
将重新加入秘密名称及其新值。
:wq
将写入新的秘密文件并退出 vi。
PS如果密钥具有多行值,请打开行号 ( :set nu
),并在更改解码值后,使用A,B ! base64
其中 A 和 B 是值的第一行和最后一行的行号。
PPS我刚刚学会了base64
接收文本以附加换行符进行编码的艰难方法:(如果这对您的值没有问题 - 很好。否则我目前的解决方案是通过以下方式过滤掉它:.!perl -pe chomp | base64
从命令行最简单的方法:
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
源自“Skeeves”的答案:
Base64 编码您的值:
echo -n 'encode_My_Password' | base64
在编辑模式下打开密钥:
kubectl edit secret my-secret
默认编辑器将打开,替换现有键的值或使用编码值添加新行和新键。保存并关闭文件。更新的值或新的键值对现已添加到密钥中。
我为此实现了一个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 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
并输入新的正确值。
但是删除并重新创建是更简单的选择。
参考 :
我发现的最快方法:
# 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
以对其进行编辑(绿色箭头):