kubectl jsonpath查询和输出多个对象值

3
以下是我运行的 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
1个回答

2
这是一个非常简短的答案,但您可以使用以下选项:
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"}'

我所改变的是处理数据的逻辑:
首先要做的事情就是将需要工作的元素放入一个范围列表中,而不是所有元素。我使用了过滤表达式-请参阅Jsonpath表示法-语法元素
一旦我们已经在列表中筛选出实体,我们就可以轻松地检索出我们需要的其他字段。

1
太棒了,伙计。你知道我可以在哪里学习更多关于jsonpath/jq等的知识吗?比如一些培训课程? - Vineeth Elias
2
Kubernetes文档中心提供了JsonPath支持的相关文档,网址为:https://kubernetes.io/docs/reference/kubectl/jsonpath/。标准的JSONPath提案请参考Stefan Goessner的实现,网址为:https://goessner.net/articles/JsonPath/。在测试您的JsonPath时,可以使用在线工具https://jsonpath.com/。 - Akshay G
2
抱歉啊,伙计。我不知道“接受答案”的部分。我会立刻去做的。 - Vineeth Elias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接