基于注解过滤 kubectl get

Jer*_*ba6 7 annotations get kubernetes

我想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
Run Code Online (Sandbox Code Playgroud)

sac*_*hin 11

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

我可以通过以下方式获得具有该注释的部署

kubectl get deploy -o=jsonpath='{.items[?(@.spec.template.metadata.annotations.prometheus\.io/scrape=="true")].metadata.name}'
Run Code Online (Sandbox Code Playgroud)

上面使用了 Jsonpath 概念,文档可以在这里找到

在您的情况下,命令可能类似于

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

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

 kubectl get deployment -o=json
Run Code Online (Sandbox Code Playgroud)

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

ece*_*ulm 6

无法在服务器端通过注释进行过滤,但您可以获取所有 Pod 或部署的列表并在本地过滤它,巧妙地使用-o=jsonpath或使用jq我认为更直观的方法。

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

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

或者对于具有注释的 pod aws.amazon.com/cloudwatch-agent-ignore

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