Usare un indirizzo IP pubblico statico e un'etichetta DNS con il servizio di bilanciamento del carico di Servizio Azure Kubernetes (AKS)

Quando si crea una risorsa del servizio di bilanciamento del carico in un cluster del servizio Azure Kubernetes, l'indirizzo IP pubblico assegnato è valido solo per la durata della risorsa. Se si elimina il servizio Kubernetes, vengono eliminati anche il bilanciamento del carico e l'indirizzo IP associati. Se si vuole assegnare un indirizzo IP specifico o mantenere un indirizzo IP per i servizi Kubernetes ridistribuiti, è possibile creare e usare un indirizzo IP pubblico statico.

Questo articolo illustra come creare un indirizzo IP pubblico statico e assegnarlo al servizio Kubernetes.

Operazioni preliminari

Creare un cluster AKS

  1. Creare un gruppo di risorse di Azure usando il comando az group create.

    az group create --name myNetworkResourceGroup --location eastus
    
  2. Creare un cluster AKS usando il comando az aks create.

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

Creare un indirizzo IP statico

  1. Ottenere il nome del gruppo di risorse del nodo usando il comando az aks show e la query per la proprietà nodeResourceGroup.

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. Creare un indirizzo IP pubblico statico nel gruppo di risorse del nodo usando il 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

    AKS non supporta più Basic Load Balancer. Se il cluster usa un Load Balancer Basic, eseguire l'aggiornamento a Load Balancer Standard prima di configurare un indirizzo IP pubblico statico.

  3. Ottenere l'indirizzo IP pubblico statico usando il az network public-ip show comando . Specificare il nome del gruppo di risorse del nodo e l'indirizzo IP pubblico che è stato creato, quindi interrogare il ipAddress.

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

Creare un servizio Kubernetes con l'indirizzo IP statico

  1. Creare un file denominato load-balancer-service.yaml e copiarlo nel contenuto del file YAML seguente. Specificare il nome della risorsa IP pubblico (myAKSPublicIP) creato nella sezione Creare un indirizzo IP statico e il nome del gruppo di risorse del nodo.

    Per impostazione predefinita, l'identità del piano di controllo di AKS dispone delle autorizzazioni di Collaboratore sul gruppo di risorse del nodo, quindi l'indirizzo IP pubblico creato in questo articolo non richiede un'ulteriore assegnazione di ruolo. Se si usa un indirizzo IP pubblico in ingresso o in uscita in un gruppo di risorse diverso, concedere al piano di controllo le autorizzazioni necessarie per tale gruppo di risorse. Per altre informazioni, vedi Identità gestite in AKS.

    Importante

    La proprietà loadBalancerIP in un manifest di servizio Kubernetes è deprecata in linea con Kubernetes upstream. I servizi esistenti continuano a funzionare senza modifiche, ma usano invece le annotazioni del servizio.

    Annotation Purpose
    service.beta.kubernetes.io/azure-pip-name Specificare il nome della risorsa IP pubblica.
    service.beta.kubernetes.io/azure-load-balancer-ipv4 Specificare un indirizzo IPv4.
    service.beta.kubernetes.io/azure-load-balancer-ipv6 Specificare un indirizzo 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

    L'aggiunta dell'annotazione service.beta.kubernetes.io/azure-pip-name assicura la creazione del LoadBalancer nel modo più efficiente ed è fortemente consigliata per evitare potenziali limitazioni della velocità.

  2. Impostare un'etichetta DNS pubblica sul servizio usando l'annotazione del servizio service.beta.kubernetes.io/azure-dns-label-name. In questo modo viene pubblicato un nome di dominio completo (FQDN) per il servizio usando i server DNS pubblici di Azure e il dominio di primo livello. Il valore dell'annotazione deve essere univoco all'interno della posizione di Azure, quindi è consigliabile usare un'etichetta sufficientemente qualificata. Azure aggiunge automaticamente un suffisso predefinito nel percorso selezionato, ad esempio <location>.cloudapp.azure.com, al nome specificato, creando il nome FQDN.

    Nota

    Per pubblicare il servizio nel proprio dominio, vedere DNS di Azure e il progetto 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. Prima di creare il servizio, assicurati che il cluster abbia un workload con pod che utilizzano l'etichetta app: azure-load-balancer. Il manifesto del servizio seleziona i pod con questa etichetta, ma non crea una distribuzione.

  4. Creare il servizio usando il kubectl apply comando .

    kubectl apply -f load-balancer-service.yaml
    
  5. Verificare che il servizio selezioni almeno un pod in esecuzione e pronto.

    kubectl get pods -l app=azure-load-balancer
    
  6. Per visualizzare l'etichetta DNS per il servizio di bilanciamento del carico, usare il comando kubectl describe.

    kubectl describe service azure-load-balancer
    

    L'etichetta DNS verrà elencata sotto il Annotations, come illustrato nell'output di esempio condensato seguente:

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

Risoluzione dei problemi

In questa sezione si presuppone che sia stato completato l'istruzione Creare un indirizzo IP statico, aver tentato di eseguire la procedura descritta in Creare un servizio Kubernetes con l'indirizzo IP statico e avere un cluster del servizio Azure Kubernetes in esecuzione. Per recuperare il nome del gruppo di risorse del nodo, usare az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv.

Se la risorsa IP pubblica denominata nell'annotazione service.beta.kubernetes.io/azure-pip-name non esiste nel gruppo di risorse specificato da service.beta.kubernetes.io/azure-load-balancer-resource-groupo l'identità del piano di controllo del servizio Azure Kubernetes non riesce ad accedere a tale gruppo di risorse, la creazione del servizio di bilanciamento del carico non riesce. Per risolvere i problemi, esaminare le annotazioni del servizio e gli eventi di creazione usando il kubectl describe comando . Specificare il nome del servizio indicato nel manifesto YAML, come illustrato nell'esempio seguente:

kubectl describe service azure-load-balancer

L'output mostra informazioni sulla risorsa del servizio Kubernetes. L'output di esempio seguente mostra un Warning nel Events: "user supplied IP address was not found". In questo scenario, assicurarsi che l'annotazione azure-pip-name corrisponda al nome della risorsa IP pubblica statica e che l'annotazione azure-load-balancer-resource-group corrisponda al gruppo di risorse che la contiene.

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

Passaggi successivi

Per un maggiore controllo sul traffico di rete diretto alle tue applicazioni, utilizza il componente aggiuntivo per il routing delle applicazioni per AKS. Per altre informazioni sul componente aggiuntivo di routing delle app, vedere Ingresso NGINX gestito con il componente aggiuntivo di routing dell'applicazione.