Condividi tramite


Servizio DNS in Azure Service Fabric

Il servizio DNS è un servizio di sistema facoltativo che è possibile abilitare nel cluster per individuare altri servizi usando il protocollo DNS.

Molti servizi, in particolare quelli in contenitore, sono indirizzabili tramite un URL preesistente. È preferibile poterli risolvere mediante il protocollo DNS standard, anziché mediante il protocollo Service Fabric Naming Service. Il servizio DNS consente di eseguire il mapping di nomi DNS a nomi di servizi e di conseguenza di risolvere gli indirizzi IP degli endpoint. Questa funzionalità mantiene la portabilità dei servizi in contenitori su diverse piattaforme e può semplificare gli scenari "lift-and-shift" poiché consente di usare gli URL di servizi esistenti anziché dover riscrivere il codice per usare il protocollo Naming Service.

Il servizio DNS esegue il mapping dei nomi DNS ai nomi di servizi, che vengono quindi risolti da Naming Service per permettere la restituzione dell'endpoint di servizio. Il nome DNS per il servizio viene fornito al momento della creazione. Nel diagramma seguente viene illustrato il funzionamento del servizio DNS per i servizi senza stato. Per brevità, i diagrammi mostrano un solo endpoint per i servizi, sebbene ogni servizio possa avere più endpoint.

Diagram showing how DNS names are mapped to service names by DNS service for stateless services.

A partire da Service Fabric versione 6.3, il protocollo DNS di Service Fabric è stato esteso per includere uno schema di indirizzamento dei servizi con stato partizionati. Queste estensioni consentono di risolvere specifici indirizzi IP delle partizioni usando una combinazione del nome DNS del servizio con stato e il nome della partizione. Sono supportati tutti e tre gli schemi di partizione:

  • Partizionamento denominato
  • Partizionamento per intervalli
  • Partizionamento singleton

Nel diagramma seguente viene illustrato il funzionamento del servizio DNS per i servizi con stato partizionati.

Diagram showing how DNS names are mapped to service names by DNS service for partitioned stateful services.

Per altre informazioni sulle query partizionate, vedere la sezione seguente.

Sistemi operativi supportati

Il servizio DNS è supportato nei cluster Windows e Linux, benché il supporto per Linux sia attualmente limitato ai servizi in contenitori e non possa essere abilitato tramite il portale di Azure. Windows supporta tuttavia tutti i tipi di servizio e i modelli di distribuzione.

Abilitare il servizio DNS

Nota

L'abilitazione del servizio DNS provoca la sostituzione di alcune impostazioni DNS nei nodi. Se si verificano problemi di connessione a Internet, controllare le impostazioni DNS.

Nuovi cluster

Creare cluster con i modelli di Resource Manager

Per distribuire un nuovo cluster con i modelli di Resource Manager, è possibile usare i modelli di esempio o scrivere modelli personalizzati. Se questa operazione non è ancora stata eseguita, è possibile abilitare il servizio DNS nei modelli usando le versioni API minime supportate e aggiungendo le impostazioni appropriate. I dettagli su come eseguire questa operazioni sono riportati di seguito nei punti 1 e 2 dell'elenco numerato.

Creare cluster con il portale di Azure

Quando si crea un cluster standard nel portale, per impostazione predefinita il servizio DNS viene abilitato nell'opzione Includi servizio DNS nella sezione Funzionalità aggiuntive.

Screenshot of enabling DNS service for a standard cluster through the portal.

Quando si crea un cluster gestito nel portale, per impostazione predefinita il servizio DNS viene abilitato nell'opzione Servizio DNS nella sezione Funzionalità aggiuntive.

Screenshot of enabling DNS service for a managed cluster through the portal.

Cluster esistenti

