Configurar balanceadores de carga externos

Os balanceadores de carga externos (ELB, na sigla em inglês) expõem serviços para acesso de fora da organização usando endereços IP de um pool atribuído à organização do pool maior de IP externo da instância.

Os endereços IP virtuais (VIPs) do ELB não entram em conflito entre organizações e são exclusivos em todas elas. Por isso, use os serviços do ELB apenas para serviços que os clientes fora da organização precisam acessar.

As cargas de trabalho em execução dentro da organização podem acessar os serviços do ELB, desde que você permita que elas saiam da organização. Esse padrão de tráfego exige o tráfego de saída da organização antes de retornar ao serviço interno.

Antes de começar

Para configurar os serviços do ELB, você precisa do seguinte:

  • Ser proprietário do projeto em que você está configurando o balanceador de carga. Para mais informações, consulte Criar um projeto.
  • Uma política de entrada ProjectNetworkPolicy (PNP) personalizada para permitir o tráfego para esse serviço do ELB. Para mais informações, consulte Configurar o PNP para permitir o tráfego para o ELB.
  • Os papéis necessários de identidade e acesso:

    • Administrador da NetworkPolicy do projeto: tem acesso para gerenciar políticas de rede do projeto no namespace do projeto. Peça ao administrador do IAM da organização para conceder a você o papel de Administrador da NetworkPolicy do projeto (project-networkpolicy-admin).
    • Administrador do balanceador de carga: peça ao administrador do IAM da organização para conceder a você o papel de administrador do balanceador de carga (load-balancer-admin).
    • Administrador global do balanceador de carga: para ELBs globais, peça ao administrador do IAM da organização para conceder a você o papel de administrador global do balanceador de carga (global-load-balancer-admin). Para mais informações, consulte Descrições de papéis predefinidos.

Configurar o PNP para permitir o tráfego para o ELB

Para que os serviços do ELB funcionem, configure e aplique sua própria política de entrada ProjectNetworkPolicy personalizada para permitir o tráfego para as cargas de trabalho desse serviço do ELB. As políticas de rede controlam o acesso às cargas de trabalho, não ao balanceador de carga em si. Os ELBs expõem cargas de trabalho à rede do cliente, exigindo políticas de rede explícitas para permitir o tráfego externo à porta da carga de trabalho, como 8080.

Especifique o endereço CIDR externo para permitir o tráfego para as cargas de trabalho deste ELB:

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: allow-inbound-traffic-from-external
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - ipBlock:
        cidr: CIDR
    ports:
    - protocol: TCP
      port: PORT
EOF

Substitua:

  • MANAGEMENT_API_SERVER: o caminho kubeconfig do servidor da API Management. Se você ainda não gerou um arquivo kubeconfig para o servidor da API na zona de destino, consulte Fazer login para mais detalhes.
  • PROJECT: o nome do seu projeto do GDC.
  • CIDR: o CIDR externo de onde o ELB precisa ser acessado. Essa política é necessária porque o balanceador de carga externo usa o retorno direto do servidor (DSR, na sigla em inglês), que preserva o endereço IP externo de origem e ignora o balanceador de carga no caminho de retorno. Para mais informações, consulte Criar uma regra de firewall de entrada global para tráfego entre organizações.
  • PORT: a porta de back-end nos pods atrás do balanceador de carga. Esse valor é encontrado no campo .spec.ports[].targetPort do manifesto para o recurso Service. Este campo é opcional.

Criar um balanceador de carga externo

É possível criar ELBs globais ou zonais. O escopo dos ELBs globais abrange um universo do GDC. O escopo dos ELBs zonais é limitado à zona especificada no momento da criação. Para mais informações, consulte Balanceadores de carga globais e zonais.

Crie ELBs usando três métodos diferentes no GDC:

É possível segmentar cargas de trabalho de pods ou VMs usando a API KRM e a CLI gdcloud. Só é possível segmentar cargas de trabalho no cluster em que o objeto Service é criado ao usar o serviço do Kubernetes diretamente no cluster do Kubernetes.

Criar um ELB zonal

Crie um ELB zonal usando a CLI gdcloud, a API KRM ou o serviço do Kubernetes no cluster do Kubernetes:

gdcloud

Crie um ELB que tenha como destino cargas de trabalho de pod ou VM usando a CLI gdcloud.

Esse ELB tem como destino todas as cargas de trabalho no projeto que correspondem ao rótulo definido no objeto Backend.

