Como criar um balanceador de carga

Neste tópico, mostramos como configurar um AWS Elastic Load Balancer (ELB) com clusters Anthos no AWS (GKE na AWS).

Quando você cria um Serviço do tipo LoadBalancer, os clusters do Anthos no controlador da AWS configuram um ELB clássico ou de rede em AWS.

Você também pode seguir o Guia de início rápido para criar um ELB externo externamente no Console do Google Cloud ou Criar um AWS Application Load Balancer (ALB).

Antes de começar

Antes de começar a usar os clusters do Anthos na AWS, realize as tarefas a seguir:

  • Instale um serviço de gerenciamento.
  • Crie um cluster de usuário.
  • No diretório anthos-aws, use anthos-gke para alternar o contexto para o cluster de usuário.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Substitua CLUSTER_NAME pelo nome do cluster de usuários.
  • Tenha a ferramenta de linha de comando curl ou uma ferramenta semelhante instalada.

Como selecionar um balanceador de carga externo ou interno

Os clusters do Anthos na AWS criam um balanceador de carga externo, na sub-rede pública, ou interno, na sub-rede privada, dependendo de uma anotação para o recurso LoadBalancer.

Se você selecionar um balanceador de carga externo, ele poderá ser acessado pelos endereços IP permitidos nos grupos de segurança do pool de nós e pelo controle de acesso à rede da sub-rede. (ACLs).

Como escolher um tipo de balanceador de carga

Escolha se você quiser criar um balanceador de carga clássico (ELB clássico) ou um balanceador de carga de rede (NLB, na sigla em inglês). Para mais informações sobre as diferenças entre os tipos de balanceador de carga, consulte Tipos de balanceador de carga na documentação da AWS.

Como criar um LoadBalancer

Você cria um balanceador de carga criando uma implantação e expondo essa implantação com um serviço.

  1. Crie a implantação. Os contêineres nesta implantação detectam atividade na porta 50001. Salve o seguinte YAML em um arquivo chamado 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. Crie a implantação com kubectl apply:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-deployment-50001.yaml
    
  3. Verifique se três pods estão em execução:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods --selector=app=products
    
  4. Crie um Serviço do tipo LoadBalancer para sua implantação. É possível criar um ELB clássico ou de rede na sua sub-rede pública ou particular. Escolha uma das seguintes opções:

    • Um ELB clássico na sub-rede pública
    • Um NLB na sub-rede pública
    • Um ELB clássico na sub-rede particular
    • Um NLB na sub-rede particular

    Em seguida, copie o seguinte manifesto para um arquivo chamado my-lb-service.yaml.

    Público (clássico)

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

    Público (NLB)

    Você cria um NLB definindo a anotação service.beta.kubernetes.io/aws-load-balancer-type como nlb. O YAML a seguir inclui essa anotação.

    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
    

    Particular (clássico)

    Para criar um LoadBalancer particular, defina a anotação service.beta.kubernetes.io/aws-load-balancer-internal como "true". O YAML a seguir inclui essa anotação.

    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
    

    Particular (NLB)

    Crie um NLB particular definindo as anotações:

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

    O YAML a seguir inclui as duas anotações.

    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. Crie o Serviço com kubectl apply:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-lb-service.yaml
    
  6. Veja o nome do host do Serviço com kubectl get service.

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

    A saída é semelhante a elb-id.elb.aws-region.amazonaws.com.

  7. Se você tiver criado um balanceador de carga externo e tiver acesso à sub-rede VPC pública, será possível se conectar ao balanceador de carga com curl. Substitua external-ip pelo IP da saída de kubectl get service da etapa anterior.

    curl external-ip:60000
    

    A saída será assim:

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

Limpeza

Para remover o Serviço e a implantação, use 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

Solução de problemas

Se não for possível acessar um endpoint do balanceador de carga, tente incluir tags nas sub-redes.

A seguir