Usare un indirizzo IP pubblico statico e l'etichetta DNS con il bilanciamento del carico del servizio Azure Kubernetes

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 del servizio Azure Kubernetes

  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 del servizio Azure Kubernetes 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 comando az network public ip create.

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

    Nota

    Se nel cluster del servizio Azure Kubernetes si usa un servizio di bilanciamento del carico dello SKU Basic, usare Basic per il parametro --sku quando si definisce un IP pubblico. Solo gli indirizzi IP SKU Basic funzionano con il servizio di bilanciamento del carico dello SKU Basic e solo gli indirizzi IP SKU Standard funzionano con servizi di bilanciamento del carico dello SKU Standard.

  3. Ottenere l'indirizzo IP pubblico statico usando il comando az network public-ip list. Specificare il nome del gruppo di risorse del nodo e dell'indirizzo IP pubblico creato ed eseguire una query per il ipAddress.

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

Creare un servizio usando l'indirizzo IP statico

  1. Determinare prima di tutto il tipo di identità gestita usato dal cluster del servizio Azure Kubernetes, assegnato dal sistema o dall'utente. Se non si è certi, chiamare il comando az aks show ed eseguire una query per la proprietà type dell'identità.

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

    Se il cluster usa un'identità gestita, il valore della proprietà type sarà SystemAssigned o UserAssigned.

    Se il cluster usa un'entità servizio, il valore della proprietà type sarà Null. Prendere in considerazione l'aggiornamento del cluster per usare un'identità gestita.

  2. Se il cluster del servizio Azure Kubernetes usa un'identità gestita assegnata dal sistema, eseguire una query sull'ID dell’entità di sicurezza dell'identità gestita come indicato di seguito:

    # 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 il cluster del servizio Azure Kubernetes usa un'identità gestita assegnata dall'utente, l'ID dell’entità di sicurezza sarà Null. Eseguire invece una query per l'ID client dell'identità gestita assegnata dall'utente:

    # 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. Assegnare autorizzazioni delegate per l'identità gestita usata dal cluster del servizio Azure Kubernetes per il gruppo di risorse dell’indirizzo IP pubblico chiamando il 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 è stato personalizzato l'indirizzo IP in uscita, assicurarsi che l'identità del cluster disponga delle autorizzazioni sia per l'indirizzo IP pubblico in uscita che per l'indirizzo IP pubblico in ingresso.

  4. Creare un file denominato load-balancer-service.yaml e copiarlo nel contenuto del file YAML seguente, specificando il proprio indirizzo IP pubblico creato nel passaggio precedente e il nome del gruppo di risorse del nodo.

    Importante

    L'aggiunta della proprietà loadBalancerIP al manifesto YAML del servizio di bilanciamento del carico è deprecata seguendo Kubernetes upstream. Anche se l'utilizzo corrente rimane invariato e si prevede che i servizi esistenti funzionino senza modifiche, è consigliabile impostare invece le annotazioni del servizio. Per impostare le annotazioni del servizio, è possibile usare service.beta.kubernetes.io/azure-pip-name per il nome IP pubblico oppure usare service.beta.kubernetes.io/azure-load-balancer-ipv4 per un indirizzo IPv4 e service.beta.kubernetes.io/azure-load-balancer-ipv6 per un indirizzo IPv6, come illustrato nell'esempio 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
    

    Nota

    L'aggiunta dell'annotazione service.beta.kubernetes.io/azure-pip-name garantisce la creazione di LoadBalancer più efficiente ed è consigliabile evitare potenziali limitazioni.

  5. 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
    
  6. Creare il servizio e la distribuzione usando il comando kubectl apply.

    kubectl apply -f load-balancer-service.yaml
    
  7. Per visualizzare l'etichetta DNS per il servizio di bilanciamento del carico, usare il comando kubectl describe service.

    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.kuberenetes.io/azure-dns-label-name: <unique-service-label>
    

Risoluzione dei problemi

Se l'indirizzo IP statico definito nella proprietà loadBalancerIP del manifesto del servizio Kubernetes non esiste o non è stato creato nel gruppo di risorse del nodo e non sono state configurate altre deleghe, la creazione del servizio di bilanciamento del carico non riesce. Per risolvere i problemi, esaminare gli eventi di creazione del servizio usando il comando kubectl describe. 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, verificare che sia stato creato l'indirizzo IP pubblico statico nel gruppo di risorse del nodo e che l'indirizzo IP specificato nel manifesto del servizio Kubernetes sia corretto.

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

Passaggi successivi

Per un maggiore controllo sul traffico di rete verso le applicazioni, usare il componente aggiuntivo di instradamento dell'applicazione per il servizio Azure Kubernetes. Per altre informazioni sul componente aggiuntivo di instradamento dell'applicazione, vedere Ingresso NGINX gestito con il componente aggiuntivo di instradamento dell'applicazione.