【发布时间】:2021-01-12 14:51:41
【问题描述】:
我有大约 10 个 ConfigMap 和一些秘密,它们将我的配置存储在 key 和 value 中。我正在寻找任何可以用来在任何可用的 configMap 或秘密中找到我的密钥的 kubectl 命令?
我知道我可以打开每个文件并找到我的密钥,但是是否有任何 kubectl 命令可以查找所有 configMap 或 Serects 以找到我的密钥?
【问题讨论】:
标签: kubernetes
我有大约 10 个 ConfigMap 和一些秘密,它们将我的配置存储在 key 和 value 中。我正在寻找任何可以用来在任何可用的 configMap 或秘密中找到我的密钥的 kubectl 命令?
我知道我可以打开每个文件并找到我的密钥,但是是否有任何 kubectl 命令可以查找所有 configMap 或 Serects 以找到我的密钥?
【问题讨论】:
标签: kubernetes
创建以下 kubectl 插件
#!/bin/bash
kubectl get secrets -o go-template='{{range $s:=.items}}{{range $k,$v:=$s.data}}{{printf "Secret %s: %s\n" $s.metadata.name $k}}{{end}}{{end}}' | grep -i $1
kubectl get configmap -o go-template='{{range $s:=.items}}{{range $k,$v:=$s.data}}{{printf "CM %s: %s\n" $s.metadata.name $k}}{{end}}{{end}}' | grep -i $1
它必须位于执行路径上的某个位置并且可以执行
# Make script executable
chmod +x /home/mark/bin/kubectl-find-key
# Check it can be found
kubectl plugin list
最后可以如下使用
$ kubectl find key database
CM myapp-details: DATABASE_HOSTNAME
【讨论】:
这可能不是最好的解决方案,但它确实有效,目前这是我想到的唯一方法。如果我能找到不同的解决方案,我会编辑这个答案。
如果您的kubectl 命令将仅指定resource 而没有特定名称,它将打印来自该指定资源的所有对象的信息。 kubectl describe cm 将打印所有ConfigMaps 的描述
为了测试,我从 documentation example 创建了 5 个 ConfigMaps(带有 data.game.properties 和 data.ui.properties)。在其中 3 个中,我设置了相同的键 test,其值为 1、3 或 5。
$ kubectl get cm
NAME DATA AGE
cm1 1 20m
cm2 1 21m
cm3 1 21m
cm4 1 21m
cm5 1 21m
最简单的方法是使用kubest get cm -o yaml,它将以YAML格式打印所有ConfigMaps,然后通过键或值打印grep。
$ kubectl get cm -o yaml | grep test
test=configmap1
{"apiVersion":"v1","data":{"game.properties":"enemies=aliens\nlives=3\ntest=configmap1\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"cm1","namespace":"default"}}
test=configmap3
{"apiVersion":"v1","data":{"game.properties":"secret.code.allowed=true\nsecret.code.lives=30\ntest=configmap3\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"cm3","namespace":"default"}}
test=configmap5
{"apiVersion":"v1","data":{"ui.properties":"allow.textmode=true\nhow.nice.to.look=fairlyNice \ntest=configmap5\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"cm5","namespace":"default"}}
所以cm1 包括test=configmap1、cm3 包括test=configmap3 和cm5 包括test=configmap5。除了YAML,您还可以使用JSON。
此外,由于ConfigMap 是namespaced,您可以使用-A 标志检查所有namespaces。
$ kubectl get cm -o yaml -A | grep test
可能难以阅读,但在控制台输出中会突出显示。
Secrets 也可以这样做。
【讨论】: