K8s em Exemplos: Labels e Selectors

Labels são pares chave-valor anexados a recursos. Elas são a base do acoplamento flexível no Kubernetes. Services encontram Pods, Deployments gerenciam ReplicaSets, NetworkPolicies direcionam Pods - tudo via labels.

pod-labels.yaml

Labels ficam na seção metadata. Use convenções de nomenclatura consistentes em seus recursos.

metadata:
  name: my-app
  labels:
    app.kubernetes.io/name: my-app
    app.kubernetes.io/component: api

Adicione labels de versão e ambiente para filtragem e estratégias de deploy.

    app.kubernetes.io/version: "1.0.0"
    environment: production
recommended-labels.yaml

Use labels recomendadas da documentação do Kubernetes para consistência. Elas habilitam integração de ferramentas, alocação de custos e dashboards de monitoramento.

labels:
  app.kubernetes.io/name: my-app
  app.kubernetes.io/instance: my-app-prod
  app.kubernetes.io/version: "1.2.0"

Labels organizacionais: component, part-of, managed-by. Obrigatórias para maioria das ferramentas: name, instance, version.

  app.kubernetes.io/component: frontend
  app.kubernetes.io/part-of: my-platform
  app.kubernetes.io/managed-by: helm
selector.yaml

Selectors de label usam lógica AND. Para um Pod corresponder, ele deve ter TODAS as labels especificadas.

spec:
  selector:
    app: my-app
    tier: frontend

Pods podem ter labels extras - apenas as labels do selector precisam corresponder.

metadata:
  labels:
    app: my-app
    tier: frontend
    version: v2
match-expressions.yaml

Dois tipos de selector: matchLabels (igualdade) e matchExpressions (baseado em conjunto). Combine-os para lógica de seleção complexa.

selector:
  matchLabels:
    app: my-app
  matchExpressions:
    - key: environment
      operator: In
      values: [staging, production]

Operadores: In (valor na lista), NotIn (valor fora da lista), Exists (chave existe), DoesNotExist (chave ausente).

    - key: tier
      operator: NotIn
      values: [test]
    - key: release
      operator: Exists
labels-vs-annotations.yaml

Labels são para seleção e agrupamento (consultáveis). Use labels para tudo que você precisa filtrar.

metadata:
  labels:
    app: my-app
    environment: production

Annotations são para metadados que ferramentas consomem (não consultáveis). Armazene descrições, owners e configs de ferramentas aqui.

  annotations:
    description: "Main API server"
    owner: "platform-team@company.com"
    prometheus.io/scrape: "true"
terminal

Use -l para filtrar por label. Suporta selectors de igualdade e baseados em conjunto.

$ kubectl get pods -l app=my-app
NAME                      READY   STATUS    AGE
my-app-6d4f8b7c9-abc      1/1     Running   5m
my-app-6d4f8b7c9-xyz      1/1     Running   5m
terminal

Selectors baseados em conjunto usam in, notin, e != para filtragem complexa.

$ kubectl get pods -l 'environment in (staging, production)'
NAME                      READY   STATUS    AGE
api-staging-abc           1/1     Running   10m
api-prod-xyz              1/1     Running   2h
terminal

Use -L para mostrar valores de labels como colunas na saída.

$ kubectl get pods -L app,environment
NAME       READY   STATUS    APP      ENVIRONMENT
my-app-1   1/1     Running   my-app   production
my-app-2   1/1     Running   my-app   staging
terminal

Adicione ou modifique labels com kubectl label. Use sufixo - para remover uma label.

$ kubectl label pods my-pod env=prod
pod/my-pod labeled

$ kubectl label pods my-pod env-
pod/my-pod unlabeled
terminal

Aviso: mudar labels em Pods em execução pode quebrar roteamento de Service ou fazer Deployments criarem novos Pods. O Pod se torna órfão de seu Deployment.

$ kubectl label pod my-app-xyz app=other --overwrite
pod/my-app-xyz labeled

Índice | GitHub | Use as setas do teclado para navegar |