Quando si aggiorna un cluster gestito esistente per abilitare il servizio DNS, è possibile farlo dal portale visitando la pagina Servizi aggiuntivi dalla pagina delle risorse del cluster. In alternativa, è possibile abilitare il servizio DNS usando metodi alternativi a cui si fa riferimento di seguito:

  • Usare il modello di Resource Manager usato per distribuire il cluster, se applicabile.
  • Passare al cluster in Azure Resource Explorer e aggiornare la risorsa cluster, come illustrato nei passaggi successivi (a partire dal passaggio 2).
  • Passare al cluster nel portale e fare clic su Esporta modello. Per maggiori informazioni, vedere Esportare il modello da un gruppo di risorse.

Quando si dispone di un modello, è possibile abilitare il servizio DNS seguendo questa procedura:

  1. Per i cluster standard, verificare che apiVersion sia impostato su 2017-07-01-preview o una versione successiva per la risorsa Microsoft.ServiceFabric/clusters e, se non lo è, aggiornarlo come illustrato nell'esempio seguente:

    {
        "apiVersion": "2017-07-01-preview",
        "type": "Microsoft.ServiceFabric/clusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    

    Per i cluster gestiti, verificare che apiVersion sia impostato su 2020-01-01-preview o una versione successiva per la risorsa Microsoft.ServiceFabric/managedClusters e, se non lo è, aggiornarlo come illustrato nell'esempio seguente:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. A questo punto abilitare il servizio DNS in uno dei modi seguenti:

    • Per abilitare il servizio DNS con le impostazioni predefinite, aggiungerlo alla sezione addonFeatures all'interno della sezione properties, come illustrato nell'esempio seguente:

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • Per abilitare il servizio con impostazioni diverse da quelle predefinite, aggiungere una sezione DnsService alla sezione fabricSettings all'interno della sezione properties. In questo caso, non è necessario aggiungere DnsService a addonFeatures. Per altre informazioni sulle proprietà che è possibile impostare per il servizio DNS, vedere Impostazioni del servizio DNS.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. Dopo avere aggiornato il modello di cluster con le modifiche, applicarle e consentire il completamento dell'aggiornamento. Al termine dell'aggiornamento, il servizio di sistema DNS viene avviato nel cluster. Il nome del servizio è fabric:/System/DnsService, e sarà possibile trovarlo nella sezione Sistema del servizio in Service Fabric Explorer.

Nota

Quando si aggiorna il servizio DNS da disabilitato a abilitato, è possibile che Service Fabric Explorer non rifletta il nuovo stato. Per risolvere il problema, riavviare i nodi modificando i criteri di aggiornamento nel modello.

Impostazione del nome DNS del servizio

È possibile impostare i nomi DNS dei servizi con i modelli di Resource Manager, con i servizi predefiniti nel file ApplicationManifest.xml o con i comandi di PowerShell.

Il nome DNS del servizio può essere risolto in tutto il cluster ed è quindi importante garantire l'univocità del nome DNS in tutto il cluster.

È consigliabile utilizzare uno schema di denominazione <ServiceName>.<AppName>, ad esempio service1.application1. Se un'applicazione viene distribuita usando Docker Compose, i nomi DNS vengono automaticamente assegnati ai servizi utilizzando questo schema di denominazione.

Impostare il nome DNS con il modello di Resource Manager

Se si usano modelli di Resource Manager per distribuire i servizi, è possibile aggiungere la proprietà serviceDnsName alla sezione appropriata e assegnare un valore a tale proprietà. Di seguito sono riportati alcuni esempi:

Cluster standard

Verificare che apiVersion sia impostato su 2019-11-01-preview o una versione successiva per la risorsa Microsoft.ServiceFabric/clusters/applications/services e, se non lo è, aggiornarlo come illustrato nell'esempio seguente:

{
  "apiVersion": "2019-11-01-preview",
  "type": "Microsoft.ServiceFabric/clusters/applications/services",
  "name": "[concat(parameters('clusterName'), '/', parameters('applicationName'), '/', parameters('serviceName'))]",
  "location": "[variables('clusterLocation')]",
  "dependsOn": [
    "[concat('Microsoft.ServiceFabric/clusters/', parameters('clusterName'), '/applications/', parameters('applicationName'))]"
  ],
  "properties": {
    "provisioningState": "Default",
    "serviceKind": "Stateless",
    "serviceTypeName": "[parameters('serviceTypeName')]",
    "instanceCount": "-1",
    "partitionDescription": {
      "partitionScheme": "Singleton"
    },
    "correlationScheme": [],
    "serviceLoadMetrics": [],
    "servicePlacementPolicies": [],
    "serviceDnsName": "[parameters('serviceDnsName')]"
  }
}

Cluster gestiti

Verificare che apiVersion sia impostato su 2022-10-01-preview o una versione successiva per la risorsa Microsoft.ServiceFabric/managedclusters/applications/services e, se non lo è, aggiornarlo come illustrato nell'esempio seguente:

{
  "apiVersion": "2022-10-01-preview",
  "type": "Microsoft.ServiceFabric/managedclusters/applications/services",
  "name": "[concat(parameters('clusterName'), '/', parameters('applicationName'), '/', parameters('serviceName'))]",
  "location": "[variables('clusterLocation')]",
  "dependsOn": [
    "[concat('Microsoft.ServiceFabric/managedclusters/', parameters('clusterName'), '/applications/', parameters('applicationName'))]"
  ],
  "properties": {
    "serviceKind": "Stateless",
    "serviceTypeName": "[parameters('serviceTypeName')]",
    "instanceCount": "-1",
    "partitionDescription": {
      "partitionScheme": "Singleton"
    },
    "correlationScheme": [],
    "serviceLoadMetrics": [],
    "servicePlacementPolicies": [],
    "serviceDnsName": "[parameters('serviceDnsName')]"
  }
}

Impostazione del nome DNS per un servizio predefinito nel file ApplicationManifest.xml

Aprire il progetto in Visual Studio o nell'editor preferito, quindi aprire il file ApplicationManifest.xml. Passare alla sezione relativa ai servizi predefiniti e per ciascuno di esso aggiungere l'attributo ServiceDnsName. Nell'esempio seguente viene mostrato come impostare il nome DNS del servizio su stateless1.application1

<Service Name="Stateless1" ServiceDnsName="stateless1.application1">
  <StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
    <SingletonPartition />
  </StatelessService>
</Service>

Nell'esempio seguente il nome DNS per un servizio con stato viene impostato su stateful1.application1. Il servizio usa uno schema di partizionamento denominato. Si noti che i nomi di partizioni sono in minuscolo. Questo è un requisito per le partizioni che verranno usate come destinazione nelle query DNS; per altre informazioni, vedere Effettuare query DNS su una partizione del servizio con stato.

<Service Name="Stateful1" ServiceDnsName="stateful1.application1" />
  <StatefulService ServiceTypeName="Stateful1Type" TargetReplicaSetSize="2" MinReplicaSetSize="2">
    <NamedPartition>
      <Partition Name="partition1" />
      <Partition Name="partition2" />
    </NamedPartition>
  </StatefulService>
</Service>

Impostare il nome DNS di un servizio con PowerShell

È possibile impostare il nome DNS di un servizio al momento della creazione usando il comando New-ServiceFabricService di PowerShell. L’esempio seguente si riferisce alla creazione un nuovo servizio senza stato con il nome DNS stateless1.application1:

New-ServiceFabricService `
    -Stateless `
    -PartitionSchemeSingleton `
    -ApplicationName fabric:/application1 `
    -ServiceName fabric:/application1/stateless1 `
    -ServiceTypeName Stateless1Type `
    -InstanceCount 1 `
    -ServiceDnsName stateless1.application1

È anche possibile aggiornare un servizio esistente usando il comando Update-ServiceFabricService di PowerShell. Nell'esempio seguente viene aggiornato un servizio senza stato esistente con l’aggiunta del nome DNSstateless1.application1:

Update-ServiceFabricService `
    -Stateless `
    -ServiceName fabric:/application1/stateless1 `
    -ServiceDnsName stateless1.application1

Verificare che sia impostato un nome DNS in Service Fabric Explorer

Dopo aver distribuito il servizio con il nome DNS, Service Fabric Explorer visualizzerà il nome DNS del servizio, come illustrato nella figura seguente:

Screenshot of the DNS name in Service Fabric Explorer.

Nota

Benché questa visualizzazione possa variare a seconda della versione di Service Fabric Explorer usata, il campo del nome DNS deve essere visibile in un modulo nella pagina del servizio.

Effettuare query DNS su una partizione del servizio con stato

A partire dalla versione 6.3 di Service Fabric il servizio DNS di Service Fabric supporta le query sulle partizioni dei servizi. Per abilitare il supporto per le query sui servizi partizionati, è necessario aggiornare le impostazioni del servizio DNS per impostare l'opzione EnablePartitionedQuery su true.

Per le partizioni che verranno usate nelle query DNS, si applicano le restrizioni di denominazione seguenti:

  • I nomi di partizioni devono essere compatibili con il servizio DNS.
  • Non è possibile usare nomi di partizione con più etichette, inclusi il punto o '.'.
  • I nomi di partizioni devono essere in minuscolo.

Le query DNS che usano come destinazione una partizione vengono formattate come indicato di seguito:

    <First-Label-Of-Partitioned-Service-DNSName><PartitionPrefix><Target-Partition-Name><PartitionSuffix>.<Remaining-Partitioned-Service-DNSName>

Dove:

  • First-Label-Of-Partitioned-Service-DNSName è la prima parte del nome DNS del servizio.
  • PartitionPrefix è un valore che può essere impostato nella sezione DnsService del manifesto del cluster o tramite il modello di Resource Manager del cluster. Il valore predefinito è "--". Per altre informazioni, vedere Impostazioni del servizio DNS.
  • Target-Partition-Name è il nome della partizione.
  • PartitionSuffix è un valore che può essere impostato nella sezione DnsService del manifesto del cluster o tramite il modello di Resource Manager del cluster. Il valore predefinito è una stringa vuota. Per altre informazioni, vedere Impostazioni del servizio DNS.
  • Remaining-Partitioned-Service-DNSName è la parte rimanente del nome DNS del servizio.

Gli esempi seguenti illustrano le query DNS per i servizi partizionati in esecuzione in un cluster con impostazioni predefinite per PartitionPrefix e PartitionSuffix:

  • Per risolvere la partizione "0" di un servizio con nome DNS backendrangedschemesvc.application che usa uno schema di partizionamento a intervalli, usare backendrangedschemesvc--0.application.
  • Per risolvere la "prima" partizione di un servizio con nome DNS backendnamedschemesvc.application che usa uno schema di partizionamento denominato, usare backendnamedschemesvc--first.application.

Il servizio DNS restituisce l'indirizzo IP dell'endpoint associato alla replica primaria della partizione. Se non viene specificata alcuna partizione, il servizio DNS ne selezionerà una in modo casuale.

Usare i nomi DNS nei servizi

Se si distribuiscono servizi con nomi DNS, è possibile trovare l'indirizzo IP degli endpoint esposti facendo riferimento al nome DNS. Il servizio DNS può essere usato per i servizi senza stato e, nella versione 6,3 di Service Fabric e versioni successive, per i servizi con stato. Per i servizi con stato in esecuzione nelle versioni di Service Fabric precedenti alla 6.3, è possibile usare il servizio proxy inverso predefinito in modo che le chiamate HTTP vengano dirette a una particolare partizione del servizio.

Il servizio DNS non supporta l’uso di porte dinamiche. Per risolvere i servizi su porte dinamiche, è possibile usare il servizio proxy inverso.

Il codice seguente illustra come chiamare un servizio senza stato tramite DNS. Si tratta semplicemente di una normale chiamata HTTP in cui si specificano il nome DNS; la porta ed eventuali percorsi facoltativi come parte dell'URL.

public class ValuesController : Controller
{
    // GET api
    [HttpGet]
    public async Task<string> Get()
    {
        string result = "";
        try
        {
            Uri uri = new Uri("http://stateless1.application1:8080/api/values");
            HttpClient client = new HttpClient();
            var response = await client.GetAsync(uri);
            result = await response.Content.ReadAsStringAsync();

        }
        catch (Exception e)
        {
            Console.Write(e.Message);
        }

        return result;
    }
}

Il codice seguente mostra una chiamata su una partizione specifica di un servizio con stato. In questo caso, il nome DNS contiene il nome della partizione (partition1). La chiamata presuppone un cluster con i valori predefiniti per PartitionPrefix e PartitionSuffix.

public class ValuesController : Controller
{
    // GET api
    [HttpGet]
    public async Task<string> Get()
    {
        string result = "";
        try
        {
            Uri uri = new Uri("http://stateful1--partition1.application1:8080/api/values");
            HttpClient client = new HttpClient();
            var response = await client.GetAsync(uri);
            result = await response.Content.ReadAsStringAsync();

        }
        catch (Exception e)
        {
            Console.Write(e.Message);
        }

        return result;
    }
}

Query ricorsive

Per i nomi DNS che non possono essere risolti automaticamente dal servizio DNS (ad esempio, un nome DNS pubblico), tale servizio inoltra la query ai server DNS ricorsivi preesistenti nei nodi.

Diagram showing how DNS queries for public names are resolved.

Prima di Service Fabric 9.0, questi server venivano sottoposti a query seriali fino alla ricezione di una risposta, con un periodo di timeout fisso di 5 secondi tra le query. Se un server non risponde entro il periodo di timeout, verrà eseguita una query sul server successivo (se disponibile). Se questi server DNS dovessero riscontrare problemi, il completamento delle query DNS richiederebbe più di 5 secondi, che non è una condizione ideale.

A partire da Service Fabric 9.0 è stato aggiunto il supporto per le query ricorsive parallele. Con le query parallele, tutti i server DNS ricorsivi possono essere contattati contemporaneamente, per cui la prima risposta ha la priorità. Ciò si traduce in risposte più rapide nello scenario illustrato in precedenza. Per impostazione predefinita, questa opzione non è abilitata.

Le opzioni con granularità fine sono state introdotte anche in Service Fabric 9.0 per consentire il controllo del comportamento delle query ricorsive, inclusi i periodi di timeout e i tentativi di query. Queste opzioni possono essere impostate nelle impostazioni del servizio DNS:

  • RecursiveQuerySerialMaxAttempts: numero massimo di query seriali che verranno tentate. Se questo numero è superiore al numero di server DNS di inoltro, l'esecuzione di query verrà arrestata appena il tentativo di query è stato effettuato almeno una volta su tutti i server.
  • RecursiveQuerySerialTimeout: valore di timeout in secondi per ogni query seriale tentata.
  • RecursiveQueryParallelMaxAttempts: numero di tentativi di query parallele. Le query parallele vengono eseguite dopo l'esaurimento del numero massimo di tentativi per le query seriali.
  • RecursiveQueryParallelTimeout: valore di timeout in secondi per ogni query parallela tentata.

Limitazioni e problemi noti

  • Il servizio DNS non supporta l’uso di porte dinamiche. Per risolvere i servizi esposti su porte dinamiche, usare il servizio proxy inverso.
  • Il supporto per Linux è attualmente limitato ai servizi in contenitori. I servizi basati su processi in Linux non possono attualmente usare il servizio DNS.
  • Il servizio DNS per i cluster Linux non può essere abilitato tramite il portale di Azure.
  • Se un nome DNS viene modificato per un servizio, è possibile che i nomi aggiornati non siano immediatamente visibili in alcuni scenari. Per risolvere il problema, è necessario riavviare le istanze del servizio DNS nel cluster.

Passaggi successivi

Per altre informazioni sulla comunicazione tra i servizi all'interno del cluster, vedere Connettersi e comunicare con i servizi in Service Fabric