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. Esses aplicativos podem estar dentro da mesma VNET ou em outra VNET através do emparelhamento VNET. Este artigo mostra como criar e usar um balanceador de carga interno com o AKS.

Nota

O Azure Load Balancer está disponível em duas SKUs: Basic e Standard. A SKU padrão é usada por padrão quando você cria um cluster AKS. Ao criar um tipo de serviço LoadBalancer , você obterá o mesmo tipo de balanceador de carga de quando provisionou o cluster. Para obter mais informações, veja Comparação do SKU do Balanceador de Carga do Azure.

Antes de começar

Criar um balanceador de carga interno

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

    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 do nó conectado à 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 coluna, conforme mostrado na EXTERNAL-IP 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 você especifica um endereço IP para o balanceador de carga, o endereço IP especificado deve residir na mesma sub-rede que o cluster AKS, mas ainda não pode ser atribuído a um recurso. Por exemplo, você não deve usar um endereço IP no intervalo designado para a sub-rede do Kubernetes dentro do cluster AKS.

Você pode usar o comando da CLI do Azure ou o az network vnet subnet listGet-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 exclusiva.

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

Adicionar a propriedade LoadBalancerIP ao manifesto YAML do balanceador de carga está substituindo 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 de serviço.

  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
    
  1. Exiba os detalhes do serviço usando o kubectl get service comando.

    kubectl get service internal-app
    

    O endereço IP na coluna deve refletir o EXTERNAL-IP 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 seu balanceador de carga em uma sub-rede diferente, consulte Especificar uma sub-rede diferente

Antes de começar

  • Você precisa do Kubernetes versão 1.22.x ou posterior.
  • Você precisa de um grupo de recursos existente com uma VNet e uma sub-rede. Este grupo de recursos é onde você cria o ponto de extremidade privado. Se você não tiver esses recursos, consulte Criar uma rede virtual e uma sub-rede.
  1. Crie um manifesto de serviço nomeado internal-lb-pls.yaml com o tipo LoadBalancer de serviço e as azure-load-balancer-internal anotações e azure-pls-create . Para obter mais opções, consulte 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. Implante o balanceador de carga interno usando o kubectl apply comando. Este comando cria um balanceador de carga do Azure no grupo de recursos do nó conectado à mesma rede virtual que o cluster AKS. Ele também cria um objeto Private Link Service que se conecta à configuração IP frontend do balanceador de carga associado ao 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 coluna, conforme mostrado na EXTERNAL-IP 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.

    # 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 PLS via Anotações

A seguir estão as anotações que podem ser usadas para personalizar o recurso PLS.

Anotação valor Description Necessário Predefinição
service.beta.kubernetes.io/azure-pls-create "true" Booleano indicando se um PLS precisa ser criado. Obrigató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 especificando o nome do Grupo de Recursos onde o recurso PLS será criado Opcional MC_ resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> String que indica a sub-rede na qual o PLS será implantado. Essa sub-rede deve existir na mesma VNET que o pool de back-end. 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 5
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 no momento.) O número total de IPs não deve ser maior do que a contagem de ip especificada 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 separada por espaço de fqdns associados ao PLS. 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. Observe que o serviço de back-end DEVE suportar 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 as quais o serviço de link privado é visível. Use "*" para expor o PLS a todos os subs (Menos restritivo). Opcional Lista vazia [] indicando apenas controle de acesso baseado em função: esse serviço de link privado só estará disponível para indivíduos com permissões de controle de acesso baseado em função em seu diretório. (Mais restritivo)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Uma lista separada por espaço de IDs de assinatura do Azure. Isso permite que as solicitações de conexão PE das assinaturas listadas no PLS sejam aprovadas automaticamente. Isso só funciona quando a visibilidade está definida como "*". Opcional []

Usar 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 mesmo grupo de recursos que o cluster AKS, mas está conectado à sua rede virtual privada e sub-rede, conforme mostrado no exemplo a seguir:

$ 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
    

Eliminar o balanceador de carga

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

Como com qualquer recurso do Kubernetes, você pode excluir diretamente um serviço, como kubectl delete service internal-appo , 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.