Provisionando Balanceadores de Carga de Rede do OCI para Serviços do Kubernetes do Tipo LoadBalancer

Descubra como provisionar um balanceador de carga de rede do OCI para um serviço Kubernetes do tipo LoadBalancer usando o Kubernetes Engine (OKE).

Esta seção descreve como provisionar um balanceador de carga de rede do OCI para um serviço do Kubernetes do tipo LoadBalancer.

Um balanceador de carga de rede do Oracle Cloud Infrastructure é uma solução de balanceamento de carga não proxy que executa o balanceamento de carga de passagem das cargas de trabalho OSI da camada 3 e da camada 4 (TCP/UDP/ICMP). Ele oferece um endereço IP virtual regional (VIP) elasticamente escalável que pode ser ampliado ou reduzido com base no tráfego do cliente sem nenhum requisito de configuração de largura de banda mínima ou máxima. Ele também fornece os benefícios de alta disponibilidade de fluxo, endereço IP de origem e destino e preservação de porta.

Para obter mais informações sobre os balanceadores de carga de rede do Oracle Cloud Infrastructure, consulte Visão Geral do Serviço Network Load Balancer.

O provisionamento de um balanceador de carga de rede do OCI para um serviço do Kubernetes do tipo LoadBalancer permite:

  • tráfego de balanceamento de carga com alto throughput e baixa latência
  • preservar endereços IP e portas de origem e destino
  • manipular tráfego TCP e UDP

Observe que, quando o Kubernetes Engine provisiona um balanceador de carga de rede do OCI para um serviço Kubernetes do tipo LoadBalancer, as regras de segurança para permitir tráfego de entrada e saída de e para a sub-rede do balanceador de carga de rede não são criadas automaticamente por padrão. Defina regras de segurança apropriadas para permitir tráfego de entrada e saída de/para a sub-rede do balanceador de carga ou do balanceador de carga de rede. Consulte Regras de Segurança para Balanceadores de Carga e Balanceadores de Carga de Rede.

Use métricas do balanceador de carga de rede do OCI para monitorar a integridade de um balanceador de carga de rede do OCI provisionado para um serviço Kubernetes do tipo LoadBalancer (consulte Métricas do Balanceador de Carga de Rede).

Especificando a Anotação para um Balanceador de Carga de Rede do OCI

Para provisionar um balanceador de carga de rede para um serviço do Kubernetes do tipo LoadBalancer, adicione a seguinte anotação na seção de metadados do arquivo de manifesto:

oci.oraclecloud.com/load-balancer-type: "nlb"
Por exemplo:
apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Observe que lb é o valor padrão da anotação oci.oraclecloud.com/load-balancer-type. Se você não incluir explicitamente a anotação na definição de serviço, o valor padrão da anotação será usado e um balanceador de carga (em vez de um balanceador de carga de rede) será provisionado.

Encerrando Solicitações no Nó de Recebimento

Ao provisionar um balanceador de carga de rede para um serviço do Kubernetes do tipo LoadBalancer, você pode especificar que as solicitações terminem no endereço IP do cliente especificado nos cabeçalhos de pacotes IP, em vez de serem submetidas a proxy para outros nós de trabalho no cluster.

Por padrão, as solicitações são submetidas a proxy para outros nós de trabalho no cluster.

Especificar que as solicitações terminam no endereço IP do cliente (em vez de serem submetidas a proxy) pode melhorar o desempenho em clusters muito grandes com milhares de nós de trabalho, eliminando o tráfego entre nós de trabalho. A especificação de que as solicitações terminam no endereço IP do cliente também pode simplificar a implementação e remover possíveis preocupações de segurança, permitindo que você configure regras de segurança (em um grupo de segurança de rede (recomendado) e/ou uma lista de segurança) para os nós de trabalho no cluster que só permitem tráfego de entrada do bloco CIDR do balanceador de carga de rede.

Para encerrar solicitações no endereço IP do cliente, adicione a seguinte definição na seção de especificação do arquivo de manifesto:

externalTrafficPolicy: Local

Para solicitações de proxy para outros nós de trabalho no cluster, adicione a seguinte definição na seção de especificação do arquivo de manifesto:

externalTrafficPolicy: Cluster

Observe que Cluster é o valor padrão da definição externalTrafficPolicy. Se você não incluir explicitamente a definição na definição de serviço, o valor padrão da definição será usado.

Observe também que, se externalTrafficPolicy for definido como Cluster, os endereços IP do cliente não serão preservados, independentemente do valor da anotação oci-network-load-balancer.oraclecloud.com/is-preserve-source. As solicitações falharão com um erro se externalTrafficPolicy for definido como Cluster e a anotação oci-network-load-balancer.oraclecloud.com/is-preserve-source for definida explicitamente como true ou false. Consulte Preservando o Endereço IP do Cliente.