Para criar um ELB usando a CLI gdcloud, siga estas etapas:

  1. Crie um recurso Backend para definir o endpoint do ELB:

    gdcloud compute backends create BACKEND_NAME \
      --labels=LABELS \
      --project=PROJECT_NAME \
      --zone=ZONE \
      --cluster=CLUSTER_NAME
    

    Substitua:

    • BACKEND_NAME: o nome escolhido para o recurso de back-end, como my-backend.
    • LABELS: um seletor que define quais endpoints entre pods e VMs usar para esse recurso de back-end. Por exemplo, app=web.
    • PROJECT_NAME: o nome do projeto.
    • ZONE: a zona a ser usada para essa invocação. Para definir previamente a flag de zona para todos os comandos que a exigem, execute: gdcloud config set core/zone ZONE. A flag de zona está disponível apenas em ambientes multizona. Este campo é opcional.
    • CLUSTER_NAME: o cluster a que o escopo dos seletores definidos é limitado. Se esse campo não for especificado, todos os endpoints com o rótulo indicado serão selecionados. Este campo é opcional.
  2. Pule esta etapa se o ELB for para cargas de trabalho de pod. Se você estiver configurando um ELB para cargas de trabalho de VM, defina uma verificação de integridade para o ELB:

    gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \
      --check-interval=CHECK_INTERVAL \
      --healthy-threshold=HEALTHY_THRESHOLD \
      --timeout=TIMEOUT \
      --unhealthy-threshold=UNHEALTHY_THRESHOLD \
      --port=PORT \
      --zone=ZONE
    

    Substitua:

    • HEALTH_CHECK_NAME: o nome escolhido para o recurso de verificação de integridade, como my-health-check.
    • CHECK_INTERVAL: o tempo em segundos entre o início de uma sondagem e o início da próxima. O valor padrão é 5. Este campo é opcional.
    • HEALTHY_THRESHOLD: o tempo a ser aguardado antes de declarar falha. O valor padrão é 5. Este campo é opcional.
    • TIMEOUT: o tempo em segundos para aguardar antes de declarar falha. O valor padrão é 5. Este campo é opcional.
    • UNHEALTHY_THRESHOLD: o número de sondagens seguidas que precisam falhar para que o endpoint seja considerado não íntegro. O valor padrão é 2. Este campo é opcional.
    • PORT: a porta em que a verificação de integridade é realizada. O valor padrão é 80. Este campo é opcional.
    • ZONE: a zona em que você está criando o ELB.
  3. Crie um recurso BackendService e adicione a ele o recurso Backend criado anteriormente:

    gdcloud compute backend-services create BACKEND_SERVICE_NAME \
      --project=PROJECT_NAME \
      --target-ports=TARGET_PORTS \
      --zone=ZONE \
      --health-check=HEALTH_CHECK_NAME
    

    Substitua:

    • BACKEND_SERVICE_NAME: o nome escolhido para esse serviço de back-end.
    • TARGET_PORT: uma lista separada por vírgulas de portas de destino que esse serviço de back-end traduz, em que cada porta de destino especifica o protocolo, a porta na regra de encaminhamento e a porta na instância de back-end. É possível especificar várias portas de destino. Esse campo precisa estar no formato protocol:port:targetport, como TCP:80:8080. Este campo é opcional.
    • HEALTH_CHECK_NAME: o nome do recurso de verificação de integridade. Este campo é opcional. Inclua esse campo apenas se você estiver configurando um ELB para cargas de trabalho de VM.
  4. Adicione o recurso BackendService ao recurso Backend criado anteriormente:

    gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --backend=BACKEND_NAME \
      --project=PROJECT_NAME \
      --zone=ZONE
    
  5. Opcional: use afinidade da sessão para ELBs e garanta que as solicitações do mesmo cliente sejam sempre encaminhadas para o mesmo back-end. Para ativar afinidade da sessão para balanceadores de carga, crie uma política de serviço de back-end usando o comando gdcloud compute load-balancer-policy create:

     gdcloud compute load-balancer-policy create POLICY_NAME
     --session-affinity=MODE
     --selectors=RESOURCE_LABEL
    

    Substitua:

    • POLICY_NAME: o nome escolhido para a política de serviço de back-end.
    • MODE: o modo de afinidade da sessão. Há dois modos compatíveis:

      • NONE: a afinidade da sessão está desativada. As solicitações são encaminhadas para qualquer back-end disponível. Esse é o modo padrão.
      • CLIENT_IP_DST_PORT_PROTO: as solicitações da mesma tupla de quatro elementos (endereço IP de origem, endereço IP de destino, porta de destino e protocolo) são roteadas para o mesmo back-end.
    • RESOURCE_LABEL: o seletor de rótulos que seleciona a qual serviço de back-end o recurso BackendServicePolicy é aplicado no namespace do projeto. Se vários recursos BackendServicePolicy corresponderem ao mesmo serviço de back-end e pelo menos uma dessas políticas tiver a afinidade da sessão ativada, a afinidade da sessão para esse recurso BackendService será ativada.

  6. Crie um recurso ForwardingRule externo que defina o VIP em que o serviço está disponível:

    gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \
      --backend-service=BACKEND_SERVICE_NAME \
      --cidr=CIDR \
      --ip-protocol-port=PROTOCOL_PORT \
      --load-balancing-scheme=EXTERNAL \
      --zone=ZONE \
      --project=PROJECT_NAME
    

    Substitua:

    • BACKEND_SERVICE_NAME: o nome do seu serviço de back-end.
    • FORWARDING_RULE_EXTERNAL_NAME: o nome escolhido para a regra de encaminhamento.
    • CIDR: este campo é opcional. Se não for especificado, um CIDR IPv4/32 será reservado automaticamente do pool de IP zonal. Especifique o nome de um recurso Subnet no mesmo namespace que esta regra de encaminhamento. Um recurso Subnet representa as informações de solicitação e alocação de uma sub-rede zonal. Para mais informações sobre recursos Subnet, consulte Exemplo de recursos personalizados.
    • PROTOCOL_PORT: o protocolo e a porta a serem expostos na regra de encaminhamento. Esse campo precisa estar no formato ip-protocol=TCP:80. A porta exposta precisa ser a mesma que o aplicativo real está expondo dentro do contêiner.
  7. Para verificar o ELB configurado, confirme a condição Ready em cada um dos objetos criados. Para receber o endereço IP atribuído do balanceador de carga, descreva a regra de encaminhamento:

    gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
    
  8. Para validar o ELB configurado, confirme a condição Ready em cada um dos objetos criados. Verifique o tráfego com uma solicitação curl para o VIP:

    1. Para receber o VIP atribuído, descreva a regra de encaminhamento:

      gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
      
    2. Verifique o tráfego com uma solicitação curl para o VIP na porta especificada no campo PROTOCOL_PORT da regra de encaminhamento:

      curl http://FORWARDING_RULE_VIP:PORT
      

      Substitua:

      • FORWARDING_RULE_VIP: o VIP da regra de encaminhamento.
      • PORT: o número da porta do campo PROTOCOL_PORT na regra de encaminhamento.

