Kustomize es una herramienta de personalización de configuraciones de Kubernetes que permite gestionar configuraciones de manera declarativa. A diferencia de otras herramientas como Helm, Kustomize no requiere plantillas, lo que simplifica la gestión de configuraciones complejas.

¿Qué es Kustomize?

Kustomize permite aplicar configuraciones específicas a recursos de Kubernetes sin necesidad de modificar los archivos YAML originales. Esto se logra mediante la creación de "kustomizations" que definen cómo se deben modificar los recursos.

Características Clave de Kustomize

  • Declarativo: Las configuraciones se definen de manera declarativa en archivos YAML.
  • Sin Plantillas: No utiliza plantillas, lo que simplifica la gestión y reduce la complejidad.
  • Superposiciones (Overlays): Permite definir configuraciones específicas para diferentes entornos (desarrollo, producción, etc.).
  • Transformaciones: Aplica transformaciones a los recursos, como cambiar etiquetas, nombres, imágenes, etc.

Instalación de Kustomize

Kustomize se puede instalar como una herramienta independiente o se puede utilizar a través de kubectl, ya que está integrado en kubectl a partir de la versión 1.14.

Instalación Independiente

# Descargar la última versión de Kustomize
curl -s "https://api.github.com/repos/kubernetes-sigs/kustomize/releases/latest" | \
  grep browser_download_url | \
  grep linux | \
  cut -d '"' -f 4 | \
  wget -qi -

# Descomprimir el archivo descargado
tar -xzf kustomize_v*.tar.gz

# Mover el binario a una ubicación en el PATH
sudo mv kustomize /usr/local/bin/

Uso con kubectl

Si tienes kubectl versión 1.14 o superior, puedes usar Kustomize directamente:

kubectl kustomize <ruta-a-tu-kustomization>

Conceptos Básicos de Kustomize

Kustomization.yaml

El archivo kustomization.yaml es el núcleo de Kustomize. Define los recursos y las transformaciones que se aplicarán.

Ejemplo de kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml
  - service.yaml

namePrefix: dev-
commonLabels:
  app: my-app

Recursos

Los recursos son los archivos YAML de Kubernetes que se van a personalizar. Se especifican en la sección resources del archivo kustomization.yaml.

Transformaciones

Kustomize permite aplicar varias transformaciones a los recursos:

  • namePrefix: Añade un prefijo a los nombres de los recursos.
  • commonLabels: Añade etiquetas comunes a todos los recursos.
  • images: Cambia las imágenes de los contenedores.

Ejemplo de Transformaciones

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml
  - service.yaml

namePrefix: dev-
commonLabels:
  app: my-app

images:
  - name: nginx
    newTag: 1.19.6

Superposiciones (Overlays)

Las superposiciones permiten definir configuraciones específicas para diferentes entornos. Por ejemplo, puedes tener una configuración base y superposiciones para desarrollo y producción.

Estructura de Directorios

.
├── base
│   ├── deployment.yaml
│   ├── service.yaml
│   └── kustomization.yaml
└── overlays
    ├── dev
    │   └── kustomization.yaml
    └── prod
        └── kustomization.yaml

Ejemplo de Superposición

base/kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml
  - service.yaml

overlays/dev/kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - ../../base

namePrefix: dev-
commonLabels:
  env: development

overlays/prod/kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - ../../base

namePrefix: prod-
commonLabels:
  env: production

Ejercicio Práctico

Objetivo

Crear una configuración base y superposiciones para desarrollo y producción utilizando Kustomize.

Pasos

  1. Crear la estructura de directorios:

    mkdir -p my-app/{base,overlays/{dev,prod}}
    
  2. Crear los archivos de recursos en base:

    base/deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-app
            image: nginx:1.19.6
            ports:
            - containerPort: 80
    

    base/service.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-app
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    

    base/kustomization.yaml:

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    
    resources:
      - deployment.yaml
      - service.yaml
    
  3. Crear las superposiciones:

    overlays/dev/kustomization.yaml:

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    
    resources:
      - ../../base
    
    namePrefix: dev-
    commonLabels:
      env: development
    

    overlays/prod/kustomization.yaml:

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    
    resources:
      - ../../base
    
    namePrefix: prod-
    commonLabels:
      env: production
    
  4. Aplicar las configuraciones:

    kubectl apply -k overlays/dev
    kubectl apply -k overlays/prod
    

Solución

La solución consiste en verificar que los recursos se hayan creado correctamente con los prefijos y etiquetas correspondientes.

kubectl get all -l env=development
kubectl get all -l env=production

Conclusión

Kustomize es una herramienta poderosa para gestionar configuraciones de Kubernetes de manera declarativa y sin plantillas. Permite aplicar transformaciones y superposiciones de manera sencilla, facilitando la gestión de configuraciones en diferentes entornos. Con Kustomize, puedes mantener tus archivos YAML limpios y organizados, lo que mejora la mantenibilidad y la escalabilidad de tus despliegues en Kubernetes.

Curso de Kubernetes

Módulo 1: Introducción a Kubernetes

Módulo 2: Componentes Principales de Kubernetes

Módulo 3: Gestión de Configuración y Secretos

Módulo 4: Redes en Kubernetes

Módulo 5: Almacenamiento en Kubernetes

Módulo 6: Conceptos Avanzados de Kubernetes

Módulo 7: Monitoreo y Registro

Módulo 8: Seguridad en Kubernetes

Módulo 9: Escalado y Rendimiento

Módulo 10: Ecosistema y Herramientas de Kubernetes

Módulo 11: Estudios de Caso y Aplicaciones del Mundo Real

Módulo 12: Preparación para la Certificación de Kubernetes

© Copyright 2024. Todos los derechos reservados