【问题标题】:kubectl jsonpath query and output multiple object valueskubectl jsonpath 查询并输出多个对象值
【发布时间】:2021-12-12 12:17:34
【问题描述】:

下面是我对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

【问题讨论】:

    标签: kubernetes formatting kubectl jsonpath


    【解决方案1】:

    这是一个非常简短的答案,但是您可以使用此选项:

    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 我们需要处理的元素列表,而不是所有内容。我用filter expression - see Jsonpath notation - syntax elements

    一旦我们已经过滤了列表中的实体,我们就可以轻松检索我们需要的其他字段。

    【讨论】:

    • 那是很棒的伙伴。你知道我在哪里可以了解更多关于 jsonpath/jq 等的信息吗?喜欢一些培训?
    • Kubernetes Documentation for JsonPath Support。 JSONPath Stefan Goessner JsonPath implementation 的标准提案。使用在线工具jsonpath.com 仅测试您的 jsonpath
    • @VineethElias 很高兴这很有帮助。如果它解决了您的问题,请考虑accepting the answer。至于你的问题,Akshay G 分享了很好的链接,这是关于练习的。我花了大约 30 分钟通过文档和我的测试台来解决您的问题 :)
    • 对不起那个伙伴。我不知道“接受答案”部分。我马上就做。
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    相关资源
    最近更新 更多