DNS-service in Azure Service Fabric

DNS-service is een optionele systeemservice die u in uw cluster kunt inschakelen om andere services te detecteren met behulp van het DNS-protocol.

Veel services, met name services in containers, kunnen worden adresseerd via een bestaande URL. Het is wenselijk om deze services op te lossen met behulp van het standaard DNS-protocol in plaats van het Service Fabric Naming Service-protocol. Met de DNS-service kunt u DNS-namen toewijzen aan een servicenaam en dus EINDPUNT-IP-adressen omzetten. Dergelijke functionaliteit behoudt de draagbaarheid van containerservices op verschillende platforms en kan lift-and-shift-scenario's eenvoudiger maken door bestaande service-URL's te gebruiken in plaats van code te herschrijven voor het gebruik van de naamgevingsservice.

DNS-service wijst DNS-namen toe aan servicenamen, die op hun beurt worden omgezet door de naamgevingsservice om het service-eindpunt te retourneren. De DNS-naam voor de service wordt opgegeven op het moment van maken. In het volgende diagram ziet u hoe de DNS-service werkt voor stateless services. Kortheidshalve tonen de diagrammen slechts één eindpunt voor de services, hoewel elke service meerdere eindpunten kan hebben.

Diagram waarin wordt getoond hoe DNS-namen worden toegewezen aan servicenamen door de DNS-service voor stateless services.

Vanaf Service Fabric versie 6.3 is het SERVICE Fabric DNS-protocol uitgebreid met een schema voor het aanpakken van gepartitioneerde stateful services. Deze extensies maken het mogelijk om specifieke partitie-IP-adressen om te zetten met behulp van een combinatie van stateful service DNS-naam en de partitienaam. Alle drie de partitioneringsschema's worden ondersteund:

  • Benoemde partitionering
  • Bereikpartitionering
  • Singleton partitioneren

In het volgende diagram ziet u hoe de DNS-service werkt voor gepartitioneerde stateful services.

Diagram waarin wordt getoond hoe DNS-namen worden toegewezen aan servicenamen door de DNS-service voor gepartitioneerde stateful services.

Raadpleeg de onderstaande sectie voor meer informatie over gepartitioneerde query's.

Ondersteuning van het besturingssysteem

DNS-service wordt ondersteund op zowel Windows- als Linux-clusters, hoewel ondersteuning voor Linux momenteel beperkt is tot containerservices en niet kan worden ingeschakeld via Azure Portal. Windows ondersteunt echter alle servicetypen en implementatiemodellen.

DNS-service inschakelen

Notitie

Als u de DNS-service inschakelt, worden sommige DNS-instellingen op de knooppunten overschreven. Als u problemen ondervindt bij het maken van verbinding met internet, controleert u uw DNS-instellingen.

Nieuwe clusters

Clusters met ARM-sjablonen

Als u een nieuw cluster met ARM-sjablonen wilt implementeren, kunt u de voorbeeldsjablonen gebruiken of uw eigen sjablonen schrijven. Als dit nog niet is gebeurd, kan de DNS-service worden ingeschakeld in de sjablonen door de minimaal ondersteunde API-versies te gebruiken en door de juiste instellingen toe te voegen. Details over hoe u dit kunt doen, vindt u hieronder in de punten 1 en 2 van de genummerde lijst.

Clusters met Azure Portal

Als u een standaardcluster in de portal maakt, wordt de DNS-service standaard ingeschakeld in de optie DNS-service opnemen in de sectie Functies toevoegen .

Schermopname van het inschakelen van de DNS-service voor een standaardcluster via de portal.

Als u een beheerd cluster in de portal maakt, is de DNS-service standaard ingeschakeld in de optie DNS-service onder de sectie Functies toevoegen .

Schermopname van het inschakelen van de DNS-service voor een beheerd cluster via de portal.

Bestaande clusters

