DNS-tjänst i Azure Service Fabric

DNS-tjänsten är en valfri systemtjänst som du kan aktivera i klustret för att identifiera andra tjänster med hjälp av DNS-protokollet.

Många tjänster, särskilt containerbaserade tjänster, kan adresseras via en befintlig URL. Det är önskvärt att kunna lösa dessa tjänster med hjälp av DNS-standardprotokollet i stället för Service Fabric Naming Service-protokollet. Med DNS-tjänsten kan du mappa DNS-namn till ett tjänstnamn och därmed matcha slutpunkts-IP-adresser. Sådana funktioner upprätthåller portabiliteten för containerbaserade tjänster på olika plattformar och kan göra "lift and shift"-scenarier enklare, genom att du kan använda befintliga tjänst-URL:er i stället för att skriva om kod för att använda namngivningstjänsten.

DNS-tjänsten mappar DNS-namn till tjänstnamn, som i sin tur matchas av namngivningstjänsten för att returnera tjänstslutpunkten. DNS-namnet för tjänsten tillhandahålls när den skapas. Följande diagram visar hur DNS-tjänsten fungerar för tillståndslösa tjänster. Diagrammen visar bara en slutpunkt för tjänsterna, även om varje tjänst kan ha flera slutpunkter.

Diagram som visar hur DNS-namn mappas till tjänstnamn av DNS-tjänsten för tillståndslösa tjänster.

Från och med Service Fabric version 6.3 har Service Fabric DNS-protokollet utökats till att omfatta ett schema för adressering av partitionerade tillståndskänsliga tjänster. Dessa tillägg gör det möjligt att matcha specifika IP-adresser för partitioner med hjälp av en kombination av tillståndskänsligt DNS-namn för tjänsten och partitionsnamnet. Alla tre partitioneringsscheman stöds:

  • Namngiven partitionering
  • Intervallpartitionering
  • Singleton-partitionering

Följande diagram visar hur DNS-tjänsten fungerar för partitionerade tillståndskänsliga tjänster.

Diagram som visar hur DNS-namn mappas till tjänstnamn efter DNS-tjänst för partitionerade tillståndskänsliga tjänster.

Mer information om partitionerade frågor finns i avsnittet nedan.

Os-stöd

DNS-tjänsten stöds i både Windows- och Linux-kluster, men stödet för Linux är för närvarande begränsat till containerbaserade tjänster och kan inte aktiveras via Azure Portal. Windows stöder dock alla tjänsttyper och distributionsmodeller.

Aktivera DNS-tjänsten

Anteckning

Aktivering av DNS-tjänsten åsidosätter vissa DNS-inställningar på noderna. Om det uppstår problem med att ansluta till Internet kontrollerar du DNS-inställningarna.

Nya kluster

Kluster med ARM-mallar

Om du vill distribuera ett nytt kluster med ARM-mallar kan du antingen använda exempelmallarna eller skriva egna. Om det inte redan görs kan DNS-tjänsten aktiveras i mallarna med hjälp av de lägsta API-versioner som stöds och genom att lägga till lämpliga inställningar. Information om hur du gör detta finns nedan i punkterna 1 och 2 i den numrerade listan.

Kluster som använder Azure Portal

Om du skapar ett standardkluster i portalen är DNS-tjänsten aktiverad som standard i alternativet Inkludera DNS-tjänst under avsnittet Lägg till funktioner .

Skärmbild av aktivering av DNS-tjänsten för ett standardkluster via portalen.

Om du skapar ett hanterat kluster i portalen är DNS-tjänsten aktiverad som standard i alternativet DNS-tjänst under avsnittet Lägg till funktioner .

Skärmbild av aktivering av DNS-tjänsten för ett hanterat kluster via portalen.

Befintliga kluster

Om du uppdaterar ett befintligt hanterat kluster för att aktivera DNS-tjänsten kan du göra det från portalen genom att gå till sidan Tilläggstjänster från klusterresurssidan. Annars kan du aktivera DNS-tjänsten med alternativa metoder som refereras nedan:

  • Använd ARM-mallen som användes för att distribuera klustret, om tillämpligt.
  • Gå till klustret i Azure Resource Explorer och uppdatera klusterresursen enligt stegen nedan (från steg 2 och framåt).
  • Gå till klustret i portalen och klicka på Exportera mall. Mer information finns i Exportera mallen från resursgruppen.

