Criar um balanceador de carga

Este tópico mostra como configurar um AWS Elastic Load Balancer (ELB) com o GKE no AWS.

Quando cria um serviço do tipo LoadBalancer, um controlador do GKE on AWS configura um ELB clássico ou de rede na AWS.

Também pode seguir o Início rápido para criar um ELB clássico externo a partir da consola Google Cloud ou criar um equilibrador de carga de aplicações (ALB) da AWS.

Antes de começar

Antes de começar a usar o GKE on AWS, certifique-se de que realizou as seguintes tarefas:

  • Instale um serviço de gestão.
  • Crie um cluster de utilizadores.
  • No diretório do anthos-aws, use anthos-gke para mudar o contexto para o cluster de utilizadores.
    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 utilizadores.
  • Ter a ferramenta de linha de comandos curl ou uma ferramenta semelhante instalada.

Selecionar um balanceador de carga externo ou interno

O GKE on AWS cria um balanceador de carga externo (na sua sub-rede pública) ou interno (na sua sub-rede privada) consoante uma anotação ao recurso LoadBalancer.

Se selecionar um equilibrador de carga externo, este fica acessível pelos endereços IP permitidos nos grupos de segurança do conjunto de nós e nas listas de controlo de acesso (ACLs) da sub-rede.

Escolher um tipo de balanceador de carga

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

Criar um LoadBalancer

Cria um balanceador de carga criando uma implementação e expondo essa implementação com um serviço.

  1. Crie a sua implementação. Os contentores nesta implementação ouvem na porta 50001. Guarde o seguinte YAML num ficheiro com o nome 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 implementação com kubectl apply:

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

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods --selector=app=products
    
  4. Crie um serviço do tipo LoadBalancer para a sua implementação. Pode criar um ELB clássico ou de rede na sua sub-rede pública ou privada. 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 privada
    • Um NLB na sub-rede privada

    Em seguida, copie o seguinte manifesto para um ficheiro denominado 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
    

    NLB Public

    Cria um NLB definindo a anotação service.beta.kubernetes.io/aws-load-balancer-type como nlb. O YAML seguinte inclui esta 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
    

    Clássico privado

    Crie um LoadBalancer privado definindo a anotação service.beta.kubernetes.io/aws-load-balancer-internal como "true". O YAML seguinte inclui esta 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
    

    NLB privado

    Crie um NLB privado 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 seguinte inclui ambas as 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 de anfitrião 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'}"
    

    O resultado é semelhante a elb-id.elb.aws-region.amazonaws.com.

  7. Se criou um balanceador de carga virado para o exterior e tem acesso à sub-rede da VPC pública, pode ligar-se ao balanceador de carga com curl. Substitua external-ip pelo IP da saída de kubectl get service do passo anterior.

    curl external-ip:60000
    

    O resultado é semelhante ao seguinte:

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

Limpar

Para remover o serviço e a implementaçã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

Resolução de problemas

Se não conseguir aceder a um ponto final do balanceador de carga, experimente etiquetar as suas sub-redes.

O que se segue