Utilize um equilibrador interno de carga com Azure Kubernetes Service (AKS)

Para restringir o acesso às suas aplicações em Azure Kubernetes Service (AKS), pode criar e utilizar um equilibrador de carga interno. Um equilibrador de carga interno torna um serviço Kubernetes acessível apenas a aplicações que são executando na mesma rede virtual que o cluster Kubernetes. Este artigo mostra-lhe como criar e utilizar um equilibrador de carga interno com Azure Kubernetes Service (AKS).

Nota

Balanceador de Carga do Azure está disponível em dois SKUs - Básico e Standard. Por predefinição, quando cria um cluster do AKS, é utilizado o SKU Standard. Ao criar um Serviço com o tipo de LoadBalancer, obterá o mesmo tipo LB que quando forctifica o cluster. Para obter mais informações, consulte a comparação SKU do balanceador de carga Azure.

Antes de começar

Este artigo assume que você tem um cluster AKS existente. Se precisar de um cluster AKS, consulte o quickstart AKS utilizando o Azure CLI, utilizando Azure PowerShell ou utilizando o portal do Azure.

Também precisa da versão Azure CLI 2.0.59 ou posteriormente instalada e configurada. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

A identidade do cluster AKS necessita de permissão para gerir os recursos da rede se utilizar uma sub-rede ou grupo de recursos existentes. Para obter informações, consulte a rede kubenet com os seus próprios intervalos de endereço IP em Azure Kubernetes Service (AKS) ou Configure CNI em Azure Kubernetes Service (AKS). Se estiver a configurar o seu equilibrador de carga para utilizar um endereço IP numa sub-rede diferente, certifique-se de que a identidade do cluster AKS também leu o acesso a essa sub-rede.

Para obter mais informações sobre permissões, consulte o delegado AKS acesso a outros recursos Azure.

Criar um balanceador de carga interno

Para criar um equilibrador de carga interno, crie um manifesto de serviço denominado internal-lb.yaml com o tipo de serviço LoadBalancer e a anotação interna de balançadores de carga azure-load-internal , como mostra o seguinte exemplo:

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

Coloque o balançador de carga interno utilizando o kubectl e especifique o nome do seu manifesto YAML:

kubectl apply -f internal-lb.yaml

Um equilibrador de carga Azure é criado no grupo de recursos de nó e ligado à mesma rede virtual que o cluster AKS.

Quando vê os dados de serviço, o endereço IP do balançador de carga interno é indicado na coluna EXTERNAL-IP . Neste contexto, o External está em relação à interface externa do esquilibrador de carga, não que receba um endereço IP público e externo. Pode levar um minuto ou dois para que o endereço IP mude de <pendente> para um endereço IP interno real, como mostra o seguinte exemplo:

$ kubectl get service internal-app

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

Se quiser utilizar um endereço IP específico com o balançador de carga interno, adicione a propriedade loadBalancerIP ao manifesto yaML do balançador de carga. Neste cenário, o endereço IP especificado deve residir na mesma sub-rede que o cluster AKS, mas não pode ser atribuído a um recurso. Por exemplo, um endereço IP no intervalo designado para a sub-rede Kubernetes dentro do cluster AKS não deve ser utilizado.

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

Quando implementado e visualiza os dados de serviço, o endereço IP na coluna EXTERNAL-IP reflete o seu endereço IP especificado:

$ kubectl get service internal-app

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 a configuração do seu balançador de carga numa sub-rede diferente, consulte Especificar uma sub-rede diferente

Antes de começar

Deve ter o seguinte recurso instalado:

  • A CLI do Azure
  • Kubernetes versão 1.22.x ou superior

Para anexar um serviço de Azure Private Link a um equilibrador de carga interno, crie um manifesto de serviço nomeado internal-lb-pls.yaml com o tipo de serviço LoadBalancer e a anotação de equilíbrio-carga-azure-interna e azure-pls-create, como mostrado no exemplo abaixo. Para mais opções, consulte o documento de design de integração de serviços Azure Private Link

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

Coloque o balançador de carga interno utilizando o kubectl e especifique o nome do seu manifesto YAML:

kubectl apply -f internal-lb-pls.yaml

Um equilibrador de carga Azure é criado no grupo de recursos de nó e ligado à mesma rede virtual que o cluster AKS.

Quando vê os dados de serviço, o endereço IP do balançador de carga interno é indicado na coluna EXTERNAL-IP . Neste contexto, o External está em relação à interface externa do esquilibrador de carga, não que receba um endereço IP público e externo. Pode levar um minuto ou dois para que o endereço IP mude de <pendente> para um endereço IP interno real, como mostra o seguinte exemplo:

$ kubectl get service internal-app

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
internal-app   LoadBalancer   10.125.17.53  10.125.0.66   80:30430/TCP   64m

Além disso, também será criado um objeto de serviço Private Link que se conecta à configuração IP frontend do Balanceador de Carga associado ao serviço Kubernetes. Os detalhes do objeto de serviço Private Link podem ser recuperados como mostrado no seguinte exemplo:

$ AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
$ az network private-link-service list -g ${AKS_MC_RG} --query "[].{Name:name,Alias:alias}" -o table

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

Um Ponto Final Privado permite-lhe ligar-se privadamente ao seu objeto de serviço Kubernetes através do Serviço Private Link criado acima. Para tal, siga o exemplo abaixo mostrado:

$ AKS_PLS_ID=$(az network private-link-service list -g ${AKS_MC_RG} --query "[].id" -o tsv)
$ 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

Utilizar redes privadas

Quando criar o seu cluster AKS, pode especificar definições avançadas de rede. Esta abordagem permite-lhe implantar o cluster numa rede virtual Azure existente e sub-redes. Um dos cenários é implantar o seu cluster AKS numa rede privada ligada ao seu ambiente no local e executar serviços apenas acessíveis internamente. Para obter mais informações, consulte configurar as suas próprias sub-redes de rede virtuais com Kubenet ou Azure CNI.

Não são necessárias alterações nos passos anteriores para implantar um equilibrador de carga interno num cluster AKS que utilize uma rede privada. O equilibrador de carga é criado no mesmo grupo de recursos que o seu cluster AKS, mas ligado à sua rede virtual privada e sub-rede, como mostra o 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

Nota

Poderá ser necessário conceder a identidade do cluster para o seu cluster AKS, a função de Contribuinte de Rede para o grupo de recursos onde os seus recursos de rede virtual Azure são implantados. Veja a identidade do cluster com az aks show, tais como az aks show --resource-group myResourceGroup --name myAKSCluster --query "identity". Para criar uma atribuição de funções, use a atribuição de funções az criar comando.

Especificar uma sub-rede diferente

Para especificar uma sub-rede para o seu balanceador de carga, adicione a anotação da sub-rede azure-load-balancer-internal-subnet ao seu serviço. A sub-rede especificada deve estar na mesma rede virtual que o seu cluster AKS. Quando implantado, o endi de caixa externo-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

Eliminar o balanceador de carga

Quando todos os serviços que utilizam o balançador interno de carga são eliminados, o próprio equilibrador de carga também é eliminado.

Também pode eliminar diretamente um serviço como qualquer recurso Kubernetes, como kubectl delete service internal-app, que também elimina o equilibrador de carga Azure subjacente.

Passos seguintes

Saiba mais sobre os serviços da Kubernetes na documentação dos serviços kubernetes.