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

Você pode criar e usar um balanceador de carga interno para restringir o acesso aos seus aplicativos no Serviço Kubernetes do Azure (AKS). Um balanceador de carga interno não tem um IP público e torna um serviço Kubernetes acessível apenas para aplicativos que podem alcançar o IP privado. Estas aplicações podem estar dentro da mesma rede virtual ou noutra rede virtual através do peering de rede virtual. Este artigo mostra como criar e usar um balanceador de carga interno com o AKS.

Importante

A partir de 30 de setembro de 2025, o Azure Kubernetes Service (AKS) deixou de suportar o Basic Balanceador de Carga. Para evitar potenciais interrupções no serviço, recomendamos o uso do Balanceador de Carga Standard para novas implementações e a atualização de quaisquer implementações existentes para o Balanceador de Carga Standard. Para mais informações sobre esta descontinuação, consulte o problema do GitHub e o anúncio de descontinuação do Azure Updates. Para se manter informado sobre anúncios e atualizações, siga as notas de lançamento do AKS.

Antes de começar

Criar um balanceador de carga interno

  1. Crie um manifesto de serviço com o nome 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. Implante o balanceador de carga interno usando o kubectl apply comando. Este comando cria um balanceador de carga do Azure no grupo de recursos dos nós ligado à mesma rede virtual que o cluster AKS.

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

    kubectl get service internal-app
    

    O endereço IP do balanceador de carga interno é mostrado na EXTERNAL-IP coluna, conforme mostrado na saída do exemplo a seguir. Neste contexto, External refere-se à interface externa do balanceador de carga. Isso não significa que ele recebe um endereço IP público e externo. Este endereço IP é atribuído dinamicamente a partir da mesma sub-rede que o cluster 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 especifica um endereço IP para o balanceador de carga, o endereço IP deve estar disponível dentro da sub-rede usada pelo balanceador de carga. Por defeito, o balanceador de carga usa a mesma sub-rede do cluster AKS. Não use um endereço IP reservado no Azure, um endereço IP já atribuído a outro recurso, ou um endereço IP do CIDR do serviço Kubernetes.

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

Para obter mais informações sobre sub-redes, consulte Adicionar um pool de nós com uma sub-rede única.

Se quiser usar um endereço IP específico com o balanceador de carga, você 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á a ser descontinuada em conformidade com o Kubernetes upstream. Embora o uso atual permaneça o mesmo e se espere que os serviços existentes funcionem sem modificações, é altamente recomendável definir anotações para os serviços. Para mais informações sobre anotações de serviço, consulte anotações suportadas do Balanceador de Carga do Azure.

  1. Defina anotações de serviço usando 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
    
  2. Exiba os detalhes do serviço usando o kubectl get service comando.

    kubectl get service internal-app
    

    O endereço IP na coluna EXTERNAL-IP deve refletir o endereço IP que especificou, conforme mostrado no exemplo de saída 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 seu balanceador de carga em uma sub-rede diferente, consulte Especificar uma sub-rede diferente.

Importante

O Private Link Service tem as seguintes restrições:

  • O Private Link Service suporta apenas tráfego IPv4 e suporta apenas os protocolos de transporte TCP e UDP.
  • Se o serviço usar externalTrafficPolicy: Local, a sub-rede do Private Link Service deve ser diferente da sub-rede pod. Para usar a mesma subrede, defina externalTrafficPolicy para Cluster.
  • Se ativares o protocolo PROXY e usares externalTrafficPolicy: Local, tens de configurar uma sonda de saúde personalizada porque a sonda de saúde padrão falha.

Para mais informações, consulte limitações do Private Link Service e restrições de integração do Azure Private Link Service.

  1. Crie um manifesto de serviço nomeado internal-lb-pls.yaml com o tipo de serviço LoadBalancer e com as anotações azure-load-balancer-internal e azure-pls-create. Para obter mais opções, consulte o documento de projeto 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. Implante o balanceador de carga interno usando o kubectl apply comando. Este comando cria um balanceador de carga do Azure no grupo de recursos dos nós ligado à mesma rede virtual que o cluster AKS. Também cria um objeto Private Link Service que se liga à configuração IP frontend do balanceador de carga interno associado ao objeto de serviço Kubernetes.

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

    kubectl get service internal-app
    

    O endereço IP do balanceador de carga interno é mostrado na EXTERNAL-IP coluna, conforme mostrado na saída do exemplo a seguir. Neste contexto, External refere-se à interface externa do balanceador de carga. Isso não significa que ele recebe um endereço IP público e 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 Private Link Service usando o az network private-link-service list comando.

    # 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
    

    Sua saída deve ser semelhante à saída de exemplo a seguir:

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

Um Ponto Final Privado permite que você se conecte de forma privada ao seu objeto de serviço Kubernetes por meio do Serviço de Link Privado que você criou.