API

Crie um ELB que tenha como destino cargas de trabalho de pod ou VM usando a API KRM. Esse ELB tem como destino todas as cargas de trabalho no projeto que correspondem ao rótulo definido no objeto Backend.

Para criar um ELB zonal usando a API KRM, siga estas etapas:

  1. Crie um recurso Backend para definir os endpoints do ELB. Crie recursos Backend para cada zona em que as cargas de trabalho estão localizadas:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: Backend
    metadata:
      namespace: PROJECT_NAME
      name: BACKEND_NAME
    spec:
      clusterName: CLUSTER_NAME
      endpointsLabels:
        matchLabels:
          app: server
    EOF
    

    Substitua:

    • MANAGEMENT_API_SERVER: o caminho kubeconfig do servidor da API Management zonal. Para mais informações, consulte Mudar para um contexto zonal.
    • PROJECT_NAME: o nome do projeto.
    • BACKEND_NAME: o nome do recurso ;Backend
    • CLUSTER_NAME: este é um campo opcional. Esse campo especifica o cluster a que o escopo dos seletores definidos está limitado. Esse campo não se aplica a cargas de trabalho de VM. Se um recurso Backend não tiver o campo clusterName incluído, os rótulos especificados serão aplicados a todas as cargas de trabalho no projeto.
  2. Pule esta etapa se o ELB for para cargas de trabalho de pod. Se você estiver configurando um ELB para cargas de trabalho de VM, defina uma verificação de integridade para o ELB:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: HealthCheck
    metadata:
      namespace: PROJECT_NAME
      name: HEALTH_CHECK_NAME
    spec:
      tcpHealthCheck:
        port: PORT
      timeoutSec: TIMEOUT
      checkIntervalSec: CHECK_INTERVAL
      healthyThreshold: HEALTHY_THRESHOLD
      unhealthyThreshold: UNHEALTHY_THRESHOLD
    EOF
    

    Substitua:

    • HEALTH_CHECK_NAME: o nome escolhido para o recurso de verificação de integridade, como my-health-check.
    • PORT: a porta em que a verificação de integridade é realizada. O valor padrão é 80.
    • TIMEOUT: o tempo em segundos para aguardar antes de declarar falha. O valor padrão é 5.
    • CHECK_INTERVAL: o tempo em segundos entre o início de uma sondagem e o início da próxima. O valor padrão é 5.
    • HEALTHY_THRESHOLD: o número de sondagens sequenciais que precisam ser aprovadas para que o endpoint seja considerado íntegro. O valor padrão é 2.
    • UNHEALTHY_THRESHOLD: o número de sondagens seguidas que precisam falhar para que o endpoint seja considerado não íntegro. O valor padrão é 2.
  3. Crie um objeto BackendService usando o recurso Backend criado anteriormente. Se você estiver configurando um ELB para cargas de trabalho de VM, inclua o recurso HealthCheck.

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: BackendService
    metadata:
      namespace: PROJECT_NAME
      name: BACKEND_SERVICE_NAME
    spec:
      backendRefs:
      - name: BACKEND_NAME
      healthCheckName: HEALTH_CHECK_NAME
    EOF
    

    Substitua:

    • BACKEND_SERVICE_NAME: o nome escolhido para o recurso BackendService.
    • HEALTH_CHECK_NAME: o nome do recurso HealthCheck criado anteriormente. Não inclua esse campo se estiver configurando um ELB para cargas de trabalho de pod.
  4. Opcional: use afinidade da sessão para ELBs e garanta que as solicitações do mesmo cliente sejam sempre encaminhadas para o mesmo back-end. Para ativar afinidade da sessão para balanceadores de carga, crie um recurso BackendServicePolicy. Esse recurso define as configurações de afinidade da sessão e aplica o recurso BackendServicePolicy ao recurso BackendService. Crie e aplique o recurso BackendServicePolicy:

     kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
     apiVersion: networking.global.gdc.goog/v1
     kind: BackendServicePolicy
     metadata:
         namespace: PROJECT_NAME
         name: POLICY_NAME
     spec:
         sessionAffinity: MODE
         selector:
             matchLabels:
               RESOURCE_LABEL
    

    Substitua:

    • POLICY_NAME: o nome escolhido para a política de serviço de back-end.
    • MODE: o modo de afinidade da sessão. Há dois modos compatíveis:

      • NONE: a afinidade da sessão está desativada. As solicitações são encaminhadas para qualquer back-end disponível. Esse é o modo padrão.
      • CLIENT_IP_DST_PORT_PROTO: as solicitações da mesma tupla de quatro elementos (endereço IP de origem, endereço IP de destino, porta de destino e protocolo) são roteadas para o mesmo back-end.
    • RESOURCE_LABEL: o seletor de rótulos que seleciona a qual serviço de back-end o recurso BackendServicePolicy é aplicado no namespace do projeto. Se vários recursos BackendServicePolicy corresponderem ao mesmo serviço de back-end e pelo menos uma dessas políticas tiver a afinidade da sessão ativada, a afinidade da sessão para esse recurso BackendService será ativada.

  5. Crie um recurso ForwardingRule externo que defina o VIP em que o serviço está disponível.

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: ForwardingRuleExternal
    metadata:
      namespace: PROJECT_NAME
      Name: FORWARDING_RULE_EXTERNAL_NAME
    spec:
      cidrRef: CIDR
      ports:
      - port: PORT
        Protocol: PROTOCOL
      backendServiceRef:
        name: BACKEND_SERVICE_NAME
    EOF
    

    Substitua:

    • BACKEND_SERVICE_NAME: o nome do recurso BackendService.
    • FORWARDING_RULE_EXTERNAL_NAME: o nome escolhido para o recurso ForwardingRuleExternal.
    • CIDR: este campo é opcional. Se não for especificado, um CIDR IPv4/32 será reservado automaticamente do pool de IP zonal. Especifique o nome de um recurso Subnet no mesmo namespace que esta regra de encaminhamento. Um recurso Subnet representa as informações de solicitação e alocação de uma sub-rede zonal. Para mais informações sobre recursos Subnet, consulte Exemplos de recursos personalizados.
    • PORT: use o campo ports para especificar uma matriz de portas L4 para as quais os pacotes são encaminhados aos back-ends configurados com essa regra de encaminhamento. É necessário especificar pelo menos uma porta. Use o campo port para especificar um número de porta. A porta exposta precisa ser a mesma que o aplicativo real está expondo dentro do contêiner.
    • PROTOCOL: o protocolo a ser usado para a regra de encaminhamento, como TCP. Uma entrada na matriz ports precisa ser assim:

      ports:
      - port: 80
        protocol: TCP
      
  6. Para validar o ELB configurado, confirme a condição Ready em cada um dos objetos criados. Verifique o tráfego com uma solicitação curl para o VIP:

    1. Para conseguir o VIP, use kubectl get:

      kubectl get forwardingruleexternal -n PROJECT_NAME
      

      A saída será assim:

      NAME           BACKENDSERVICE                               CIDR              READY
      elb-name       BACKEND_SERVICE_NAME        10.200.32.59/32   True
      
    2. Verifique o tráfego com uma solicitação curl para o VIP na porta especificada no campo PORT da regra de encaminhamento:

      curl http://FORWARDING_RULE_VIP:PORT
      

      Substitua FORWARDING_RULE_VIP pelo VIP da regra de encaminhamento.