Als u een bestaand beheerd cluster bijwerkt om de DNS-service in te schakelen, kunt u dit doen vanuit de portal door naar de pagina Invoegtoepassingsservices te gaan op de pagina clusterresource. Anders kunt u de DNS-service inschakelen met behulp van alternatieve methoden waarnaar hieronder wordt verwezen:

  • Gebruik de ARM-sjabloon die is gebruikt om het cluster te implementeren, indien van toepassing.
  • Navigeer naar het cluster in Azure Resource Explorer en werk de clusterresource bij, zoals te zien is in de onderstaande stappen (vanaf stap 2 en hoger).
  • Navigeer naar het cluster in de portal en klik op Sjabloon exporteren. Zie De sjabloon exporteren uit resourcegroep voor meer informatie.

Nadat u een sjabloon hebt, kunt u de DNS-service inschakelen met de volgende stappen:

  1. Voor standaardclusters controleert u of de apiVersion is ingesteld op 2017-07-01-preview of hoger voor de Microsoft.ServiceFabric/clusters resource en werkt u deze bij zoals in het volgende voorbeeld wordt weergegeven:

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

    Voor beheerde clusters controleert u of de apiVersion is ingesteld op 2020-01-01-preview of hoger voor de Microsoft.ServiceFabric/managedClusters resource en werkt u deze bij zoals in het volgende voorbeeld wordt weergegeven:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. Schakel de DNS-service nu op een van de volgende manieren in:

    • Als u de DNS-service met standaardinstellingen wilt inschakelen, voegt u deze toe aan de addonFeatures sectie in de properties sectie, zoals wordt weergegeven in het volgende voorbeeld:

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • Als u de service met andere dan standaardinstellingen wilt inschakelen, voegt u een DnsService sectie toe aan de fabricSettings sectie in de properties sectie. In dit geval hoeft u de DnsService niet toe te voegen aan addonFeatures. Zie DNS-service-instellingen voor meer informatie over de eigenschappen die kunnen worden ingesteld voor de DNS-service.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. Zodra u de clustersjabloon hebt bijgewerkt met uw wijzigingen, past u deze toe en laat u de upgrade voltooien. Wanneer de upgrade is voltooid, wordt de DNS-systeemservice uitgevoerd in uw cluster. De servicenaam is fabric:/System/DnsService, en u vindt deze in de sectie Systeemservice in Service Fabric Explorer.

Notitie

Bij het upgraden van DNS van uitgeschakeld naar ingeschakeld, geeft Service Fabric Explorer mogelijk niet de nieuwe status weer. U kunt dit oplossen door de knooppunten opnieuw op te starten door het upgradebeleid in uw sjabloon te wijzigen.

De DNS-naam voor uw service instellen

U kunt DNS-namen voor uw services instellen met ARM-sjablonen, met standaardservices in het ApplicationManifest.xml-bestand of met PowerShell-opdrachten.

De DNS-naam voor uw service kan worden omgezet in het hele cluster, dus het is belangrijk om ervoor te zorgen dat de DNS-naam uniek is in het hele cluster.

Het wordt ten zeerste aanbevolen om een naamgevingsschema van te gebruiken, <ServiceName>.<AppName>service1.application1bijvoorbeeld . Als een toepassing wordt geïmplementeerd met Docker Compose, worden aan services automatisch DNS-namen toegewezen met behulp van dit naamgevingsschema.

De DNS-naam instellen met arm-sjabloon

Als u ARM-sjablonen gebruikt om uw services te implementeren, kunt u de serviceDnsName eigenschap toevoegen aan de juiste sectie en er een waarde aan toewijzen. Voorbeelden zijn hieronder te zien:

Standaardclusters

Voor standaardclusters controleert u of de apiVersion is ingesteld op 2019-11-01-preview of hoger voor de Microsoft.ServiceFabric/clusters/applications/services resource en werkt u deze bij zoals in het volgende voorbeeld wordt weergegeven:

{
  "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')]"
  }
}

Beheerde clusters

Voor beheerde clusters controleert u of de apiVersion is ingesteld op 2022-10-01-preview of hoger voor de Microsoft.ServiceFabric/managedclusters/applications/services resource en werkt u deze bij zoals in het volgende voorbeeld wordt weergegeven:

{
  "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')]"
  }
}

De DNS-naam voor een standaardservice instellen in de ApplicationManifest.xml

