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
- Este artigo considera que já existe um cluster do AKS. Se você precisar de um cluster do AKS, crie um usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.
- Você precisa da CLI do Azure versão 2.0.59 ou posterior. Execute
az --version
para encontrar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure. - Caso você deseje usar uma sub-rede ou um grupo de recursos existente, a identidade do cluster do AKS também precisa ter permissão para gerenciar os recursos de rede. Para obter informações, confira Usar a rede do kubenet com seus intervalos de endereços IP no AKS ou Configurar a rede da CNI do Azure no AKS. Se você estiver configurando o balanceador de carga para usar um endereço IP em outra sub-rede, verifique se a identidade do cluster do AKS também tem acesso de leitura nessa sub-rede.
- Para obter mais informações sobre permissões, confira Delegar acesso do AKS a outros recursos do Azure.
Criar um balanceador de carga interno
Crie um manifesto de serviço denominado
internal-lb.yaml
com o tipo de serviçoLoadBalancer
e a anotaçãoazure-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
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
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.
- Definir as anotações de serviço
- Adicione a propriedade LoadBalancerIP ao manifesto YAML do balanceador de carga
Defina as anotações do serviço utilizando
service.beta.kubernetes.io/azure-load-balancer-ipv4
para um endereço IPv4 eservice.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
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
Conectar o Serviço de Link Privado do Azure ao balanceador de carga interno
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. Esse grupo de recursos é o local em que você deve criar o ponto de extremidade privado. Se você não tiver esses recursos, confira Criar uma rede virtual e uma sub-rede.
Criar uma conexão de serviço de Link Privado
Crie um manifesto de serviço denominado
internal-lb-pls.yaml
com o tipo de serviçoLoadBalancer
e as anotaçõesazure-load-balancer-internal
eazure-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
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
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
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
Criar um Ponto de Extremidade Privado para o serviço de Link Privado
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 cargaEXTERNAL-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.
Azure Kubernetes Service