获取特定的Kubernetes吊舱

时间:2020-08-24 08:42:39

标签: templates kubernetes pod

我有以下吊舱列表:

user@compute:~> kubectl get pods -n test --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}'
test-1
test-2
test-3
abc
cdf
dfg

我只想获得名称中包含 test 的广告连播。有什么方法可以在不使用grep或for的情况下,而是使用模板或任何Kubernetes的方式来完成此任务?

谢谢

1 个答案:

答案 0 :(得分:1)

大多数Kubernetes维护者(到目前为止)并不打算使kubectl命令比专门为数据集解析而设计的外部工具(例如grep,jq)更高级,并建议在类似的用例中仍然使用外部工具给你的。有计划的PR,以便使此限制在Docs中对最终用户更加明显。

将输出格式从--template(go-template格式)替换为--jsonpath,理论上可以实现您的目标。但是实际上,不支持正则表达式过滤器,并且这样的命令会导致以下错误:

error: error parsing jsonpath {.items[?(@.metadata.name=~/^test$/)].metadata.name}, unrecognized character in action: U+007E '~'

您检查并关注这里讨论的问题: https://github.com/kubernetes/kubernetes/issues/72220

话虽如此,现在您可以尝试使用jq代替grep命令:

k get po -n monitoring -o json | jq '.items[] | select(.metadata.name|test("prom"))| .metadata.name'

 
"prometheus-k8s-0"
"prometheus-k8s-1"
"prometheus-operator-65c77bdd6c-lmrlf"

或使用我唯一已知的解决方法在不使用grep的情况下获得相似的结果,请使用此非常没有吸引力的命令:

 k set env po/prometheus-k8s-0 -n monitoring -c prometheus-config* --dry-run=client --list
# Pod prometheus-k8s-0, container prometheus-config-reloader
# POD_NAME from field path metadata.name

*此命令使用'-c'接受通配符的事实,此外,我假设容器名称与Pod名称一致