När du har en mall kan du aktivera DNS-tjänsten med följande steg:

  1. För standardkluster kontrollerar du att apiVersion är inställt 2017-07-01-preview på eller senare för resursen Microsoft.ServiceFabric/clusters , och om inte, uppdaterar du den enligt följande exempel:

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

    För hanterade kluster kontrollerar du att apiVersion är inställt på 2020-01-01-preview eller senare för resursen Microsoft.ServiceFabric/managedClusters , och om inte uppdaterar du den enligt följande exempel:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. Aktivera NU DNS-tjänsten på något av följande sätt:

    • Om du vill aktivera DNS-tjänsten med standardinställningar lägger du till den i addonFeatures avsnittet i properties avsnittet enligt följande exempel:

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • Om du vill aktivera tjänsten med andra inställningar än standardinställningarna lägger du till ett DnsService avsnitt i fabricSettings avsnittet i properties avsnittet. I det här fallet behöver du inte lägga till DnsService i addonFeatures. Mer information om de egenskaper som kan anges för DNS-tjänsten finns i DNS-tjänstinställningar.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. När du har uppdaterat klustermallen med dina ändringar tillämpar du dem och låter uppgraderingen slutföras. När uppgraderingen är klar börjar DNS-systemtjänsten köras i klustret. Tjänstnamnet är fabric:/System/DnsServiceoch du hittar det under avsnittet Systemtjänst i Service Fabric Explorer.

Anteckning

När du uppgraderar DNS från inaktiverad till aktiverad kanske Service Fabric Explorer inte återspeglar det nya tillståndet. Lös problemet genom att starta om noderna genom att ändra uppgraderingsprincipen i mallen.

Ange DNS-namnet för din tjänst

Du kan ange DNS-namn för dina tjänster med ARM-mallar, med standardtjänster i ApplicationManifest.xml-filen eller med PowerShell-kommandon.

DNS-namnet för din tjänst kan matchas i hela klustret, så det är viktigt att se till att DNS-namnet är unikt i klustret.

Vi rekommenderar starkt att du använder namngivningsschemat <ServiceName>.<AppName>, till exempel service1.application1. Om ett program distribueras med Docker Compose tilldelas tjänsterna automatiskt DNS-namn med hjälp av det här namngivningsschemat.

Ange DNS-namnet med ARM-mallen

Om du använder ARM-mallar för att distribuera dina tjänster kan du lägga till serviceDnsName egenskapen i lämpligt avsnitt och tilldela ett värde till den. Exempel kan visas nedan:

Standardkluster

För standardkluster kontrollerar du att apiVersion är inställt 2019-11-01-preview på eller senare för resursen Microsoft.ServiceFabric/clusters/applications/services , och om inte, uppdaterar du den enligt följande exempel:

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

Hanterade kluster

För hanterade kluster kontrollerar du att apiVersion är inställt på 2022-10-01-preview eller senare för resursen Microsoft.ServiceFabric/managedclusters/applications/services , och om inte uppdaterar du den enligt följande exempel:

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

Ange DNS-namnet för en standardtjänst i ApplicationManifest.xml

Öppna projektet i Visual Studio eller valfri redigerare och öppna filen ApplicationManifest.xml. Gå till avsnittet för standardtjänster och lägg till attributet ServiceDnsName för varje tjänst. I följande exempel visas hur du anger DNS-namnet för tjänsten till stateless1.application1

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

I följande exempel anges DNS-namnet för en tillståndskänslig tjänst till stateful1.application1. Tjänsten använder ett namngivet partitioneringsschema. Observera att partitionsnamnen är gemener. Detta är ett krav för partitioner som ska riktas i DNS-frågor. Mer information finns i Skapa DNS-frågor på en tillståndskänslig tjänstpartition.

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

Ange DNS-namnet för en tjänst med PowerShell

Du kan ange DNS-namnet för en tjänst när du skapar den med hjälp New-ServiceFabricService av PowerShell-kommandot. I följande exempel skapas en ny tillståndslös tjänst med DNS-namnet stateless1.application1:

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

Du kan också uppdatera en befintlig tjänst med hjälp Update-ServiceFabricService av PowerShell-kommandot. I följande exempel uppdateras en befintlig tillståndslös tjänst för att lägga till DNS-namnet stateless1.application1:

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

Kontrollera att ett DNS-namn har angetts i Service Fabric Explorer

När tjänsten har distribuerats med DNS-namnet visar Service Fabric Explorer DNS-namnet för tjänsten, enligt följande bild:

Skärmbild av DNS-namnet i Service Fabric Explorer.

Anteckning

Den här vyn kan skilja sig åt beroende på vilken version av Service Fabric Explorer som används, men DNS-namnfältet bör vara synligt i någon form på tjänstsidan.

Göra DNS-frågor på en tillståndskänslig tjänstpartition

Från och med Service Fabric version 6.3 stöder DNS-tjänsten frågor för tjänstpartitioner. Om du vill aktivera stöd för partitionerade tjänstfrågor måste DNS-tjänstinställningarna uppdateras för att ange alternativet EnablePartitionedQuery till true.

För partitioner som ska användas i DNS-frågor gäller följande namngivningsbegränsningar:

  • Partitionsnamnen ska vara DNS-kompatibla.
  • Partitionsnamn med flera etiketter, inklusive punkt eller ., bör inte användas.
  • Partitionsnamn bör vara gemener.

DNS-frågor som riktar sig mot en partition formateras på följande sätt:

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

