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

Quando você cria um recurso de balanceador de carga em um cluster do Serviço Kubernetes do Azure (AKS), o endereço IP público atribuído a ele só é válido para a vida útil desse recurso. Se você excluir o serviço Kubernetes, o balanceador de carga associado e o endereço IP também serão excluídos. Se quiser atribuir um endereço IP específico ou manter um endereço IP para serviços Kubernetes reimplantados, você pode criar e usar 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 seu serviço Kubernetes.

Antes de começar

Criar um cluster do AKS

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

    az group create --name myNetworkResourceGroup --location eastus
    
  2. Crie um cluster 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 consulte 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 de nós usando o az network public-ip create comando.

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

    Importante

    O AKS já não suporta o Basic Balanceador de Carga. Se o seu cluster usar um Basic Balanceador de Carga, atualize para o Balanceador de Carga Standard 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 criou, e execute uma consulta para o ipAddress.

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

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

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

    A identidade do plano de controlo do AKS tem, por predefinição, permissões de Colaborador no grupo de recursos dos nós, pelo que o IP público criado neste artigo não requer outra atribuição de papel. Se usar um IP público de entrada ou saída num grupo de recursos diferente, conceda à identidade do plano de controlo as permissões necessárias nesse grupo de recursos. Para mais informações, consulte Identidades geridas no AKS.

    Importante

    A propriedade loadBalancerIP num manifesto de serviço do Kubernetes foi preterida na sequência do Kubernetes upstream. Os serviços existentes continuam a funcionar sem alterações, mas, em vez disso, utilize anotações de serviço.

    Anotação 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
    

    Nota

    Adicionar a anotação service.beta.kubernetes.io/azure-pip-name assegura a criação mais eficiente do balanceador de carga e é altamente recomendada para evitar possíveis limitações.

  2. Defina um rótulo DNS voltado para o 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 e o domínio de nível superior do Azure. O valor da anotação deve ser exclusivo dentro do local do Azure, portanto, recomendamos que utilize uma etiqueta suficientemente qualificada. O Azure acrescenta automaticamente um sufixo padrão no local selecionado, como <location>.cloudapp.azure.com, ao nome fornecido, criando o FQDN.

    Nota

    Se você quiser publicar o serviço em seu próprio domínio, consulte DNS do Azure e o projeto de DNS externo .

    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, certifique-se de que o seu cluster tem uma carga de trabalho com pods que usam a app: azure-load-balancer etiqueta. O manifesto de serviço seleciona pods com este rótulo mas não cria uma implementaçã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 operacional e pronto.

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

    kubectl describe service azure-load-balancer
    

    O rótulo DNS será listado sob o Annotations, conforme mostrado na seguinte saída de exemplo condensado:

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

Resolução de problemas

Esta secção assume que completou o Criar um endereço IP estático, tentou os passos em Criar um serviço Kubernetes com o endereço IP estático e tem um cluster AKS a correr. 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 se a identidade do plano de controlo do AKS não conseguir aceder a esse grupo de recursos, a criação do serviço do balanceador de carga falha. Para resolver o problema, reveja as anotações do 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 mostra informações sobre o recurso de serviço Kubernetes. O exemplo de saída seguinte mostra um Warning no(a) Events: "user supplied IP address was not found." Neste cenário, certifique-se de que a anotação azure-pip-name corresponde ao nome do recurso de IP público estático e de 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óximos passos

Para mais controlo sobre o tráfego de rede para as suas aplicações, use o complemento de encaminhamento de aplicações para AKS. Para mais informações sobre o complemento de roteamento de aplicações, consulte Entrada NGINX gerida com o complemento de encaminhamento de aplicações.