Crie o ponto de extremidade privado usando o az network private-endpoint create comando. Substitua pls-xyz pelo nome Private Link Service devolvido no passo anterior.

Define --resource-group para o grupo de recursos alvo onde queres criar o endpoint privado. Definir --vnet-name e --subnet para a rede virtual e sub-rede que contêm o endpoint privado. Definir --private-connection-resource-id para o ID de recurso do Private Link Service recuperado em AKS_PLS_ID.

# Create variables for the Private Link Service

AKS_PLS_NAME=pls-xyz
AKS_PLS_ID=$(az network private-link-service show -g $AKS_MC_RG --name $AKS_PLS_NAME --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

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

Anotação valor Descrição Necessário Predefinição
service.beta.kubernetes.io/azure-pls-create "true" Booleano indicando se um PLS precisa ser criado. Necessário
service.beta.kubernetes.io/azure-pls-name <PLS name> String especificando o nome do recurso PLS a ser criado. Opcional "pls-<LB frontend config name>"
service.beta.kubernetes.io/azure-pls-resource-group Resource Group name String que especifica o nome do Grupo de Recursos onde o recurso PLS é criado Opcional MC_resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> Cadeia que indica a sub-rede na qual o PLS está implantado. Esta sub-rede deve existir na mesma rede virtual que o pool backend. PLS NAT IPs são alocados dentro desta sub-rede. Opcional Se service.beta.kubernetes.io/azure-load-balancer-internal-subnet, esta sub-rede ILB é usada. Caso contrário, a sub-rede padrão do arquivo de configuração será usada.
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count [1-8] Número total de IPs NAT privados a alocar. 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ço de IPs IPv4 estáticos a serem alocados. (IPv6 não é suportado neste momento.) O número total de IPs não deve ser superior ao número de IPs especificado em service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count. Se houver menos IPs especificados, o restante será alocado dinamicamente. O primeiro IP da lista é definido como Primary. Opcional Todos os IPs são alocados dinamicamente.
service.beta.kubernetes.io/azure-pls-fqdns "fqdn1 fqdn2" Uma lista de nomes de domínio totalmente qualificados associados ao PLS, separada por espaços. Opcional []
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" ou "false" Booleano indicando se o protocolo TCP PROXY deve ser habilitado no PLS para passar informações de conexão, incluindo o ID do link e o endereço IP de origem. O serviço backend TEM de suportar o protocolo PROXY, caso contrário a ligação falha. Opcional false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" ou "*" Uma lista separada por espaço dos IDs de subscrição do Azure para os quais o Private Link Service é visível. Use "*" para expor o PLS a todos os subs (Menos restritivo). Opcional Lista [] vazia indicando apenas controlo de acesso baseado em funções: Este Private Link Service está disponível apenas para utilizadores com as permissões Azure RBAC necessárias, incluindo utilizadores autorizados entre os inquilinos. (Mais restritivo)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Uma lista de IDs de subscrições do Azure separada por espaços cujos pedidos de ligação PE ao PLS são automaticamente aprovados. A lista de aprovação automática deve ser um subconjunto da lista de visibilidade. Opcional []

Use um balanceador de carga interno com redes privadas

Ao criar seu cluster AKS, você pode especificar configurações avançadas de rede. Essas configurações permitem que você implante o cluster em uma rede virtual e sub-redes existentes do Azure. Por exemplo, você pode implantar seu cluster AKS em uma rede privada conectada ao seu ambiente local e executar serviços que só são acessíveis internamente.

Para obter mais informações, consulte Configurar suas próprias sub-redes de rede virtual com Kubenet ou com o Azure CNI.

Não é necessário fazer alterações nas etapas anteriores para implantar um balanceador de carga interno que usa uma rede privada em um cluster AKS. O balanceador de carga é criado no grupo de recursos de nós do seu cluster AKS e ligado à sua rede virtual privada e sub-rede, como mostrado no exemplo seguinte:

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

Nota

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

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

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

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

Especificar uma sub-rede diferente

Adicione a azure-load-balancer-internal-subnet anotação ao seu serviço para especificar uma sub-rede para o seu balanceador de carga. A sub-rede especificada deve estar na mesma rede virtual que o cluster AKS. Quando implantado, o endereço do balanceador EXTERNAL-IP de carga 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

Defina o valor da anotação service.beta.kubernetes.io/azure-load-balancer-internal-subnet como a cadeia de caracteres com o nome da sub-rede, como "apps-subnet".

Eliminar o balanceador de carga

O balanceador de carga é eliminado quando eliminas todos os seus serviços Kubernetes.

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

Próximos passos

Para saber mais sobre os serviços do Kubernetes, consulte a documentação dos serviços do Kubernetes.