Plats:

  • First-Label-Of-Partitioned-Service-DNSName är den första delen av tjänstens DNS-namn.
  • PartitionPrefix är ett värde som kan anges i avsnittet DnsService i klustermanifestet eller via klustrets ARM-mall. Standardvärdet är "--". Mer information finns i DNS-tjänstinställningar.
  • Target-Partition-Name är namnet på partitionen.
  • PartitionSuffix är ett värde som kan anges i avsnittet DnsService i klustermanifestet eller via klustrets ARM-mall. Standardvärdet är tom sträng. Mer information finns i DNS-tjänstinställningar.
  • Remaining-Partitioned-Service-DNSName är den återstående delen av tjänstens DNS-namn.

I följande exempel visas DNS-frågor för partitionerade tjänster som körs på ett kluster som har standardinställningar för PartitionPrefix och PartitionSuffix:

  • Om du vill matcha partitionen "0" för en tjänst med DNS-namn backendrangedschemesvc.application som använder ett intervallpartitioneringsschema använder du backendrangedschemesvc--0.application.
  • Om du vill matcha partitionen "först" för en tjänst med DNS-namn backendnamedschemesvc.application som använder ett namngivet partitioneringsschema använder du backendnamedschemesvc--first.application.

DNS-tjänsten returnerar IP-adressen för slutpunkten som är associerad med partitionens primära replik. Om ingen partition anges väljer DNS-tjänsten slumpmässigt en partition.

Använda DNS-namn i dina tjänster

Om du distribuerar tjänster med DNS-namn kan du hitta IP-adressen för de exponerade slutpunkterna genom att referera till DNS-namnet. DNS-tjänsten fungerar för tillståndslösa tjänster och i Service Fabric version 6.3 och senare för tillståndskänsliga tjänster. För tillståndskänsliga tjänster som körs i versioner av Service Fabric före 6.3 kan du använda den inbyggda omvända proxytjänsten för HTTP-anrop för att anropa en viss tjänstpartition.

Dynamiska portar stöds inte av DNS-tjänsten. Du kan använda omvänd proxytjänst för att lösa tjänster som använder dynamiska portar.

Följande kod visar hur du anropar en tillståndslös tjänst via DNS. Det är helt enkelt ett vanligt HTTP-anrop där du anger DNS-namnet, porten och valfri sökväg som en del av URL:en.

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;
    }
}

Följande kod visar ett anrop på en specifik partition av en tillståndskänslig tjänst. I det här fallet innehåller DNS-namnet partitionsnamnet (partition1). Anropet förutsätter ett kluster med standardvärden för PartitionPrefix och 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;
    }
}

Rekursiva frågor

För DNS-namn som DNS-tjänsten inte kan matcha på egen hand (till exempel ett offentligt DNS-namn) vidarebefordrar den frågan till befintliga rekursiva DNS-servrar på noderna.

Diagram som visar hur DNS-frågor för offentliga namn matchas.

Före Service Fabric 9.0 efterfrågades dessa servrar seriellt tills ett svar togs emot, med en fast tidsgräns på 5 sekunder däremellan. Om en server inte svarade inom tidsgränsen efterfrågas nästa server (om tillgänglig). Om dessa DNS-servrar stötte på problem skulle slutförandet av DNS-frågor ta längre tid än 5 sekunder, vilket inte är idealiskt.

Från och med Service Fabric 9.0 har stöd för parallella rekursiva frågor lagts till. Med parallella frågor kan alla rekursiva DNS-servrar kontaktas samtidigt, där det första svaret vinner. Detta resulterar i snabbare svar i det tidigare nämnda scenariot. Det här alternativet är inte aktiverat som standard.

Detaljerade alternativ introduceras också i Service Fabric 9.0 för att styra beteendet för rekursiva frågor, inklusive tidsgränsperioder och frågeförsök. Dessa alternativ kan anges i DNS-tjänstinställningarna:

  • RecursiveQuerySerialMaxAttempts – antalet seriefrågor som ska försökas, som mest. Om det här antalet är högre än antalet vidarebefordrande DNS-servrar stoppas frågan när alla servrar har försökt utföras exakt en gång.
  • RecursiveQuerySerialTimeout – timeout-värdet i sekunder för varje seriefråga som försöker köras.
  • RecursiveQueryParallelMaxAttempts – antalet gånger parallella frågor kommer att försökas. Parallella frågor körs när det maximala antalet försök för seriefrågor har förbrukats.
  • RecursiveQueryParallelTimeout – tidsgränsvärdet i sekunder för varje försök till parallell fråga.

Begränsningar och kända problem

  • Dynamiska portar stöds inte av DNS-tjänsten. Om du vill lösa tjänster som exponeras på dynamiska portar använder du tjänsten för omvänd proxy.
  • Stödet för Linux är för närvarande begränsat till containerbaserade tjänster. Processbaserade tjänster i Linux kan för närvarande inte använda DNS-tjänsten.
  • DNS-tjänsten för Linux-kluster kan inte aktiveras via Azure Portal.
  • Om ett DNS-namn ändras för en tjänst kanske namnuppdateringarna inte visas omedelbart i vissa scenarier. För att lösa problemet bör DNS-tjänstinstanser startas om i klustret.

Nästa steg

Läs mer om tjänstkommunikation i klustret med anslutning och kommunikation med tjänster