Para encerrar solicitações no endereço IP do cliente, você também deve ter configurado as seguintes regras de segurança:

  • Você deve ter configurado uma regra de segurança (em um grupo de segurança de rede (recomendado) e/ou uma lista de segurança) para os nós de trabalho no cluster para permitir o tráfego de entrada do bloco CIDR em que as conexões do cliente são feitas, para todas as portas de nó (30000 to 32767). Se o aplicativo for exposto à Internet, defina o bloco CIDR de Origem da regra de segurança como 0.0.0.0/0. Como alternativa, defina o bloco CIDR de Origem da regra de segurança para um bloco CIDR específico (por exemplo, se as conexões do cliente vierem de uma sub-rede específica).
    Estado Origem Protocolo/Dest. Porta Descrição
    Com monitoramento de estado 0.0.0.0/0 ou CIDR de sub-rede TODOS/30000-32767 Permita que os nós de trabalho recebam conexões por meio do OCI Network Load Balancer.
  • Você deve ter configurado as regras de segurança de entrada e saída para o balanceador de carga de rede, conforme descrito em Regras de Segurança para Balanceadores de Carga e Balanceadores de Carga de Rede.

Por exemplo, aqui está uma definição de serviço do Kubernetes para encerrar solicitações no endereço IP do cliente (em vez de ser proxy):

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
  - port: 80
  selector:
    app: nginx

Preservando o Endereço IP do Cliente

Ao provisionar um balanceador de carga de rede para um serviço do Kubernetes do tipo LoadBalancer, você pode especificar se deve preservar ou impedir a preservação do endereço IP do cliente nos cabeçalhos de pacotes IP.

Você só tem a opção de preservar endereços IP do cliente quando as solicitações são encerradas nos endereços IP do cliente especificados nos cabeçalhos do pacote IP. Ou seja, quando a definição externalTrafficPolicy é definida como Local. Se externalTrafficPolicy for definido como Cluster, os endereços IP do cliente não serão preservados. Consulte Encerrando Solicitações no Nó de Recebimento.

Para evitar a preservação de endereços IP do cliente, adicione a seguinte anotação na seção de metadados do arquivo de manifesto:

oci-network-load-balancer.oraclecloud.com/is-preserve-source: "false"

Para preservar o endereço IP do cliente, adicione a seguinte anotação na seção de metadados do arquivo de manifesto:

oci-network-load-balancer.oraclecloud.com/is-preserve-source: "true"

Observe que true é o valor padrão da anotação oci-network-load-balancer.oraclecloud.com/is-preserve-source. Se você não incluir explicitamente a anotação na definição de serviço, o valor padrão da anotação será usado.

Observe também que, se externalTrafficPolicy for definido como Cluster, os endereços IP do cliente não serão preservados, independentemente do valor da anotação oci-network-load-balancer.oraclecloud.com/is-preserve-source. As solicitações falharão com um erro se externalTrafficPolicy for definido como Cluster e a anotação oci-network-load-balancer.oraclecloud.com/is-preserve-source for definida explicitamente como true ou false. Portanto, não adicione a anotação oci-network-load-balancer.oraclecloud.com/is-preserve-source se externalTrafficPolicy estiver definido como Cluster.

Você pode preservar endereços IP do cliente ao usar pools de nós gerenciados, mas não ao usar pools de nós virtuais.

Para preservar o endereço IP do cliente, você também deve ter configurado as seguintes regras de segurança:

  • Você deve ter configurado uma regra de segurança (em um grupo de segurança de rede (recomendado) e/ou uma lista de segurança) para os nós de trabalho no cluster para permitir o tráfego de entrada do bloco CIDR em que as conexões do cliente são feitas, para todas as portas de nó (30000 to 32767). Se o aplicativo for exposto à Internet, defina o bloco CIDR de Origem da regra de segurança como 0.0.0.0/0. Como alternativa, defina o bloco CIDR de Origem da regra de segurança para um bloco CIDR específico (por exemplo, se as conexões do cliente vierem de uma sub-rede específica).
    Estado Origem Protocolo/Dest. Porta Descrição
    Com monitoramento de estado 0.0.0.0/0 ou CIDR de sub-rede TODOS/30000-32767 Permita que os nós de trabalho recebam conexões por meio do OCI Network Load Balancer.
  • Você deve ter configurado as regras de segurança de entrada e saída para o balanceador de carga de rede, conforme descrito em Regras de Segurança para Balanceadores de Carga e Balanceadores de Carga de Rede.

Por exemplo, aqui está uma definição de serviço do Kubernetes que impede a preservação do endereço IP do cliente:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
    oci-network-load-balancer.oraclecloud.com/is-preserve-source: "false"
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
  - port: 80
  selector:
    app: nginx

Expondo Aplicativos TCP e UDP

Quando o Kubernetes Engine provisiona um balanceador de carga de rede para um serviço do Kubernetes do tipo LoadBalancer, você pode definir o tipo de tráfego aceito pelo listener especificando o protocolo no qual o listener aceita solicitações de conexão.

Observe que, se você não especificar explicitamente um protocolo, "TCP" será usado como o valor padrão.

Para especificar explicitamente o protocolo de listener quando o Kubernetes Engine provisionar um balanceador de carga de rede para um serviço Kubernetes do tipo LoadBalancer, adicione a seguinte definição na seção de especificação do arquivo de manifesto:

