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.

Observação

O Azure Load Balancer está disponível em duas SKUs, Básica e Standard. Por padrão, o SKU Standard é usado quando você cria um cluster do 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, confira Comparação de SKU do balanceador de carga do Azure.

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.

  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, consulte 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

A seguir estão as anotações que podem ser usadas 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.