Crea un balanceador de cargas

En este tema, se muestra cómo configurar un balanceador de cargas Elastic (ELB) de AWS con clústeres de Anthos en AWS (GKE en AWS).

Cuando creas un servicio de tipo LoadBalancer, un controlador de los clústeres de Anthos en AWS configura un ELB clásico o de red en AWS.

También puedes seguir la Guía de inicio rápido para crear un ELB clásico de forma externa desde Google Cloud Console o crear un balanceador de cargas de aplicaciones (ALB) de AWS.

Antes de comenzar

Antes de comenzar a usar clústeres de Anthos alojados en AWS, asegúrate de haber realizado las siguientes tareas:

  • Instalar un servicio de administración
  • Crear un clúster de usuario
  • Desde el directorio anthos-aws, usa anthos-gke para cambiar el contexto al clúster de usuario.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Reemplaza CLUSTER_NAME por el nombre de tu clúster de usuario.
  • Ten instalada la herramienta de línea de comandos de curl o una herramienta similar.

Selecciona un balanceador de cargas externo o interno

Los clústeres de Anthos en AWS crean un balanceador de cargas externo (en tu subred pública) o interno (en tu subred privada) según una anotación al recurso LoadBalancer.

Si seleccionas un balanceador de cargas externo, se puede acceder a este mediante las direcciones IP permitidas en los grupos de seguridad del grupo de nodos y las listas de control de acceso (LCA) de red de la subred.

Elige un tipo de balanceador de cargas

Elige si deseas crear un Classic Load Balancer (Classic ELB) o un Network Load Balancer (NLB). Para obtener más información sobre las diferencias entre los tipos de balanceadores de cargas, consulta Tipos de balanceadores de cargas en la documentación de AWS.

Crea un LoadBalancer

Para crear un balanceador de cargas, debes crear una implementación y exponerla con un servicio.

  1. Crea la implementación. Los contenedores de este objeto Deployment escuchan en el puerto 50001. Guarda el siguiente YAML en un archivo llamado my-deployment-50001.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment-50001
    spec:
      selector:
        matchLabels:
          app: products
          department: sales
      replicas: 3
      template:
        metadata:
          labels:
            app: products
            department: sales
        spec:
          containers:
          - name: hello
            image: "gcr.io/google-samples/hello-app:2.0"
            env:
            - name: "PORT"
              value: "50001"
    
  2. Crea el Deployment con kubectl apply:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-deployment-50001.yaml
    
  3. Verifica que los tres Pods estén en ejecución:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods --selector=app=products
    
  4. Crea un Service de tipo LoadBalancer para la implementación. Puedes crear un Classic ELB o un Network ELB en la subred pública o en la privada. Elige una de las siguientes opciones:

    • Un Classic ELB en la subred pública
    • Un NLB en la subred pública
    • Un Classic ELB en la subred privada
    • Un NLB en la subred privada

    Luego, copia el siguiente manifiesto a un archivo llamado my-lb-service.yaml.

    Classic público

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    NLB público

    Para crear un NLB, configura la anotación service.beta.kubernetes.io/aws-load-balancer-type como nlb. En el siguiente YAML, se incluye esta anotación.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    Classic privado

    Crea un LoadBalancer privado mediante la configuración de la anotación service.beta.kubernetes.io/aws-load-balancer-internal como "true". En el siguiente YAML, se incluye esta anotación.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    NLB privado

    Para crear un NLB privado, configura las anotaciones de esta manera:

    • Configura service.beta.kubernetes.io/aws-load-balancer-internal como "true".
    • Configura service.beta.kubernetes.io/aws-load-balancer-type como nlb.

    En el siguiente YAML, se incluyen ambas anotaciones.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    
  5. Crea el Service con kubectl apply:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-lb-service.yaml
    
  6. Visualiza el nombre de host del Service con kubectl get service.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get service my-lb-service \
      --output jsonpath="{.status.loadBalancer.ingress..hostname}{'\n'}"
    

    El resultado se parece a elb-id.elb.aws-region.amazonaws.com.

  7. Si creaste un balanceador de cargas externo y tienes acceso a la subred de VPC pública, puedes conectarte al balanceador de cargas con curl. Reemplaza external-ip por la IP del resultado de kubectl get service del paso anterior.

    curl external-ip:60000
    

    El resultado se parece al siguiente:

    Hello, world!
    Version: 2.0.0
    Hostname: my-deployment-50001-84b6dc5555-zmk7q
    

Realice una limpieza

Para quitar Service y Deployment, usa kubectl delete.

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f my-lb-service.yaml

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f my-deployment-50001.yaml

Soluciona problemas

Si no puedes acceder a un extremo del balanceador de cargas, intenta etiquetar tus subredes.

Qué sigue