Ir al contenido

Estándares de Etiquetado (K8s Labels)

En Kubernetes, las Labels (etiquetas) son el mecanismo principal para organizar y seleccionar grupos de objetos. En HERA, el etiquetado no es opcional ni arbitrario: es el puente que conecta un recurso técnico (como un Pod o un Service) con su identidad en la organización (dominio, producto, responsable).


La fuente de verdad para el etiquetado es el archivo product-manifest.yml de cada repositorio. El pipeline de CI/CD inyecta estos valores como etiquetas en los manifiestos de Kubernetes durante la fase de despliegue.

Etiquetas de Negocio (Prefijo hera.grupoherdez.com/)

Sección titulada «Etiquetas de Negocio (Prefijo hera.grupoherdez.com/)»

Estas etiquetas permiten segmentar los recursos según la estructura organizacional de Grupo Herdez. Los valores se derivan del product-manifest.yml canónico.

EtiquetaOrigen en ManifiestoEjemploPropósito
hera.grupoherdez.com/domainproduct.domainecommerceAtribución de costos y reportes ejecutivos
hera.grupoherdez.com/productproduct.nametienda-herdezIdentificación del producto raíz
hera.grupoherdez.com/brandproduct.brandgrupo-herdezSegmentación por marca comercial
hera.grupoherdez.com/criticalityclassification.criticalitycriticalPriorización en respuesta a incidentes y DR (valores permitidos: low, medium, high, critical)
hera.grupoherdez.com/data-classificationclassification.data_classificationconfidentialAplicación de políticas de seguridad y DLP (valores permitidos: public, internal, confidential, restricted)
hera.grupoherdez.com/partnerpartnerinternoIdentificación de autoría (equipo interno o partner)

HERA adopta las etiquetas recomendadas por la comunidad de Kubernetes (app.kubernetes.io/) para garantizar que las herramientas de terceros funcionen correctamente.

EtiquetaValor sugeridoEjemplo
app.kubernetes.io/nameNombre del serviciobackend-checkout-service
app.kubernetes.io/instanceNombre único de la instanciacheckout-v1
app.kubernetes.io/versionVersión semántica (SemVer)1.2.3
app.kubernetes.io/componentCapa de la arquitecturabackend, frontend, database
app.kubernetes.io/part-ofNombre del productotienda-herdez
app.kubernetes.io/managed-byHerramienta de desplieguehera-pipeline, helm, argocd

  1. Lowercase estricto: Todas las etiquetas deben estar en minúsculas.
  2. Separadores: Usar guiones - para separar palabras, nunca guiones bajos _ ni espacios.
  3. Longitud: No exceder los 63 caracteres (límite técnico de K8s).
  4. Caracteres permitidos: [a-z0-9], guiones -, puntos . y el prefijo de dominio.

Las etiquetas deben definirse en el nivel más alto posible y propagarse automáticamente:

  • Deployment/StatefulSet: Las etiquetas en metadata.labels deben replicarse en spec.template.metadata.labels para que los Pods las hereden.
  • Services: El spec.selector debe usar un subconjunto mínimo de etiquetas (usualmente app.kubernetes.io/name e instance) para encontrar los Pods.
  • Ingress: Debe incluir las etiquetas de negocio para que el Balanceador de Carga de GCP pueda reportar costos correctamente.

A continuación se muestra cómo debe verse un manifiesto de un servicio estándar en HERA:

apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-checkout-service
namespace: tienda-herdez
labels:
# Etiquetas de negocio HERA
hera.grupoherdez.com/domain: ecommerce
hera.grupoherdez.com/product: tienda-herdez
hera.grupoherdez.com/brand: grupo-herdez
hera.grupoherdez.com/criticality: critical
hera.grupoherdez.com/data-classification: restricted
# Etiquetas estándares K8s
app.kubernetes.io/name: backend-checkout-service
app.kubernetes.io/instance: checkout-prod
app.kubernetes.io/version: "1.2.3"
app.kubernetes.io/component: backend
app.kubernetes.io/part-of: tienda-herdez
app.kubernetes.io/managed-by: hera-pipeline
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: backend-checkout-service
template:
metadata:
labels:
# Los Pods deben heredar todas las labels del Deployment
app.kubernetes.io/name: backend-checkout-service
app.kubernetes.io/instance: checkout-prod
# ... resto de etiquetas de negocio

Con un etiquetado correcto, puedes realizar consultas potentes en segundos:

