根据注解过滤kubectl get

Filter kubectl get based on anotation

我想根据注释的值过滤我的 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

我有一个带有注释 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 资源,因为 well.One 可能有助于理解早期命令的其他命令是

 kubectl get deployment -o=json

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

Here我们可以读到:

You cannot query annotations in Kubernetes, and this will not change in the foreseeable future.

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

我认为这不是您正在寻找的确切答案,但在我看来,您正在尝试以困难的方式做某事,如果您使用创建的解决方案,则不需要像那样为了你想要实现的目标。

无法在服务器端通过注释进行过滤,但您可以获取所有 pods 或部署的列表并在本地过滤,巧妙地使用 -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:

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