O Kubernetes permite a definição de pares chave-valor nos seus objetos de forma que você possa utiliza-los em futuras consultas. Estes pares chave-valor são chamados de labels. Você pode imaginar os labels como se fossem tags utilizadas nos posts de um blog. Como parte da especificação, o Kubernetes limita os labels a 63 caracteres alfanuméricos e caracteres separadores. A figura abaixo mostra os Pods frontend, backend e database com seus conjuntos de labels.

Figure 6-1. Pod with labels

Figure 6-1. Pod with labels

É comum definir os labels durante a criação dos objetos, no entanto você pode modifica-los como e quando desejar. Os labels parecem insignificantes quando vistos pela primeira vez, mas sua importância não deve ser subestimada. Eles são essenciais para o entendimento do comportamento de objetos Kubernetes mais avançados como Deployments e Services.

Declaring Labels

Labels podem ser criados imperativamente com o comando kubectl run ou declarativamente na seção metadata.labels do manifesto yaml. A opção de linha de comando --labels define um ou mais labels separados por virgula no momento da criação do Pod.

# Criando Pod com dois labels
$ kubectl run labeled-pod \\
	--image=nginx \\
  --restart=Never \\
	--labels=tier=backend,env=dev
# Manifesto equivalente ao comando acima
apiVersion: v1
kind: Pod
metadata:
  name: labeled-pod
  labels:
    env: dev
    tier: backend
spec:
  containers:
  - image: nginx
    name: labeled-pod
  restartPolicy: Never

Inspecting Labels

Podemos utilizar os comandos describe e get para obter as informações do Pod e consultar seus labels.

# Obtendo labels com comando describe
$ kubectl describe pod labeled-pod | grep -C 2 Labels:
	...
	Labels:       env=dev
	              tier=backend
	...

# Obtendo labels com comando get
$ kubectl get pod labeled-pod -o yaml | grep -C 1 labels:
	metadata:
	  labels:
	    env: dev
	    tier: backend
	...

Se você deseja listar os labels de todos os tipos de objetos ou de um tipo de objeto específico, use a opção de linha de comando --show-labels.

# Listando Pods e exibindo seus labels
$ kubectl get pods --show-labels
	NAME          READY   STATUS    RESTARTS   AGE   LABELS
	labeled-pod   1/1     Running   0          38m   env=dev,tier=backend

Modifying Labels for a Live Object

É possível adicionar, remover ou modificar labels de objetos existentes a qualquer momento. Existem duas maneiras de fazer isso: Alterar a seção metadata.labels de um live object ou Utilizar o comando kubectl label.

# Listando Pods e seus labels
$ kubectl get pods --show-labels   
	NAME          READY   STATUS    RESTARTS   AGE     LABELS
	labeled-pod   1/1     Running   0          6m24s   env=dev,
																										 tier=backend

#######################
## ADICIONANDO LABEL ##
#######################
# Adicionando label region=eu
$ kubectl label pod labeled-pod region=eu
	pod/labeled-pod labeled

# Demonstrando resultados
$ kubectl get pods --show-labels         
NAME          READY   STATUS    RESTARTS   AGE     LABELS
labeled-pod   1/1     Running   0          6m39s   env=dev,
																									 tier=backend,
																									 region=eu

##############################
## ALTERANDO VALOR DO LABEL ##
##############################
# Sobrescrevendo o valor do label `region`, de `eu` para `us`
$ kubectl label pod labeled-pod region=us --overwrite
	pod/labeled-pod labeled

# Demonstrando resultados
$ kubectl get pods --show-labels
	NAME          READY   STATUS    RESTARTS   AGE     LABELS
	labeled-pod   1/1     Running   0          9m34s   env=dev,
																										 tier=backend,
																										 region=us

#####################
## EXCLUINDO LABEL ##
#####################
# Removendo label `region`
$ kubectl label pod labeled-pod region-              
	pod/labeled-pod unlabeled

# Demonstrando resultados
$ kubectl get pods --show-labels       
	NAME          READY   STATUS    RESTARTS   AGE   LABELS
	labeled-pod   1/1     Running   0          10m   env=dev,
																									 tier=backend