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

  • Será necessária a CLI do Azure versão 2.0.59 ou posterior instalada e configurada. Execute az --version para encontrar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.
  • Este artigo aborda o uso de um IP de SKU Standard com um balanceador de carga de SKU Standard. Para obter mais informações, confira Tipos de endereço IP e métodos de alocação no Azure.

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 comando az aks create.

    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ó utilizando 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
    

    Observação

    Se você estiver usando um balanceador de carga de SKU Básico no seu cluster do AKS, use Básico no parâmetro --sku ao definir um IP público. Somente os IPs de SKU Básico funcionam com o balanceador de carga de SKU Básico e somente os IPs de SKU Standard funcionam com os balanceadores de carga de SKU Standard.

  3. Obtenha o endereço IP público estático usando o comando az network public-ip list. 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 usando o endereço IP estático

  1. Primeiro, determine qual tipo de identidade gerenciada o cluster do AKS está usando – atribuída pelo sistema ou atribuída pelo usuário. Se você não tiver certeza, chame o comando az aks show e consulte a propriedade de tipo da identidade.

    az aks show \
        --name myAKSCluster \
        --resource-group myResourceGroup \
        --query identity.type \
        --output tsv       
    

    Se o cluster estiver usando uma identidade gerenciada, o valor da propriedade tipo será SystemAssigned ou UserAssigned.

    Se o cluster estiver usando uma entidade de serviço, o valor da propriedade tipo será nulo. Considere atualizar o cluster para usar uma identidade gerenciada.

  2. Se o cluster do AKS usar uma identidade gerenciada atribuída pelo sistema, consulte a ID da entidade de segurança da identidade gerenciada da seguinte maneira:

    # Get the principal ID for a system-assigned managed identity.
    CLIENT_ID=$(az aks show \
        --name myAKSCluster \
        --resource-group myNetworkResourceGroup \
        --query identity.principalId \
        --output tsv)
    

    Se o cluster do AKS usar uma identidade gerenciada atribuída pelo usuário, a ID da entidade de segurança será nula. Em vez disso, consulte a ID do cliente da identidade gerenciada atribuída pelo usuário:

    # Get the client ID for a user-assigned managed identity.
    CLIENT_ID=$(az aks show \
        --name myAKSCluster \
        --resource-group myNetworkResourceGroup \
        --query identity.userAssignedIdentities.*.clientId \
        --output tsv    
    
  3. Atribua permissões delegadas para a identidade gerenciada usada pelo cluster do AKS para o grupo de recursos do IP público chamando o comando az role assignment create.

    # Get the resource ID for the node resource group.
    RG_SCOPE=$(az group show \
        --name <node resource group> \
        --query id \
        --output tsv)
    
    # Assign the Network Contributor role to the managed identity,
    # scoped to the node resource group.
    az role assignment create \
        --assignee ${CLIENT_ID} \
        --role "Network Contributor" \
        --scope ${RG_SCOPE}
    

    Importante

    Se você personalizou seu IP de saída, verifique se a identidade do cluster tem permissões para o IP público de saída e para o IP público de entrada.

  4. Crie um arquivo com o nome load-balancer-service.yaml e copie o conteúdo do arquivo YAML a seguir, fornecendo seu próprio endereço IP público criado na etapa anterior e o nome do grupo de recursos do nó.

    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. Para definir anotações de serviço, você pode usar service.beta.kubernetes.io/azure-pip-name para o nome IP público ou 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, conforme mostrado no exemplo de YAML.

    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.

  5. 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
    
  6. Crie o serviço e a implantação usando o comando kubectl apply.

    kubectl apply -f load-balancer-service.yaml
    
  7. Para ver o rótulo DNS do balanceador de carga, use o comando kubectl describe service.

    kubectl describe service azure-load-balancer
    

    O rótulo DNS será listado em Annotations, como mostrado na saída de exemplo condensado a seguir:

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

Solucionar problemas

Se o endereço IP estático definido na propriedade loadBalancerIP do manifesto do serviço do Kubernetes não existir ou não tiver sido criado no grupo de recursos do nó e não houver outras delegações configuradas, a criação do serviço de balanceador de carga falhará. Para solucionar problemas, revise os eventos de criação do serviço usando o comando kubectl describe. 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 mostra as informações sobre o recurso do serviço do Kubernetes. A saída de exemplo a seguir mostra um Warning no Events: "user supplied IP address was not found". Nesse cenário, certifique-se de criar o endereço IP público estático no grupo de recursos de nó e se o endereço IP especificado no manifesto do serviço do Kubernetes está correto.

Name:                     azure-load-balancer
Namespace:                default
Labels:                   <none>
Annotations:              <none>
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:                <none>
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 ter mais controle sobre o tráfego de rede para os seus aplicativos, utilize o complemento de roteamento de aplicativos para AKS. Para obter mais informações sobre o complemento de roteamento de aplicativos, confira Entrada NGINX gerenciada com o complemento de roteamento de aplicativos.