【问题标题】:Filter kubectl get based on anotation根据注解过滤 kubectl get
【发布时间】:2020-06-08 14:43:43
【问题描述】:

我想根据注释的值过滤我的kubectl get deploy 命令。

类似kubectl get deploy --annotation stork.libopenstorage.org/skipresource!="true"的东西

目前不知道如何执行此操作,并且我们不想添加额外的标签。上面两个命令的输出应该如下所示:

kubectl get deploy 
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
elastalert                  1/1     1            1           33d
es-hq                       1/1     1            1           33d
etcdsnapshots               1/1     1            1           33d
fluentd-aggregator          2/2     2            2           33d
kibana                      1/1     1            1           33d

kubectl get deploy --annotation stork.libopenstorage.org/skipresource!="true"
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
etcdsnapshots               1/1     1            1           33d
fluentd-aggregator          2/2     2            2           33d
kibana                      1/1     1            1           33d

kubectl get deploy --annotation stork.libopenstorage.org/skipresource="true"
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
elastalert                  1/1     1            1           33d
es-hq                       1/1     1            1           33d

【问题讨论】:

    标签: kubernetes get annotations


    【解决方案1】:

    我有一个带有注释 prometheus.io/scrape="true" 的部署

    我可以通过

    获得具有该注释的部署
    kubectl get deploy -o=jsonpath='{.items[?(@.spec.template.metadata.annotations.prometheus\.io/scrape=="true")].metadata.name}'
    

    以上使用 Jsonpath 概念,文档可以在here找到

    在你的情况下,命令可能是这样的

    kubectl get deploy -o=jsonpath='{.items[?(@.spec.template.metadata.annotations.stork\.libopenstorage\.org/skipresource=="true")].metadata.name}'
    

    这个概念也可以应用于其他 kubernetes 资源。另一个可能有助于理解早期命令的命令是

     kubectl get deployment -o=json
    

    【讨论】:

    • 谢谢!这在尝试获取默认存储类的名称时特别有用(由于我无法理解的原因,它是注释而不是标签):kubectl get storageclass -o=jsonpath='{.items[?(@.metadata.annotations.storageclass\.kubernetes\.io/is-default-class= ="true")].metadata.name}'
    【解决方案2】:

    您正在尝试以与使用标签相同的方式使用注释。问题是注释不应该那样使用。正如sachin 所述,可以实现您想要的,但这不切实际。

    Here我们可以阅读:

    你不能在 Kubernetes 中查询注解,这不会改变 在可预见的未来。

    使用标签会是更好的解决方案。 Here 我们可以看到许多标签的使用示例,这很清楚为什么使用它是有意义的。

    我认为这不是您要寻找的确切答案,但在我看来,您正在尝试以艰难的方式做某事,如果您使用为什么而创建的解决方案,则不需要那样做你正在努力实现。

    【讨论】:

      【解决方案3】:

      没有办法在服务器端通过注释进行过滤,但是您可以获取所有 pod 或部署的列表并在本地进行过滤,巧妙地使用 -o=jsonpath 或使用 jq 我发现更多直观。

      例如,获取该特定注释不是 "true" 的所有部署

       kubectl get deployment -o json| jq '.items[].metadata|select(.annotations."stork.libopenstorage.org/skipresource"!="true")|.name'
      

      或者对于带有注解 aws.amazon.com/cloudwatch-agent-ignore 的 pod:

       kubectl get pods -n mynamespace -o json| jq '.items[].metadata|select(.annotations."aws.amazon.com/cloudwatch-agent-ignore"!="true")|.name'
      

      【讨论】:

        猜你喜欢
        • 2022-12-03
        • 2021-07-15
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多