Delen via


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 in containers geplaatste services, zijn adresseerbaar 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 daarom EINDPUNT-IP-adressen omzetten. Deze functionaliteit behoudt de draagbaarheid van in containers geplaatste services op verschillende platforms en kan 'lift and shift'-scenario's vereenvoudigen door bestaande service-URL's te gebruiken in plaats van code te herschrijven om de Naming Service te gebruiken.

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. Kortheid: in de diagrammen wordt slechts één eindpunt voor de services weergegeven, hoewel elke service meerdere eindpunten kan hebben.

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

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

  • Benoemde partitionering
  • Gebereikte partitionering
  • 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 per DNS-service voor gepartitioneerde stateful services.

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

Besturingssysteemondersteuning

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 bepaalde 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 in de sjablonen worden ingeschakeld met behulp van de minimaal ondersteunde API-versies en door de juiste instellingen toe te voegen. Meer informatie over hoe u dit doet, kunt u hieronder bekijken in punten 1 en 2 van de genummerde lijst.

Clusters met Behulp van 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, wordt 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 dns-service in te schakelen, kunt u dit doen vanuit de portal door naar de pagina Services voor invoegtoepassingen te gaan vanaf de clusterresourcepagina. 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 u kunt zien 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 de 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 resource is ingesteld op 2017-07-01-preview of later Microsoft.ServiceFabric/clusters en, indien niet, werkt u deze bij, zoals wordt weergegeven in het volgende voorbeeld:

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

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

    {
        "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 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 wilt inschakelen met andere dan standaardinstellingen, 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. Nadat 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/DnsServiceen u vindt deze onder 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 instellen voor uw services met ARM-sjablonen, met standaardservices in het ApplicationManifest.xml-bestand of met PowerShell-opdrachten.

De DNS-naam voor uw service kan overal in het cluster worden omgezet, dus het is belangrijk dat u de uniekheid van de DNS-naam in het cluster controleert.

Het wordt ten zeerste aanbevolen om een naamgevingsschema van <ServiceName>.<AppName>bijvoorbeeld . service1.application1 Als een toepassing wordt geïmplementeerd met Behulp van Docker Compose, krijgen services automatisch DNS-namen toegewezen met behulp van dit naamgevingsschema.

De DNS-naam instellen met een 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. Hieronder ziet u voorbeelden:

Standaardclusters

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

{
  "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 resource is ingesteld op 2022-10-01-preview of hoger Microsoft.ServiceFabric/managedclusters/applications/services en, indien niet, werkt u deze bij zoals wordt weergegeven in het volgende voorbeeld:

{
  "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 ApplicationManifest.xml-bestand. 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 bevatten. Dit is een vereiste voor partities die worden gericht op DNS-query's; Zie DNS-query's maken voor 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 stateless 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 in 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 verschillen, afhankelijk van de versie van Service Fabric Explorer die wordt 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 voor gepartitioneerde servicequery's wilt inschakelen, moeten de DNS-service-instellingen worden bijgewerkt om de optie EnablePartitionedQuery in te truestellen op .

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

  • Partitienamen moeten dns-compatibel zijn.
  • Partitienamen met meerdere labels, waaronder punt of punt, mogen niet worden gebruikt.
  • Partitienamen moeten kleine letters bevatten.

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

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

Hierin:

  • 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.
  • Resterend Gepartitioneerd-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 partitie 0 van een service wilt oplossen met een DNS-naam backendrangedschemesvc.application die gebruikmaakt van een bereikpartitioneringsschema, gebruikt u backendrangedschemesvc--0.application.
  • Als u de partitie 'eerste' van een service wilt oplossen met een DNS-naam backendnamedschemesvc.application die gebruikmaakt van een benoemd partitioneringsschema, gebruikt u backendnamedschemesvc--first.application.

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 weergegeven eindpunten vinden door te verwijzen naar de DNS-naam. 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 vóór 6.3, kunt u de ingebouwde omgekeerde proxyservice gebruiken voor HTTP-aanroepen 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 stateless 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 van een specifieke partitie van een stateful service. In dit geval bevat de DNS-naam de partitienaam (partition1). Bij de aanroep wordt ervan uitgegaan dat 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 waarin wordt getoond hoe DNS-query's voor openbare namen worden omgezet.

Vóór Service Fabric 9.0 werden deze servers serieel opgevraagd totdat een antwoord werd ontvangen, met een vaste time-outperiode van 5 seconden tussendoor. 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 gecontacteerd, waarbij het eerste antwoord wint. Dit resulteert in snellere reacties in het eerder genoemde scenario. Deze optie is niet standaard ingeschakeld.

Gedetailleerde opties worden ook geïntroduceerd in Service Fabric 9.0 om het gedrag van de recursieve query's te beheren, waaronder 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 doorstuurservers van 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 geprobeerde seriële query.
  • RecursiveQueryParallelMaxAttempts : het aantal keren dat parallelle query's worden uitgevoerd. Parallelle query's worden uitgevoerd nadat de maximumpogingen voor seriële query's zijn uitgeput.
  • RecursiveQueryParallelTimeout : de time-outwaarde in seconden voor elke geprobeerde 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 services in containers. Op processen 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 voor een service wordt gewijzigd, zijn de naamupdates mogelijk niet direct zichtbaar in sommige scenario's. Om het probleem op te lossen, moeten DNS-service-exemplaren opnieuw worden opgestart in het cluster.

Volgende stappen

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