Serviço do Kubernetes

Para criar ELBs no GDC, crie um Service do Kubernetes do tipo LoadBalancer em um cluster do Kubernetes.

Para criar um serviço do ELB, faça o seguinte:

  1. Crie um arquivo YAML para a definição Service do tipo LoadBalancer.

    O objeto Service a seguir é um exemplo de serviço do ELB:

    apiVersion: v1
    kind: Service
    metadata:
      name: ELB_SERVICE_NAME
      namespace: PROJECT_NAME
    spec:
      ports:
      - port: 1235
        protocol: TCP
        targetPort: 1235
      selector:
        k8s-app: my-app
      type: LoadBalancer
    

    Substitua:

    • ELB_SERVICE_NAME: o nome do serviço ELB.
    • PROJECT_NAME: o namespace do projeto que contém as cargas de trabalho de back-end.

    O campo port configura a porta de front-end que você expõe no endereço VIP. O campo targetPort configura a porta de back-end para onde você quer encaminhar o tráfego nas cargas de trabalho de back-end. O balanceador de carga é compatível com a conversão de endereços de rede (NAT, na sigla em inglês). As portas de front-end e back-end podem ser diferentes.

  2. No campo selector da definição Service, especifique pods ou máquinas virtuais como as cargas de trabalho de back-end.

    O seletor define quais cargas de trabalho serão usadas como back-end para esse serviço, com base na correspondência entre os rótulos especificados e os rótulos das cargas de trabalho. O Service só pode selecionar cargas de trabalho de back-end no mesmo projeto e no mesmo cluster em que você define o Service.

    Para mais informações sobre a seleção de serviços, consulte https://kubernetes.io/docs/concepts/services-networking/service/.

  3. Salve o arquivo de definição Service no mesmo projeto que as cargas de trabalho de back-end.

  4. Aplique o arquivo de definição Service ao cluster:

    kubectl apply -f ELB_FILE
    

    Substitua ELB_FILE pelo nome do arquivo de definição Service do serviço ELB.

    Quando você cria um ELB, o serviço recebe dois endereços IP. Um é um endereço IP interno acessível apenas no mesmo cluster. O outro é o endereço IP externo, acessível de dentro e de fora da organização. Para conseguir os endereços IP do serviço ELB, consulte o status dele:

    kubectl -n PROJECT_NAME get svc ELB_SERVICE_NAME
    

    Substitua:

    • PROJECT_NAME: o namespace do projeto que contém as cargas de trabalho de back-end.
    • ELB_SERVICE_NAME: o nome do serviço ELB.

    Você vai receber uma saída semelhante a este exemplo:

    NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
    elb-service             LoadBalancer   10.0.0.1      20.12.1.11      1235:31931/TCP   22h
    

    O EXTERNAL-IP é o endereço IP do serviço acessível de fora da organização.

    Se você não receber uma saída, verifique se criou o serviço ELB com sucesso.