Open uw project in Visual Studio of uw favoriete editor en open het bestand ApplicationManifest.xml. Ga naar de sectie Standaardservices en voeg voor elke service het ServiceDnsName kenmerk toe. In het volgende voorbeeld ziet u hoe u de DNS-naam van de service instelt op stateless1.application1

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

In het volgende voorbeeld wordt de DNS-naam voor een stateful service ingesteld op stateful1.application1. De service maakt gebruik van een benoemd partitioneringsschema. U ziet dat de partitienamen kleine letters zijn. Dit is een vereiste voor partities die worden gericht in DNS-query's; Zie DNS-query's maken op een stateful servicepartitie voor meer informatie.

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

De DNS-naam voor een service instellen met PowerShell

U kunt de DNS-naam voor een service instellen wanneer u deze maakt met behulp van de New-ServiceFabricService PowerShell-opdracht. In het volgende voorbeeld wordt een nieuwe staatloze service gemaakt met de DNS-naam stateless1.application1:

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

U kunt ook een bestaande service bijwerken met behulp van de Update-ServiceFabricService PowerShell-opdracht. In het volgende voorbeeld wordt een bestaande staatloze service bijgewerkt om de DNS-naam stateless1.application1toe te voegen:

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

Controleer of een DNS-naam is ingesteld in Service Fabric Explorer

Zodra de service is geïmplementeerd met de DNS-naam, wordt Service Fabric Explorer de DNS-naam voor de service weergegeven, zoals wordt weergegeven in de volgende afbeelding:

Schermopname van de DNS-naam in Service Fabric Explorer.

Notitie

Deze weergave kan afwijken, afhankelijk van de versie van Service Fabric Explorer gebruikt, maar het veld DNS-naam moet in een bepaalde vorm zichtbaar zijn op de servicepagina.

DNS-query's maken op een stateful servicepartitie

Vanaf Service Fabric versie 6.3 ondersteunt de DNS-service query's voor servicepartities. Als u ondersteuning wilt inschakelen voor gepartitioneerde servicequery's, moeten de DNS-service-instellingen worden bijgewerkt om de optie EnablePartitionedQuery in te stellen op true.

Voor partities die worden gebruikt in DNS-query's, gelden de volgende naamgevingsbeperkingen:

  • Partitienamen moeten DNS-compatibel zijn.
  • Namen van partities met meerdere labels, inclusief punt of '.' mogen niet worden gebruikt.
  • Partitienamen moeten kleine letters bevatten.

DNS-query's die zijn gericht op een partitie, worden als volgt geformatteerd:

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

Waar:

  • First-Label-Of-Partitioned-Service-DNSName is het eerste deel van de DNS-naam van uw service.
  • PartitionPrefix is een waarde die kan worden ingesteld in de sectie DnsService van het clustermanifest of via de ARM-sjabloon van het cluster. De standaardwaarde is '--'. Zie DNS-service-instellingen voor meer informatie.
  • Target-Partition-Name is de naam van de partitie.
  • PartitionSuffix is een waarde die kan worden ingesteld in de sectie DnsService van het clustermanifest of via de ARM-sjabloon van het cluster. De standaardwaarde is een lege tekenreeks. Zie DNS-service-instellingen voor meer informatie.
  • Remaining-Partitioned-Service-DNSName is het resterende deel van de DNS-naam van uw service.

In de volgende voorbeelden ziet u DNS-query's voor gepartitioneerde services die worden uitgevoerd op een cluster met standaardinstellingen voor PartitionPrefix en PartitionSuffix:

  • Als u de partitie '0' van een service met een DNS-naam backendrangedschemesvc.application wilt oplossen die gebruikmaakt van een bereikpartitioneringsschema, gebruikt u backendrangedschemesvc--0.application.
  • Als u de partitie 'first' wilt oplossen van een service met een DNS-naam backendnamedschemesvc.application die gebruikmaakt van een benoemd partitioneringsschema, gebruikt u backendnamedschemesvc--first.application.

De DNS-service retourneert het IP-adres van het eindpunt dat is gekoppeld aan de primaire replica van de partitie. Als er geen partitie is opgegeven, selecteert de DNS-service willekeurig een partitie.

DNS-namen gebruiken in uw services

