En Kubernetes, los servicios son un recurso fundamental que permite la comunicación entre diferentes componentes de una aplicación, así como con el mundo exterior. Los servicios proporcionan una abstracción sobre los pods, permitiendo el descubrimiento y la comunicación de manera estable y confiable. En esta sección, exploraremos los diferentes tipos de servicios que Kubernetes ofrece y cómo se utilizan.

Tipos de Servicios en Kubernetes

Kubernetes soporta varios tipos de servicios, cada uno diseñado para diferentes casos de uso. Los tipos de servicios más comunes son:

  1. ClusterIP
  2. NodePort
  3. LoadBalancer
  4. ExternalName

  1. ClusterIP

ClusterIP es el tipo de servicio por defecto en Kubernetes. Este tipo de servicio expone el servicio internamente dentro del clúster, asignándole una dirección IP interna accesible solo desde dentro del clúster.

Características:

  • No es accesible desde fuera del clúster.
  • Utilizado para la comunicación interna entre los pods.

Ejemplo de YAML para un servicio ClusterIP:

apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

  1. NodePort

NodePort expone el servicio en cada nodo del clúster en un puerto específico. Este tipo de servicio permite el acceso externo al clúster a través de la IP del nodo y el puerto asignado.

Características:

  • Accesible desde fuera del clúster.
  • Asigna un puerto en el rango 30000-32767 en cada nodo.

Ejemplo de YAML para un servicio NodePort:

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30007
  type: NodePort

  1. LoadBalancer

LoadBalancer crea un balanceador de carga externo que distribuye el tráfico a los pods del servicio. Este tipo de servicio es ideal para aplicaciones que necesitan ser accesibles desde fuera del clúster y requieren balanceo de carga.

Características:

  • Proporciona una IP externa para el servicio.
  • Utiliza el balanceador de carga del proveedor de nube (AWS, GCP, Azure, etc.).

Ejemplo de YAML para un servicio LoadBalancer:

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

  1. ExternalName

ExternalName mapea un servicio a un nombre DNS externo. Este tipo de servicio no asigna una IP ni abre puertos, sino que actúa como un alias para un nombre DNS externo.

Características:

  • No expone el servicio dentro del clúster.
  • Utilizado para redirigir el tráfico a servicios externos.

Ejemplo de YAML para un servicio ExternalName:

apiVersion: v1
kind: Service
metadata:
  name: my-externalname-service
spec:
  type: ExternalName
  externalName: example.com

Comparación de Tipos de Servicios

Tipo de Servicio Accesibilidad Uso Principal Requiere Balanceador de Carga
ClusterIP Interna Comunicación interna entre pods No
NodePort Externa Acceso externo al clúster No
LoadBalancer Externa Acceso externo con balanceo de carga
ExternalName Externa Redirección a servicios externos No

Ejercicio Práctico

Ejercicio 1: Crear un Servicio NodePort

  1. Crea un archivo YAML llamado nodeport-service.yaml con el siguiente contenido:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-nodeport-service
    spec:
      selector:
        app: MyApp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
          nodePort: 30007
      type: NodePort
    
  2. Aplica el archivo YAML para crear el servicio:

    kubectl apply -f nodeport-service.yaml
    
  3. Verifica que el servicio se ha creado correctamente:

    kubectl get services
    

Solución del Ejercicio

Al ejecutar los comandos anteriores, deberías ver una salida similar a la siguiente:

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
my-nodeport-service  NodePort    10.96.0.1        <none>        80:30007/TCP   1m

Esto indica que el servicio my-nodeport-service ha sido creado y está accesible en el puerto 30007 de cada nodo del clúster.

Conclusión

En esta sección, hemos explorado los diferentes tipos de servicios en Kubernetes y sus usos. Entender cuándo y cómo utilizar cada tipo de servicio es crucial para diseñar aplicaciones escalables y accesibles en Kubernetes. En la próxima sección, profundizaremos en los controladores de Ingress, que proporcionan una forma más avanzada de gestionar el acceso externo a los servicios 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