Criar um ELB global

Crie um ELB global usando a CLI gdcloud ou a API KRM.

gdcloud

Crie um ELB que tenha como destino cargas de trabalho de pod ou VM usando a CLI gdcloud.

Esse ELB tem como destino todas as cargas de trabalho no projeto que correspondem ao rótulo definido no objeto Backend. O recurso personalizado Backend precisa ter escopo em uma zona.

Para criar um ELB usando a CLI gdcloud, siga estas etapas:

  1. Crie um recurso Backend para definir o endpoint do ELB:

    gdcloud compute backends create BACKEND_NAME \
      --labels=LABELS \
      --project=PROJECT_NAME \
      --cluster=CLUSTER_NAME \
      --zone=ZONE
    

    Substitua:

    • BACKEND_NAME: o nome escolhido para o recurso de back-end, como my-backend.
    • LABELS: um seletor que define quais endpoints entre pods e VMs usar para esse recurso de back-end. Por exemplo, app=web.
    • PROJECT_NAME: o nome do projeto.
    • CLUSTER_NAME: o cluster a que o escopo dos seletores definidos é limitado. Se esse campo não for especificado, todos os endpoints com o rótulo indicado serão selecionados. Este campo é opcional.
    • ZONE: a zona a ser usada para essa invocação. Para definir a flag de zona para todos os comandos que a exigem, execute: gdcloud config set core/zone ZONE. A flag de zona só está disponível em ambientes multizonais. Este campo é opcional.
  2. Pule esta etapa se o ELB for para cargas de trabalho de pod. Se você estiver configurando um ELB para cargas de trabalho de VM, defina uma verificação de integridade para o ELB:

    gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \
      --check-interval=CHECK_INTERVAL \
      --healthy-threshold=HEALTHY_THRESHOLD \
      --timeout=TIMEOUT \
      --unhealthy-threshold=UNHEALTHY_THRESHOLD \
      --port=PORT \
      --global
    

    Substitua:

    • HEALTH_CHECK_NAME: o nome escolhido para o recurso de verificação de integridade, como my-health-check.
    • CHECK_INTERVAL: o tempo em segundos entre o início de uma sondagem e o início da próxima. O valor padrão é 5. Este campo é opcional.
    • HEALTHY_THRESHOLD: o tempo a ser aguardado antes de declarar falha. O valor padrão é 5. Este campo é opcional.
    • TIMEOUT: o tempo em segundos para aguardar antes de declarar falha. O valor padrão é 5. Este campo é opcional.
    • UNHEALTHY_THRESHOLD: o número de sondagens seguidas que precisam falhar para que o endpoint seja considerado não íntegro. O valor padrão é 2. Este campo é opcional.
    • PORT: a porta em que a verificação de integridade é realizada. O valor padrão é 80. Este campo é opcional.
  3. Crie um recurso BackendService e adicione a ele o recurso Backend criado anteriormente:

    gdcloud compute backend-services create BACKEND_SERVICE_NAME \
      --project=PROJECT_NAME \
      --target-ports=TARGET_PORTS \
      --health-check=HEALTH_CHECK_NAME \
      --global
    

    Substitua:

    • BACKEND_SERVICE_NAME: o nome escolhido para esse serviço de back-end.
    • TARGET_PORTS: uma lista separada por vírgulas de portas de destino que esse serviço de back-end traduz, em que cada porta de destino especifica o protocolo, a porta na regra de encaminhamento e a porta na instância de back-end. É possível especificar várias portas de destino. Esse campo precisa estar no formato protocol:port:targetport, como TCP:80:8080. Este campo é opcional.
    • HEALTH_CHECK_NAME: o nome do recurso de verificação de integridade. Este campo é opcional. Inclua esse campo apenas se você estiver configurando um ELB para cargas de trabalho de VM.
  4. Adicione o recurso BackendService ao recurso Backend criado anteriormente:

    gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --backend=BACKEND_NAME \
      --backend-zone BACKEND_ZONE \
      --project=PROJECT_NAME \
      --global
    
  5. Opcional: use afinidade da sessão para ELBs e garanta que as solicitações do mesmo cliente sejam sempre encaminhadas para o mesmo back-end. Para ativar afinidade da sessão para balanceadores de carga, crie uma política de serviço de back-end usando o comando gdcloud compute load-balancer-policy create:

     gdcloud compute load-balancer-policy create POLICY_NAME
     --session-affinity=MODE
     --selectors=RESOURCE_LABEL
    

    Substitua:

    • POLICY_NAME: o nome escolhido para a política de serviço de back-end.
    • MODE: o modo de afinidade da sessão. Há dois modos compatíveis:

      • NONE: a afinidade da sessão está desativada. As solicitações são encaminhadas para qualquer back-end disponível. Esse é o modo padrão.
      • CLIENT_IP_DST_PORT_PROTO: as solicitações da mesma tupla de quatro elementos (endereço IP de origem, endereço IP de destino, porta de destino e protocolo) são roteadas para o mesmo back-end.
    • RESOURCE_LABEL: o seletor de rótulos que seleciona a qual serviço de back-end o recurso BackendServicePolicy é aplicado no namespace do projeto. Se vários recursos BackendServicePolicy corresponderem ao mesmo serviço de back-end e pelo menos uma dessas políticas tiver a afinidade da sessão ativada, a afinidade da sessão para esse recurso BackendService será ativada.

  6. Crie um recurso ForwardingRule externo que defina o VIP em que o serviço está disponível:

    gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \
      --backend-service=BACKEND_SERVICE_NAME \
      --cidr=CIDR \
      --ip-protocol-port=PROTOCOL_PORT \
      --load-balancing-scheme=EXTERNAL \
      --project=PROJECT_NAME \
      --global
    

    Substitua:

    • BACKEND_SERVICE_NAME: o nome do seu serviço de back-end.
    • FORWARDING_RULE_EXTERNAL_NAME: o nome escolhido para a regra de encaminhamento.
    • CIDR: este campo é opcional. Se não for especificado, um CIDR IPv4/32 será reservado automaticamente do pool de IP global. Especifique o nome de um recurso Subnet no mesmo namespace que esta regra de encaminhamento. Um recurso Subnet representa as informações de solicitação e alocação de uma sub-rede global. Para mais informações sobre recursos Subnet, consulte Exemplo de recursos personalizados.
    • PROTOCOL_PORT: o protocolo e a porta a serem expostos na regra de encaminhamento. Esse campo precisa estar no formato ip-protocol=TCP:80. A porta exposta precisa ser a mesma que o aplicativo real está expondo dentro do contêiner.
  7. Para verificar o ELB configurado, confirme a condição Ready em cada um dos objetos criados. Para receber o endereço IP atribuído do balanceador de carga, descreva a regra de encaminhamento:

    gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
    
  8. Para validar o ELB configurado, confirme a condição Ready em cada um dos objetos criados. Verifique o tráfego com uma solicitação curl para o VIP:

    1. Para receber o VIP atribuído, descreva a regra de encaminhamento:

      gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME --global
      
    2. Verifique o tráfego com uma solicitação curl para o VIP na porta especificada no campo PROTOCOL_PORT da regra de encaminhamento:

      curl http://FORWARDING_RULE_VIP:PORT
      

      Substitua:

      • FORWARDING_RULE_VIP: o VIP da regra de encaminhamento.
      • PORT: o número da porta do campo PROTOCOL_PORT na regra de encaminhamento.