Ventana de terminal
# Ver todos los pods del dominio 'ecommerce' en todos los namespaces
kubectl get pods -A -l hera.grupoherdez.com/domain=ecommerce
# Listar servicios críticos (tier-1) que tienen errores
kubectl get pods -l hera.grupoherdez.com/criticality=tier-1 --field-selector status.phase!=Running

En Google Cloud Logging, puedes filtrar logs por etiquetas de negocio para entender el comportamiento de una marca específica o detectar anomalías en servicios que manejan datos confidenciales.

resource.labels.namespace_name="tienda-herdez"
labels."hera.grupoherdez.com/data-classification"="restricted"

6. Checklist de Cumplimiento para Code Review

Sección titulada «6. Checklist de Cumplimiento para Code Review»

Esta checklist es obligatoria en todo MR que agregue o modifique manifiestos Kubernetes con etiquetas. Todo item debe estar marcado ✅ antes del merge a develop.

  • Todos los recursos tienen las 6 etiquetas de negocio del prefijo hera.grupoherdez.com/: domain, product, brand, criticality, data-classification, partner
  • Los valores de cada etiqueta coinciden exactamente con lo declarado en el product-manifest.yml del repo (no se inventan valores locales)
  • criticality usa uno de los valores permitidos: low, medium, high, critical
  • data-classification usa uno de los valores permitidos: public, internal, confidential, restricted
  • Los valores son lowercase y usan guiones como separador (nunca underscores ni espacios)
  • Todos los recursos incluyen las 6 etiquetas app.kubernetes.io/*: name, instance, version, component, part-of, managed-by
  • app.kubernetes.io/name coincide con el nombre del deployment (patrón <tipo>-<detalle>)
  • app.kubernetes.io/part-of coincide con el nombre del producto (el mismo valor del K8s namespace)
  • app.kubernetes.io/version usa SemVer (1.2.3) entre comillas para forzar parsing como string
  • app.kubernetes.io/managed-by identifica la herramienta real (hera-pipeline, helm, argocd)
  • Las etiquetas del Deployment.metadata.labels se replican en spec.template.metadata.labels para que los Pods las hereden
  • Los Services usan un subconjunto mínimo de etiquetas en spec.selector (típicamente app.kubernetes.io/name + instance), no la lista completa
  • Los recursos asociados (Ingress, HPA, PDB, NetworkPolicy) usan las mismas etiquetas de negocio que el Deployment al que aplican
  • Ninguna etiqueta excede 63 caracteres (límite técnico de K8s)
  • Ninguna etiqueta contiene caracteres fuera de [a-z0-9\-\.] + el separador / del prefijo de dominio
  • Los valores con versión entre comillas ("1.2.3") para evitar que YAML los interprete como float

Estos patrones están explícitamente prohibidos y bloquean el merge en code review:

#Anti-patternPor qué es maloQué hacer en su lugar
1Etiquetas inventadas localesRompe la trazabilidad de costos y la observabilidad centralizadaUsar solo las 6 etiquetas de negocio y las 6 app.kubernetes.io/* definidas aquí
2Valores que no coinciden con product-manifest.ymlEl pipeline de CI/CD valida este matching — el MR fallaLeer los valores del manifest, nunca hardcodearlos en el manifiesto K8s
3criticality: tier-1 u otras taxonomíasLa taxonomía oficial es low/medium/high/critical — tier-1 no existe en HERAUsar critical para servicios críticos del negocio
4Etiquetas con mayúsculas, guiones bajos o espaciosK8s las acepta pero la convención HERA es lowercase + guioneshera.grupoherdez.com/data-classification, nunca hera.grupoherdez.com/Data_Classification
5Etiquetas del Deployment sin replicar en los PodsLos Pods quedan sin trazabilidad — no aparecen en queries por criticidad ni en reportes de costos por dominioReplicar las mismas etiquetas en spec.template.metadata.labels
6Versiones sin quotes (version: 1.2.3)YAML interpreta 1.2.3 como multi-dot que algunos parsers rompenSiempre entre comillas: version: "1.2.3"
7part-of apuntando a otro nombreRompe la agrupación por producto en dashboards y queriespart-of siempre es el nombre del producto (= nombre del namespace)
8Etiquetas mezcladas en el mismo recurso con prefijos distintos (ej. hera.grupoherdez.com/ + hera.cloudherdez.com/)Confunde la gobernanza; dos prefijos para el mismo propósitoSolo hera.grupoherdez.com/ para labels de negocio. Otros prefijos requieren aprobación de Arquitectura

Este estándar forma parte del conjunto de convenciones de configuración y naming del ecosistema HERA. Consulta también: