Compartilhar via


Usar um balanceador de carga interno com o AKS (Serviço de Kubernetes do Azure)

Crie e use um balanceador de carga interno para restringir o acesso aos seus aplicativos no AKS (Serviço de Kubernetes do Azure). Um balanceador de carga interno não tem um IP público e torna um serviço do Kubernetes acessível somente a aplicativos que podem alcançar o IP privado. Esses aplicativos podem estar dentro da mesma VNET ou em outra VNET por meio do emparelhamento VNET. Este artigo mostra como criar e usar um balanceador de carga interno com o AKS.

Importante

Em 30 de setembro de 2025, o Balanceador de Carga Básico será desativado. Para saber mais, confira o anúncio oficial. Se você estiver usando o Load Balancer Básico, atualize para o Standard Load Balancer antes da data de desativação. Para obter diretrizes sobre upgrades, acesse Como fazer um upgrade do Load Balancer Básico: Diretrizes.

Antes de começar

Criar um balanceador de carga interno

  1. Crie um manifesto de serviço denominado internal-lb.yaml com o tipo de serviço LoadBalancer e a anotação azure-load-balancer-internal.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. Implantar o balanceador de carga interno utilizando o comando kubectl apply. Esse comando cria um balanceador de carga do Azure no grupo de recursos de nó conectado à mesma rede virtual que seu cluster do AKS.

    kubectl apply -f internal-lb.yaml
    
  3. Exibir os detalhes do serviço utilizando o comando kubectl get service.

    kubectl get service internal-app
    

    O endereço IP do balanceador de carga interno é mostrado na coluna EXTERNAL-IP, conforme mostrado na saída do exemplo a seguir. Nesse contexto, External refere-se à interface externa do balanceador de carga. Isso não significa que ele receba um endereço IP público externo. Esse endereço IP é atribuído dinamicamente da mesma sub-rede que o cluster do AKS.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.248.59   10.240.0.7    80:30555/TCP   2m
    

Especificar um endereço IP

Quando você especifica um endereço IP para o balanceador de carga, o endereço IP especificado precisa residir na mesma rede virtual que o cluster do AKS, mas não pode já estar atribuído a outro recurso na rede virtual. Por exemplo, você não deve usar um endereço IP no intervalo designado para a sub-rede do Kubernetes no cluster do AKS. Usar um endereço IP que já está atribuído a outro recurso na mesma rede virtual pode causar problemas para o balanceador de carga.

Use o comando az network vnet subnet list da CLI do Azure ou o cmdlet Get-AzVirtualNetworkSubnetConfig do PowerShell para obter as sub-redes da sua rede virtual.

Para obter mais informações sobre as sub-redes, confira Adicionar um pool de nós com uma sub-rede exclusiva.

Se você deseja utilizar um endereço IP específico com o balanceador de carga, tem duas opções: definir anotações de serviço ou adicionar a propriedade LoadBalancerIP ao manifesto YAML do balanceador de carga.

Importante

A adição da propriedade LoadBalancerIP ao manifesto YAML do balanceador de carga está substituindo o upstream Kubernetes a seguir. Embora o uso atual permaneça o mesmo e os serviços existentes funcionem sem modificação, é altamente recomendável definir anotações de serviço. Para obter mais informações sobre anotações de serviço, confira anotações com suporte do Azure Load Balancer.

  1. Defina as anotações do serviço utilizando service.beta.kubernetes.io/azure-load-balancer-ipv4 para um endereço IPv4 e service.beta.kubernetes.io/azure-load-balancer-ipv6 para um endereço IPv6.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.240.0.25
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  1. Exibir os detalhes do serviço utilizando o comando kubectl get service.

    kubectl get service internal-app
    

    O endereço IP na coluna EXTERNAL-IP deve refletir o endereço IP especificado, conforme mostrado na saída de exemplo a seguir:

    NAME           TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.184.168   10.240.0.25   80:30225/TCP   4m
    

Para obter mais informações sobre como configurar o balanceador de carga em uma sub-rede diferente, confira Especificar uma sub-rede diferente.

Antes de começar

  1. Crie um manifesto de serviço denominado internal-lb-pls.yaml com o tipo de serviço LoadBalancer e as anotações azure-load-balancer-internal e azure-pls-create. Para conhecer mais opções, veja o documento de design da Integração do Serviço de Link Privado do Azure.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-pls-create: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. Implantar o balanceador de carga interno utilizando o comando kubectl apply. Esse comando cria um balanceador de carga do Azure no grupo de recursos de nó conectado à mesma rede virtual que seu cluster do AKS. Você também cria um objeto Serviço de Link Privado que se conecta à configuração de IP do front-end do balanceador de carga associado ao serviço do Kubernetes.

    kubectl apply -f internal-lb-pls.yaml
    
  3. Exibir os detalhes do serviço utilizando o comando kubectl get service.

    kubectl get service internal-app
    

    O endereço IP do balanceador de carga interno é mostrado na coluna EXTERNAL-IP, conforme mostrado na saída do exemplo a seguir. Nesse contexto, External refere-se à interface externa do balanceador de carga. Isso não significa que ele receba um endereço IP público externo.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.125.17.53  10.125.0.66   80:30430/TCP   64m
    
  4. Exiba os detalhes do objeto Serviço de Link Privado utilizando o comando az network private-link-service list.

    # Create a variable for the node resource group
    
    AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
    
    # View the details of the Private Link Service object
    
    az network private-link-service list -g $AKS_MC_RG --query "[].{Name:name,Alias:alias}" -o table
    

    Seu resultado deve ser semelhante ao seguinte exemplo de saída:

    Name      Alias
    --------  -------------------------------------------------------------------------
    pls-xyz   pls-xyz.abc123-defg-4hij-56kl-789mnop.eastus2.azure.privatelinkservice
    

Um ponto de extremidade privado permite que você se conecte de modo particular ao objeto de serviço do Kubernetes por meio do Serviço de Link Privado criado.

  • Criar o ponto de extremidade privado utilizando o comando az network private-endpoint create.

    # Create a variable for the private link service
    
    AKS_PLS_ID=$(az network private-link-service list -g $AKS_MC_RG --query "[].id" -o tsv)
    
    # Create the private endpoint
    
    $ az network private-endpoint create \
        -g myOtherResourceGroup \
        --name myAKSServicePE \
        --vnet-name myOtherVNET \
        --subnet pe-subnet \
        --private-connection-resource-id $AKS_PLS_ID \
        --connection-name connectToMyK8sService
    

Personalizações do PLS por meio de Anotações

Você pode usar as seguintes anotações para personalizar o recurso PLS:

Annotation Valor Descrição Obrigatório Padrão
service.beta.kubernetes.io/azure-pls-create "true" Booliano que indica se um PLS precisa ser criado. Obrigatório
service.beta.kubernetes.io/azure-pls-name <PLS name> Cadeia de caracteres especificando o nome do recurso PLS que será criado. Opcional "pls-<LB frontend config name>"
service.beta.kubernetes.io/azure-pls-resource-group Resource Group name Cadeia de caracteres especificando o nome do grupo de recursos em que o recurso PLS será criado Opcional MC_ resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> Cadeia de caracteres que indica a sub-rede na qual o PLS será implantado. Essa sub-rede deve existir na mesma VNet que o pool de back-ends. Os IPs NAT do PLS são alocados dentro dessa sub-rede. Opcional Se service.beta.kubernetes.io/azure-load-balancer-internal-subnet, essa sub-rede ILB será utilizada. Caso contrário, será usada a sub-rede padrão do arquivo de configuração.
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count [1-8] Número total de IPs NAT privados a serem alocados. Opcional 1
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address "10.0.0.7 ... 10.0.0.10" Uma lista separada por espaços de IPs estáticos IPv4 IPs que serão alocados. (No momento, não há suporte para IPv6.) O número total de IPs não deve ser maior do que a contagem de IPs especificada em service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count. Se existirem menos IPs especificados, os demais serão alocados dinamicamente. O primeiro IP da lista está definido como Primary. Opcional Todos os IPs são alocados dinamicamente.
service.beta.kubernetes.io/azure-pls-fqdns "fqdn1 fqdn2" Uma lista separada por espaço de fqdns associados ao PLS. Opcional []
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" ou "false" Booliano indicando se o protocolo PROXY TCP deve ser habilitado no PLS para transmitir informações de conexão, incluindo a ID do link e o endereço IP de origem. Observe que o serviço back-end DEVE dar suporte para o protocolo PROXY ou as conexões falharão. Opcional false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" ou "*" Uma lista separada por espaço de IDs de assinatura do Azure para os quais o serviço de Link Privado está visível. Use "*" para expor o PLS a todos os subs (Menos restritivo). Opcional A lista vazia [] indicando apenas o controle de acesso baseado em função: este serviço de Link Privado do Azure estará disponível apenas para indivíduos com permissões de controle de acesso baseado em função dentro do seu diretório. (Mais restritivo)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Uma lista separada por espaços de IDs de assinatura do Azure. Isso permite que as solicitações de conexão PE das assinaturas listadas para o PLS sejam automaticamente aprovadas. Isso só funcionará quando a visibilidade estiver definida como "*". Opcional []

Usar redes privadas

Quando você cria seu cluster do AKS, é possível especificar as configurações de rede avançadas. Essas configurações permitem implantar o cluster em uma rede virtual e nas sub-redes existentes do Azure. Por exemplo, você pode implantar o cluster do AKS em uma rede privada conectada ao ambiente local e executar serviços acessíveis apenas internamente.

Para obter mais informações, confira Configurar suas sub-redes de rede virtual com o kubenet ou com a CNI do Azure.

Não é necessário realizar nenhuma alteração nas etapas anteriores para implantar um balanceador de carga interno que usa uma rede privada em um cluster do AKS. O balanceador de carga é criado no mesmo grupo de recursos do cluster do AKS, mas é conectado à sua rede virtual e à sub-rede privadas, conforme mostrado no seguinte exemplo:

$ kubectl get service internal-app

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
internal-app   LoadBalancer   10.1.15.188   10.0.0.35     80:31669/TCP   1m

Observação

A identidade do cluster usada pelo cluster do AKS deve, pelo menos, ter a função Colaborador de rede no recurso de rede virtual. Você pode exibir a identidade do cluster usando o comando az aks show, como az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity". Você pode atribuir a função Colaborador de Rede usando o comando az role assignment create, como az role assignment create --assignee <identity-resource-id> --scope <virtual-network-resource-id> --role "Network Contributor".

Se você quiser definir uma função personalizada, precisará das seguintes permissões:

  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/virtualNetworks/subnets/read

Para obter mais informações, confira Adicionar, alterar ou excluir uma sub-rede de rede virtual.

Especificar uma sub-rede diferente

  • Adicione a anotação azure-load-balancer-internal-subnet ao seu serviço para especificar uma sub-rede para seu balanceador de carga. A sub-rede especificada deve estar na mesma rede virtual que seu cluster do AKS. Quando implantado, o endereço do balanceador de carga EXTERNAL-IP faz parte da sub-rede especificada.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "apps-subnet"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    

Excluir o balanceador de carga

O balanceador de carga é excluído quando todos os seus serviços são excluídos.

Assim como qualquer recurso do Kubernetes, você pode excluir diretamente um serviço, como kubectl delete service internal-app, o que também exclui o balanceador de carga subjacente do Azure.

Próximas etapas

Para saber mais sobre os serviços do Kubernetes, confira a Documentação dos serviços do Kubernetes.