API

Crie um ELB que tenha como destino cargas de trabalho de pod ou VM usando a API KRM. Esse ELB direciona todas as cargas de trabalho no projeto que correspondem ao rótulo definido no objeto de back-end. Para criar um ELB zonal usando a API KRM, siga estas etapas:

  1. Crie um recurso Backend para definir os endpoints do ELB. Crie recursos Backend para cada zona em que as cargas de trabalho estão localizadas:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: Backend
    metadata:
      namespace: PROJECT_NAME
      name: BACKEND_NAME
    spec:
      clusterName: CLUSTER_NAME
      endpointsLabels:
        matchLabels:
          app: server
    EOF
    

    Substitua:

    • MANAGEMENT_API_SERVER: o caminho kubeconfig do servidor da API Management global. Para mais informações, consulte Mudar para o contexto global.
    • PROJECT_NAME: o nome do projeto.
    • BACKEND_NAME: o nome do recurso ;Backend
    • CLUSTER_NAME: este é um campo opcional. Esse campo especifica o cluster a que o escopo dos seletores definidos está limitado. Esse campo não se aplica a cargas de trabalho de VM. Se um recurso Backend não tiver o campo clusterName incluído, os rótulos especificados serão aplicados a todas as cargas de trabalho no projeto.
  2. Pule esta etapa se o ELB for para cargas de trabalho de pod. Se você estiver configurando um ELB para cargas de trabalho de VM, defina uma verificação de integridade para o ELB:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: HealthCheck
    metadata:
      namespace: PROJECT_NAME
      name: HEALTH_CHECK_NAME
    spec:
      tcpHealthCheck:
        port: PORT
      timeoutSec: TIMEOUT
      checkIntervalSec: CHECK_INTERVAL
      healthyThreshold: HEALTHY_THRESHOLD
      unhealthyThreshold: UNHEALTHY_THRESHOLD
    EOF
    

    Substitua:

    • HEALTH_CHECK_NAME: o nome escolhido para o recurso de verificação de integridade, como my-health-check.
    • PORT: a porta em que a verificação de integridade é realizada. O valor padrão é 80.
    • TIMEOUT: o tempo em segundos para aguardar antes de declarar falha. O valor padrão é 5.
    • CHECK_INTERVAL: o tempo em segundos entre o início de uma sondagem e o início da próxima. O valor padrão é 5.
    • HEALTHY_THRESHOLD: o número de sondagens sequenciais que precisam ser aprovadas para que o endpoint seja considerado íntegro. O valor padrão é 2.
    • UNHEALTHY_THRESHOLD: o número de sondagens seguidas que precisam falhar para que o endpoint seja considerado não íntegro. O valor padrão é 2.

    Como este é um ELB global, crie a verificação de integridade na API global.

  3. Crie um objeto BackendService usando o recurso Backend criado anteriormente. Se você estiver configurando um ELB para cargas de trabalho de VM, inclua o recurso HealthCheck.

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: BackendService
    metadata:
      namespace: PROJECT_NAME
      name: BACKEND_SERVICE_NAME
    spec:
      backendRefs:
      - name: BACKEND_NAME
        zone: ZONE
      healthCheckName: HEALTH_CHECK_NAME
      targetPorts:
      - port: PORT
        protocol: PROTOCOL
        targetPort: TARGET_PORT
    EOF
    

    Substitua:

    • BACKEND_SERVICE_NAME: o nome escolhido para o recurso BackendService.
    • HEALTH_CHECK_NAME: o nome do recurso HealthCheck criado anteriormente. Não inclua esse campo se você estiver configurando um ELB para cargas de trabalho de pod.
    • ZONE: a zona em que o recurso Backend é criado. É possível especificar vários back-ends no campo backendRefs. Exemplo:

      - name: my-be
        zone: Zone-A
      - name: my-be
        zone: Zone-B
      
    • O campo targetPorts é opcional. Esse recurso lista as portas que o recurso BackendService traduz. Se você estiver usando esse objeto, forneça valores para o seguinte:

      • PORT: a porta exposta pelo serviço.
      • PROTOCOL: o protocolo da camada 4 que o tráfego precisa corresponder. Somente TCP e UDP são aceitos.
      • TARGET_PORT: a porta para a qual o valor de PORT é traduzido, como 8080. O valor de TARGET_PORT não pode ser repetido em um determinado objeto. Um exemplo de targetPorts pode ser assim:

        targetPorts:
        - port: 80
          protocol: TCP
          targetPort: 8080
        
  4. Opcional: use afinidade da sessão para ELBs e garanta que as solicitações do mesmo cliente sejam sempre encaminhadas para o mesmo back-end. Para ativar afinidade da sessão para balanceadores de carga, crie um recurso BackendServicePolicy. Esse recurso define as configurações de afinidade da sessão e aplica o recurso BackendServicePolicy ao recurso BackendService. Crie e aplique o recurso BackendServicePolicy:

     kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
     apiVersion: networking.global.gdc.goog/v1
     kind: BackendServicePolicy
     metadata:
         namespace: PROJECT_NAME
         name: POLICY_NAME
     spec:
         sessionAffinity: MODE
         selector:
             matchLabels:
               RESOURCE_LABEL
    

    Substitua:

    • POLICY_NAME: o nome escolhido para a política de serviço de back-end.
    • MODE: o modo de afinidade da sessão. Há dois modos compatíveis:

      • NONE: a afinidade da sessão está desativada. As solicitações são encaminhadas para qualquer back-end disponível. Esse é o modo padrão.
      • CLIENT_IP_DST_PORT_PROTO: as solicitações da mesma tupla de quatro elementos (endereço IP de origem, endereço IP de destino, porta de destino e protocolo) são roteadas para o mesmo back-end.
    • RESOURCE_LABEL: o seletor de rótulos que seleciona a qual serviço de back-end o recurso BackendServicePolicy é aplicado no namespace do projeto. Se vários recursos BackendServicePolicy corresponderem ao mesmo serviço de back-end e pelo menos uma dessas políticas tiver a afinidade da sessão ativada, a afinidade da sessão para esse recurso BackendService será ativada.

  5. Crie um recurso ForwardingRule externo que defina o VIP em que o serviço está disponível.

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ForwardingRuleExternal
    metadata:
      namespace: PROJECT_NAME
      Name: FORWARDING_RULE_EXTERNAL_NAME
    spec:
      cidrRef: CIDR
      ports:
      - port: PORT
        Protocol: PROTOCOL
      backendServiceRef:
        name: BACKEND_SERVICE_NAME
    EOF
    

    Substitua:

    • FORWARDING_RULE_EXTERNAL_NAME: o nome escolhido para o recurso ForwardingRuleExternal.
    • CIDR: este campo é opcional. Se não for especificado, um CIDR IPv4/32 será reservado automaticamente do pool de IP global. Especifique o nome de um recurso Subnet no mesmo namespace que esta regra de encaminhamento. Um recurso Subnet representa as informações de solicitação e alocação de uma sub-rede global. Para mais informações sobre recursos Subnet, consulte Exemplo de recursos personalizados.
    • PORT: use o campo ports para especificar uma matriz de portas L4 para as quais os pacotes são encaminhados aos back-ends configurados com essa regra de encaminhamento. É necessário especificar pelo menos uma porta. Use o campo port para especificar um número de porta. A porta exposta precisa ser a mesma que o aplicativo real está expondo dentro do contêiner.
    • PROTOCOL: o protocolo a ser usado para a regra de encaminhamento, como TCP. Uma entrada na matriz ports precisa ser assim:

      ports:
      - port: 80
        protocol: TCP
      
  6. Para validar o ELB configurado, confirme a condição Ready em cada um dos objetos criados. Verifique o tráfego com uma solicitação curl para o VIP:

    1. Para conseguir o VIP, use kubectl get:

      kubectl get forwardingruleexternal -n PROJECT_NAME
      

      A saída será assim:

      NAME           BACKENDSERVICE                               CIDR              READY
      elb-name       BACKEND_SERVICE_NAME        10.200.32.59/32   True
      
    2. Verifique o tráfego com uma solicitação curl para o VIP na porta especificada no campo PORT da regra de encaminhamento:

      curl http://FORWARDING_RULE_VIP:PORT
      

      Substitua FORWARDING_RULE_VIP pelo VIP da regra de encaminhamento.