Usar um endereço IP público estático e um rótulo de DNS com o balanceador de carga do AKS (Serviço de Kubernetes do Azure)

Quando você cria um recurso do balanceador de carga em um cluster do Serviço de Kubernetes do Azure (AKS), o endereço IP público atribuído a ele é válido apenas durante a vida útil desse recurso. Se você excluir o serviço de Kubernetes, o balanceador de carga e o endereço IP associados também serão excluídos. Se você quiser atribuir um endereço IP específico ou manter um endereço IP para serviços de Kubernetes reimplantados, crie e use um endereço IP público estático.

Este artigo mostra como criar um endereço IP público estático e atribuí-lo ao serviço de Kubernetes.

Antes de começar

Criar um cluster AKS

  1. Crie um grupo de recursos do Azure usando o comando az group create.

    az group create --name myNetworkResourceGroup --location eastus
    
  2. Crie um cluster do AKS usando o az aks create comando.

    az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
    

Criar um endereço IP estático

  1. Obtenha o nome do grupo de recursos do nó usando o comando az aks show e a consulta para a propriedade nodeResourceGroup.

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. Crie um endereço IP público estático no grupo de recursos do nó usando o comando az network public-ip create.

    az network public-ip create \
        --resource-group <node resource group name> \
        --name myAKSPublicIP \
        --sku Standard \
        --allocation-method static
    

    Importante

    O AKS não dá mais suporte ao Load Balancer Básico. Se o cluster usar um Load Balancer Básico, atualize para Standard Load Balancer antes de configurar um endereço IP público estático.

  3. Obtenha o endereço IP público estático usando o az network public-ip show comando. Especifique o nome do grupo de recursos do nó e o endereço IP público que você criou e consulte o ipAddress.

    az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
    

Criar um serviço do Kubernetes com o endereço IP estático

  1. Crie um arquivo nomeado load-balancer-service.yaml e copie o conteúdo do arquivo YAML a seguir. Forneça o nome do recurso IP público (myAKSPublicIP) que você criou na seção Criar um endereço IP estático e o nome do grupo de recursos do nó.

    A identidade do plano de controle do AKS tem permissões de Colaborador no grupo de recursos dos nós por padrão, portanto, o IP público criado neste artigo não requer uma atribuição de função adicional. Se você usar um IP público de entrada ou de saída em um grupo de recursos diferente, conceda à identidade do plano de controle as permissões necessárias nesse grupo de recursos. Para obter mais informações, consulte Identidades gerenciadas no AKS.

    Importante

    A propriedade loadBalancerIP em um manifesto de serviço do Kubernetes foi descontinuada, em conformidade com o Kubernetes upstream. Os serviços existentes continuam funcionando sem modificações, mas use anotações de serviço em vez disso.

    Annotation Purpose
    service.beta.kubernetes.io/azure-pip-name Especifique o nome do recurso IP público.
    service.beta.kubernetes.io/azure-load-balancer-ipv4 Especifique um endereço IPv4.
    service.beta.kubernetes.io/azure-load-balancer-ipv6 Especifique um endereço IPv6.
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    

    Observação

    Adicionar a anotação service.beta.kubernetes.io/azure-pip-name garante a criação mais eficiente do LoadBalancer e é altamente recomendável para evitar possíveis limitações.

  2. Defina um rótulo DNS voltado ao público para o serviço usando a anotação de serviço service.beta.kubernetes.io/azure-dns-label-name. Isso publica um nome de domínio totalmente qualificado (FQDN) para seu serviço usando os servidores DNS públicos do Azure e um domínio de nível superior. O valor da anotação precisa ser exclusivo no local do Azure, por isso recomendamos que você use um rótulo suficientemente qualificado. O Azure adiciona automaticamente um sufixo padrão no local selecionado, como <location>.cloudapp.azure.com, ao nome fornecido, criando o FQDN.

    Observação

    Se desejar publicar o serviço no seu próprio domínio, consulte DNS do Azure e o projeto external-DNS.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
        service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    
  3. Antes de criar o serviço, verifique se o cluster possui uma carga de trabalho com pods que usam o rótulo app: azure-load-balancer. O manifesto do serviço seleciona pods com esse rótulo, mas não cria uma implantação.

  4. Crie o serviço usando o kubectl apply comando.

    kubectl apply -f load-balancer-service.yaml
    
  5. Verifique se o serviço seleciona pelo menos um pod pronto em execução.

    kubectl get pods -l app=azure-load-balancer
    
  6. Para ver o rótulo DNS do balanceador de carga, use o comando kubectl describe.

    kubectl describe service azure-load-balancer
    

    O rótulo DNS será listado sob o Annotations, como mostrado no exemplo resumido de saída a seguir:

    Name:                    azure-load-balancer
    Namespace:               default
    Labels:                  <none>
    Annotations:             service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
    

Solucionar problemas

Esta seção pressupõe que você concluiu a criação de um endereço IP estático, tentou as etapas em Criar um serviço kubernetes com o endereço IP estático e tem um cluster AKS em execução. Para obter o nome do grupo de recursos do nó, use az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv.

Se o recurso ip público nomeado na service.beta.kubernetes.io/azure-pip-name anotação não existir no grupo de recursos especificado por service.beta.kubernetes.io/azure-load-balancer-resource-group, ou a identidade do plano de controle do AKS não puder acessar esse grupo de recursos, a criação do serviço do balanceador de carga falhará. Para solucionar problemas, examine as anotações de serviço e os eventos de criação usando o kubectl describe comando. Forneça o nome do serviço especificado no manifesto YAML, conforme mostrado no exemplo a seguir:

kubectl describe service azure-load-balancer

A saída exibe informações sobre o recurso de serviço do Kubernetes. O seguinte exemplo de saída mostra um Warning no Events: "user supplied IP address was not found." Neste cenário, verifique se a anotação azure-pip-name corresponde ao nome do recurso de IP público estático e que a anotação azure-load-balancer-resource-group corresponde ao grupo de recursos que o contém.

Name:                     azure-load-balancer
Namespace:                default
Labels:                   <none>
Annotations:              service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
                          service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
Selector:                 app=azure-load-balancer
Type:                     LoadBalancer
IP:                       10.0.18.125
IP:                       40.121.183.52
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32582/TCP
Endpoints:                <pod-ip>:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   CreatingLoadBalancer        7s (x2 over 22s)  service-controller  Creating load balancer
  Warning  CreatingLoadBalancerFailed  6s (x2 over 12s)  service-controller  Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found

Próximas etapas

Para obter mais controle sobre o tráfego de rede para seus aplicativos, use o complemento de roteamento de aplicativos para AKS. Para saber mais sobre o complemento de roteamento de aplicativos, confira Entrada do NGINX gerenciada com o complemento de roteamento de aplicativos.