下面是我的kubectl get deploy --all-namespaces
的输出:
{
"apiVersion": "v1",
"items": [
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"annotations": {
"downscaler/uptime": "Mon-Fri 07:00-23:59 Australia/Sydney",
"name": "actiontest-v2.0.9",
"namespace": "actiontest",
},
"spec": {
......
......
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"annotations": {
"downscaler/uptime": "Mon-Fri 07:00-21:00 Australia/Sydney",
"name": "anotherapp-v0.1.10",
"namespace": "anotherapp",
},
"spec": {
......
......
}
}
如果注释"downscaler/uptime"
与值"Mon-Fri 07:00-21:00 Australia/Sydney"
匹配,我需要找到部署的名称及其名称空间。我希望得到如下输出:
deployment_name,namespace
如果我对单个部署运行下面的查询,我将得到所需的输出。
#kubectl get deploy -n anotherapp -o jsonpath='{range .[*]}{.items[?(@.metadata.annotations.downscaler/uptime=="Mon-Fri 07:00-21:00 Australia/Sydney")].metadata.name}{","}{.items[?(@.metadata.annotations.downscaler/uptime=="Mon-Fri 07:00-21:00 Australia/Sydney")].metadata.namespace}{"n"}'
anotherapp-v0.1.10,anotherapp
但是当我对所有名称空间运行它时,得到如下输出:
#kubectl get deploy --all-namespaces -o jsonpath='{range .[*]}{.items[?(@.metadata.annotations.downscaler/uptime=="Mon-Fri 07:00-21:00 Australia/Sydney")].metadata.name}{","}{.items[?(@.metadata.annotations.downscaler/uptime=="Mon-Fri 07:00-21:00 Australia/Sydney")].metadata.namespace}{"n"}'
actiontest-v2.0.9 anotherapp-v0.1.10, actiontest anotherapp
这是一个很简短的答案,但是你可以使用这个选项:
kubectl get deploy --all-namespaces -o jsonpath='{range .items[?(.metadata.annotations.downscaler/uptime=="Mon-Fri 07:00-21:00 Australia/Sydney")]}{.metadata.name}{"t"}{.metadata.namespace}{"n"}'
我改变的是如何处理数据的逻辑:
发生的第一件事是进入range
元素列表,我们需要工作,而不是一切。我使用了过滤器表达式-参见Jsonpath表示法-语法元素。
一旦我们已经过滤了列表中的实体,我们就可以很容易地检索我们需要的其他字段。