Labels

Labels are the mechanism used to organize Kubernetes objects. A label is a key-value pair with certain restrictions concerning length and allowed values but without any pre-defined meaning. You’re free to choose labels as you see fit, for example, to express environments such as “this pod is running in production” or ownership, like “department X owns that pod”.

aaa bbb ccc

Let’s create a pod that initially has one label (env=development):

$ kubectl apply -f https://raw.githubusercontent.com/openshift-evangelists/kbe/main/specs/labels/pod.yaml

The get subcommand can be used to display a pod’s labels:

$ kubectl get pods --show-labels

The labels are rendered as an additional column in the output:

NAME      READY   STATUS    RESTARTS   AGE   LABELS
labelex   1/1     Running   0          6s    env=development

You can add a label to the pod through the label subcommand:

$ kubectl label pods labelex owner=michael

Running the get subcommand from above shows the new label in addition to the existing one:

NAME      READY   STATUS    RESTARTS   AGE   LABELS
labelex   1/1     Running   0          65s   env=development,owner=michael

To use a label for filtering, for example to list only pods that have an owner that equals michael, use the --selector option:

$ kubectl get pods --selector owner=michael

The --selector option can be abbreviated to -l, so selecting pods that are labelled with env=development can also be done using:

$ kubectl get pods -l env=development

Oftentimes, Kubernetes objects support set-based selectors. Let’s launch another pod that has two labels (env=production and owner=michael):

$ kubectl apply -f https://raw.githubusercontent.com/openshift-evangelists/kbe/main/specs/labels/anotherpod.yaml

Now, let’s list all pods that are either labelled with env=development or with env=production:

$ kubectl get pods -l 'env in (production, development)'

Since we have each pod has one of those two labels, they both appear in the output:

NAME           READY   STATUS    RESTARTS   AGE
labelex        1/1     Running   0          6m39s
labelexother   1/1     Running   0          46s

Other verbs also support label selection. For example, you could remove both of these pods with the same selector:

$ kubectl delete pods -l 'env in (production, development)'

Beware that this will destroy any pods with those labels.

You can also delete them directly, via their names, with:

$ kubectl delete pods labelex
$ kubectl delete pods labelexother

Note that labels are not restricted to pods. In fact you can apply them to all sorts of objects, such as nodes or services.