Ingress para balanceadores de carga de aplicativo externos


Nesta página, explicamos como o Ingress para balanceadores de carga de aplicativo externos funciona no Google Kubernetes Engine (GKE). Também é possível aprender como configurar e usar a Entrada para balanceamento de carga externo.

Para informações gerais sobre como usar o balanceamento de carga no GKE, consulte Ingress para balanceadores de carga de aplicativo externos.

A rede do Google Kubernetes Engine (GKE) é criada com base no Cloud Load Balancing. Com o Cloud Load Balancing, um único endereço IP anycast permite que o roteamento determine o caminho de menor custo para o balanceador de carga do Google Cloud mais próximo.

Suporte para recursos do Google Cloud

É possível usar um BackendConfig para configurar um balanceador de carga de aplicativo externo para usar recursos como:

O BackendConfig é um recurso personalizado que contém informações de configuração dos recursos do Google Cloud. Para saber mais sobre os recursos com suporte, consulte Configuração de entrada.

Suporte para WebSocket

Com os balanceadores de carga de aplicativo externos, o protocolo WebSocket funciona sem qualquer configuração.

Se você pretende usar o protocolo WebSocket, use um valor de tempo limite maior que o padrão de 30 segundos. Para o tráfego WebSocket enviado por um balanceador de carga de aplicativo externo do Google Cloud, o tempo limite do serviço de back-end é interpretado como o tempo máximo em que uma conexão WebSocket pode permanecer aberta, seja ela ociosa ou não.

Para definir o valor de tempo limite para um serviço de back-end configurado por meio da Entrada, crie um objeto BackendConfig e use a anotação beta.cloud.google.com/backend-config no manifesto do serviço.

Para informações de configuração, consulte Tempo limite de resposta do back-end.

Endereços IP estáticos para balanceadores de carga HTTPS

Ao criar um objeto Entrada, você recebe um endereço IP externo estável que os clientes podem usar para acessar seus serviços e, por sua vez, os contêineres em execução. O endereço IP é estável porque ele dura por toda a vida útil do objeto Entrada. Se você excluir a Entrada e criar uma nova no mesmo arquivo de manifesto, pode ser que não receba o mesmo endereço IP externo.

Caso queira um endereço IP permanente que se mantenha estável depois de excluir sua Entrada e criar uma nova, reserve um endereço IP externo estático global. Em seguida, no manifesto da entrada, inclua uma anotação que forneça o nome do endereço IP estático reservado. Se você modificar uma entrada atual para usar um endereço IP estático em vez de um endereço IP temporário, o GKE poderá alterar o endereço IP do balanceador de carga quando o GKE recriar a regra de encaminhamento do balanceador de carga de dados.

Por exemplo, suponha que você tenha reservado um endereço IP externo estático global chamado my-static-address. No manifesto da Entrada, inclua uma anotação kubernetes.io/ingress.global-static-ip-name, conforme mostrado aqui:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-static-address

Como configurar o HTTPS (TLS) entre o cliente e o balanceador de carga

Um balanceador de carga HTTP(S) atua como um proxy entre seus clientes e o aplicativo. Se você quiser aceitar solicitações HTTPS dos seus clientes, o balanceador de carga precisará ter um certificado para provar sua identidade a eles. Além disso, ele precisa ter uma chave privada para concluir o handshake HTTPS.

Quando o balanceador de carga aceita uma solicitação HTTPS de um cliente, o tráfego entre o cliente e o balanceador de carga é criptografado usando TLS. No entanto, o balanceador de carga encerra a criptografia TLS e encaminha a solicitação sem criptografia para o aplicativo. Para informações sobre como criptografar o tráfego entre o balanceador de carga e o aplicativo, consulte HTTPS entre o balanceador de carga e seu aplicativo.

É possível usar certificados SSL gerenciados pelo Google ou certificados gerenciados por você. Para mais informações sobre como criar uma entrada que use certificados gerenciados pelo Google, consulte Como usar certificados SSL gerenciados pelo Google.

Para fornecer um balanceador de carga HTTP(S) com um certificado e uma chave criados por você, crie um objeto de secret do Kubernetes. O secret contém o certificado e a chave. Adicione o secret ao campo tls do seu manifesto Ingress, como no exemplo a seguir:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-2
spec:
  tls:
  - secretName: SECRET_NAME
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: SERVICE_NAME
            port:
              number: 60000

Este manifesto inclui os seguintes valores:

  • SECRET_NAME: o nome do secret que você criou.
  • SERVICE_NAME: o nome do seu serviço de back-end.

As alterações nos secrets são coletadas periodicamente. Por isso, se você modificar os dados do secret, levará no máximo 10 minutos para que essas alterações sejam aplicadas ao balanceador de carga.

Para mais informações, consulte Como usar vários certificados SSL no balanceamento de carga HTTPS com a Entrada.

Para proteger a Entrada criptografada por HTTPS para seus clusters do GKE, consulte o exemplo de Entrada segura.

Como desativar o HTTP

Se quiser que todo o tráfego entre o cliente e o balanceador de carga HTTP(S) use HTTPS, é possível desativar o HTTP incluindo a anotação kubernetes.io/ingress.allow-http no seu manifesto da entrada. Defina o valor da anotação como "false".

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-2
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: SECRET_NAME
  ...

Esse manifesto inclui o SECRET_NAME, que é o nome do secret que você criou.

Certificados pré-compartilhados para balanceadores de carga

Como alternativa ao uso do Kubernetes Secrets no fornecimento de certificados ao balanceador de carga para a terminação HTTP, é possível usar os certificados enviados anteriormente ao projeto do Google Cloud. Para mais informações, consulte Como usar certificados pré-compartilhados e Como usar vários certificados SSL no balanceamento de carga HTTPS com a Entrada.

HTTPS (TLS) entre o balanceador de carga e o aplicativo

Um balanceador de carga HTTP(S) atua como um proxy entre seus clientes e o aplicativo. Os clientes podem usar HTTP ou HTTPS para a comunicação com o proxy do balanceador de carga. A conexão entre o proxy do balanceador de carga e seu aplicativo usa HTTP por padrão. No entanto, se o aplicativo em execução em um pod do GKE for capaz de receber solicitações HTTPS você pode configurar o balanceador de carga para usar HTTPS ao encaminhar solicitações para seu aplicativo.

Para configurar o protocolo usado entre o balanceador de carga e o aplicativo, use a anotação cloud.google.com/app-protocols no manifesto de serviço. Esse manifesto de Serviço precisa incluir type: NodePort, a menos que você esteja usando o balanceamento de carga nativo do contêiner. Se estiver usando o balanceamento de carga nativo de contêiner, use o type: ClusterIP.

O manifesto do serviço a seguir especifica duas portas. A anotação diz que quando um balanceador de carga HTTP(S) segmenta a porta 80 do Serviço, ele deve usar HTTP. E quando o balanceador de carga segmenta a porta 443 do serviço, ele deve usar HTTPS.

O manifesto do serviço precisa incluir um valor name na anotação da porta. Só é possível editar a porta do Serviço fazendo referência ao name atribuído, e não ao valor targetPort.

apiVersion: v1
kind: Service
metadata:
  name: my-service-3
  annotations:
    cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
  type: NodePort
  selector:
    app: metrics
    department: sales
  ports:
  - name: my-https-port
    port: 443
    targetPort: 8443
  - name: my-http-port
    port: 80
    targetPort: 50001

A seguir