Als u services met DNS-namen implementeert, kunt u het IP-adres van de blootgestelde eindpunten vinden door te verwijzen naar de DNS-naam. DE DNS-service werkt voor stateless services en, in Service Fabric versie 6.3 en hoger, voor stateful services. Voor stateful services die worden uitgevoerd op versies van Service Fabric ouder dan 6.3, kunt u de ingebouwde omgekeerde proxyservice voor HTTP-aanroepen gebruiken om een bepaalde servicepartitie aan te roepen.

Dynamische poorten worden niet ondersteund door de DNS-service. U kunt de omgekeerde proxyservice gebruiken om services op te lossen die gebruikmaken van dynamische poorten.

De volgende code laat zien hoe u een staatloze service aanroept via DNS. Het is gewoon een gewone HTTP-aanroep waarbij u de DNS-naam, de poort en een optioneel pad opgeeft als onderdeel van de 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;
    }
}

De volgende code toont een aanroep op een specifieke partitie van een stateful service. In dit geval bevat de DNS-naam de partitienaam (partition1). De aanroep gaat uit van een cluster met standaardwaarden voor PartitionPrefix en 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;
    }
}

Recursieve query's

Voor DNS-namen die de DNS-service niet zelfstandig kan omzetten (bijvoorbeeld een openbare DNS-naam), wordt de query doorgestuurd naar bestaande recursieve DNS-servers op de knooppunten.

Diagram dat laat zien hoe DNS-query's voor openbare namen worden omgezet.

Vóór Service Fabric 9.0 werden deze servers serieel opgevraagd totdat er een antwoord werd ontvangen, met een vaste time-outperiode van 5 seconden ertussen. Als een server niet binnen de time-outperiode heeft gereageerd, wordt er een query uitgevoerd op de volgende server (indien beschikbaar). In het geval dat deze DNS-servers problemen ondervinden, duurt het voltooien van DNS-query's langer dan 5 seconden, wat niet ideaal is.

Vanaf Service Fabric 9.0 is ondersteuning voor parallelle recursieve query's toegevoegd. Met parallelle query's kunnen alle recursieve DNS-servers tegelijk worden benaderd, waarbij het eerste antwoord wint. Dit resulteert in snellere reacties in het eerder genoemde scenario. Deze optie is niet standaard ingeschakeld.

In Service Fabric 9.0 worden ook gedetailleerde opties geïntroduceerd om het gedrag van de recursieve query's te beheren, inclusief de time-outperioden en querypogingen. Deze opties kunnen worden ingesteld in de DNS-service-instellingen:

  • RecursiveQuerySerialMaxAttempts : het aantal seriële query's dat maximaal wordt geprobeerd. Als dit aantal hoger is dan het aantal doorstuur-DNS-servers, wordt het uitvoeren van query's gestopt zodra alle servers precies één keer zijn geprobeerd.
  • RecursiveQuerySerialTimeout : de time-outwaarde in seconden voor elke poging tot seriële query.
  • RecursiveQueryParallelMaxAttempts : het aantal keren dat parallelle query's worden uitgevoerd. Parallelle query's worden uitgevoerd nadat het maximum aantal pogingen voor seriële query's is uitgeput.
  • RecursiveQueryParallelTimeout : de time-outwaarde in seconden voor elke parallelle query.

Beperkingen en bekende problemen

  • Dynamische poorten worden niet ondersteund door de DNS-service. Als u services wilt oplossen die beschikbaar zijn op dynamische poorten, gebruikt u de omgekeerde proxyservice.
  • Ondersteuning voor Linux is momenteel beperkt tot containerservices. Op proces gebaseerde services op Linux kunnen momenteel geen DNS-service gebruiken.
  • DNS-service voor Linux-clusters kan niet worden ingeschakeld via Azure Portal.
  • Als een DNS-naam wordt gewijzigd voor een service, zijn de naamupdates in sommige scenario's mogelijk niet direct zichtbaar. Om het probleem op te lossen, moeten DNS-service-exemplaren opnieuw worden opgestart in het hele cluster.

Volgende stappen

Meer informatie over servicecommunicatie binnen het cluster met verbinding maken en communiceren met services