protocol: <value>

em que <value> corresponde ao protocolo que define o tipo de tráfego aceito pelo listener. Por exemplo, "UDP". Protocolos válidos incluem "UDP" e "TCP".

Por exemplo:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  ports:
  - port: 80
    protocol: UDP
  selector:
    app: nginx

Especificando a Política do Conjunto de Backend

Quando o Kubernetes Engine provisiona um balanceador de carga de rede para um serviço do Kubernetes do tipo LoadBalancer, você pode definir uma política para o conjunto de backend a fim de especificar como distribuir o tráfego de entrada para os servidores de backend. Para obter mais informações, consulte Políticas do Serviço Network Load Balancer.

Observe que, se você não especificar explicitamente uma política para o conjunto de backend, "FIVE_TUPLE" será usado como o valor padrão.

Para especificar uma política para o conjunto de backend quando o Kubernetes Engine provisionar um balanceador de carga de rede para um serviço Kubernetes do tipo LoadBalancer, adicione a seguinte anotação na seção de metadados do arquivo de manifesto:

oci-network-load-balancer.oraclecloud.com/backend-policy: <value>

em que <value> é um dos seguintes:

  • "TWO_TUPLE": Roteia o tráfego de entrada com base no Hash de 2 Tuplas (IP de origem, IP de destino).
  • "THREE_TUPLE": Roteia o tráfego recebido com base no Hash de 3 Tuplas (IP de origem, IP de destino, protocolo).
  • "FIVE_TUPLE": Roteia o tráfego de entrada com base no Hash de 5 Tuplas (IP e porta de origem, IP e porta de destino, protocolo).

Por exemplo:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/backend-policy: "THREE_TUPLE"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Especificando Opções de Gerenciamento da Lista de Segurança ao Provisionar um Balanceador de Carga de Rede do OCI

Observação

Você poderá encontrar problemas de escalabilidade e outros problemas se usar o recurso de gerenciamento de lista de segurança do Kubernetes em implantações complexas e com ferramentas como o Terraform. Por esses motivos, a Oracle não recomenda o uso do recurso de gerenciamento de lista de segurança do Kubernetes em ambientes de produção.

Observe também que a capacidade de usar listas de segurança para gerenciar regras de segurança será descontinuada em uma release futura. Por esse motivo, a Oracle recomenda o uso de grupos de segurança de rede (NSGs) e a anotação oci.oraclecloud.com/security-rule-management-mode (consulte Especificando Opções de Gerenciamento de Regra de Segurança para Balanceadores de Carga e Balanceadores de Carga de Rede).

Você pode usar o recurso de gerenciamento de listas de segurança para configurar como as regras de lista de segurança são gerenciadas para um balanceador de carga de rede do Oracle Cloud Infrastructure que o Kubernetes Engine provisiona para um serviço do Kubernetes do tipo LoadBalancer. Esse recurso será útil se você for novo no Kubernetes ou para implantações básicas.

Para especificar como o recurso de gerenciamento de lista de segurança do Kubernetes gerencia listas de segurança quando o Kubernetes Engine provisiona um balanceador de carga de rede para um serviço do Kubernetes do tipo LoadBalancer, adicione a seguinte anotação na seção de metadados do arquivo de manifesto:

oci-network-load-balancer.oraclecloud.com/security-list-management-mode: <value>

em que <value> é um dos seguintes:

  • "None": (padrão e recomendado) Nenhum gerenciamento da lista de segurança está ativado. Você precisa configurar uma regra de segurança que permita o tráfego de entrada para as portas apropriadas para intervalos de portas de nó, porta de saúde kube-proxy e intervalos de portas de verificação de integridade. Além disso, você precisa configurar regras de segurança para permitir o tráfego de entrada para balanceadores de carga de rede (consulte Regras de Segurança para Balanceadores de Carga e Balanceadores de Carga de Rede).
  • "All": Todas as regras obrigatórias da lista de segurança para os serviços do balanceador de carga da rede são gerenciadas.
  • "Frontend": Somente as regras da lista de segurança para entrada nos serviços do balanceador de carga da rede são gerenciadas. Você precisa configurar uma regra de segurança que permita o tráfego de entrada para as portas apropriadas para intervalos de portas de nó, porta de saúde kube-proxy e intervalos de portas de verificação de integridade.

A Oracle recomenda que você defina explicitamente oci-network-load-balancer.oraclecloud.com/security-list-management-mode como None.

Em clusters com nós gerenciados, se você não especificar explicitamente um modo de gerenciamento, o gerenciamento da lista de segurança não será ativado (equivalente a "None"). Em clusters com nós virtuais, o gerenciamento da lista de segurança nunca é ativado e você sempre precisa configurar manualmente as regras de segurança (equivalente a "None").

Observe que há limites para o número de regras de entrada e saída permitidas em uma lista de segurança (consulte Limites da Lista de Segurança). Se o número de regras de entrada ou saída exceder o limite e <value> for definido como "All" ou "Frontend", a criação ou atualização do balanceador de carga falhará.

Por exemplo:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/security-list-management-mode: "Frontend"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx