How to find all the k8s objects with any label containing some word?

Viewed 386

For example, I want to find all the clusterroles with any label containing the word prometheus in the label value.

Here is what I know to do so far:

mark@D-LP0003:~$ kubectl get clusterrole --show-labels | grep prometheus
prometheus                                                             2020-09-15T17:56:31Z   app=prometheus,chart=prometheus-11.7.0,component=server,heritage=Helm,release=prometheus
prometheus-grafana-clusterrole                                         2020-09-15T17:46:55Z   app.kubernetes.io/instance=prometheus,app.kubernetes.io/managed-by=Helm,app.kubernetes.io/name=grafana,app.kubernetes.io/version=7.1.5,helm.sh/chart=grafana-5.6.5
prometheus-kube-prometheus-prometheus                                  2020-09-15T17:46:55Z   app.kubernetes.io/managed-by=Helm,app=kube-prometheus-stack-prometheus,chart=kube-prometheus-stack-9.4.2,heritage=Helm,release=prometheus
prometheus-kube-prometheus-prometheus-psp                              2020-09-15T17:46:55Z   app.kubernetes.io/managed-by=Helm,app=kube-prometheus-stack-prometheus,chart=kube-prometheus-stack-9.4.2,heritage=Helm,release=prometheus
prometheus-kube-state-metrics                                          2020-09-15T17:46:55Z   app.kubernetes.io/instance=prometheus,app.kubernetes.io/managed-by=Helm,app.kubernetes.io/name=kube-state-metrics,helm.sh/chart=kube-state-metrics-2.8.14
psp-prometheus-kube-state-metrics                                      2020-09-15T17:46:55Z   app.kubernetes.io/instance=prometheus,app.kubernetes.io/managed-by=Helm,app.kubernetes.io/name=kube-state-metrics,helm.sh/chart=kube-state-metrics-2.8.14
psp-prometheus-prometheus-node-exporter                                2020-09-15T17:46:55Z   app.kubernetes.io/managed-by=Helm,app=prometheus-node-exporter,chart=prometheu -node-exporter-1.11.2,heritage=Helm,jobLabel=node-exporter,release=prometheus
system:prometheus                                                      2020-09-23T01:24:32Z   app=prometheus
mark@D-LP0003:~$    

But I wonder if this is the best I can do? Because if I want just to get the names of the objects, then I need to do further shell processing instead of using kubectl get facilities for that (like -o name or jsonpath), even though it is as simple as piping to cut -d' ' -f1

1 Answers

Posting as Community Wiki for better visibility.

As per comment by @Max Lobur you can use -o custom-columns.

However, when you will use --show-labels and -o=custom-columns=, you will get error:

$ kubectl get clusterrole --show-labels -o=custom-columns='DATA:metadata.name' | grep kubernetes.io/cluster-service=
true
error: --show-labels option cannot be used with custom-columns=DATA:metadata.name printer

But when you will use exact label name, like example below you, you don't need to use grep at all.

$ kubectl get clusterrole -l=kubernetes.io/cluster-service=true
NAME                                     AGE
gce:beta:kubelet-certificate-bootstrap   24h
gce:beta:kubelet-certificate-rotation    24h
kubelet-api-admin                        24h
stackdriver:fluentd-gcp                  24h
stackdriver:metadata-agent               24h
system:metrics-server                    24h

And output with -o=custom-columns

$ kubectl get clusterrole -l=kubernetes.io/cluster-service=true -o=custom-columns='DATA:metadata.name'
DATA
gce:beta:kubelet-certificate-bootstrap
gce:beta:kubelet-certificate-rotation
kubelet-api-admin
stackdriver:fluentd-gcp
stackdriver:metadata-agent
system:metrics-server

Also, you can use Max Lobur personal solution.

I recently did smth similar in python, and I end up with filtering on the client https://github.com/verygood-ops/kube-janitor/blob/master/kube_janitor/resources/ns.py#L28 - I needed to grep label keys, not the values.

Related