Sdílet prostřednictvím


Služba DNS v Azure Service Fabric

Služba DNS je volitelná systémová služba, kterou můžete ve svém clusteru povolit ke zjišťování dalších služeb pomocí protokolu DNS.

Mnoho služeb, zejména kontejnerizovaných služeb, je adresovatelných prostřednictvím již existující adresy URL. Schopnost přeložit tyto služby pomocí standardního protokolu DNS, nikoli pomocí protokolu Service Fabric Naming Service, je žádoucí. Služba DNS umožňuje mapovat názvy DNS na název služby a překládat IP adresy koncových bodů. Tyto funkce udržují přenositelnost kontejnerizovaných služeb na různých platformách a můžou usnadnit scénáře "lift and shift" tím, že vám umožní používat stávající adresy URL služeb místo přepisování kódu k používání služby Pojmenování.

Služba DNS mapuje názvy DNS na názvy služeb, které následně služba pojmenování přeloží, aby vrátila koncový bod služby. Název DNS pro službu se poskytuje při vytváření. Následující diagram znázorňuje, jak služba DNS funguje pro bezstavové služby. V případě stručnosti diagramy zobrazují pouze jeden koncový bod pro služby, i když každá služba může mít více koncových bodů.

Diagram znázorňující mapování názvů DNS na názvy služeb podle služby DNS pro bezstavové služby

Počínaje Service Fabric verze 6.3 byl protokol DNS Service Fabric rozšířen tak, aby zahrnoval schéma adresování dělených stavových služeb. Tato rozšíření umožňují přeložit konkrétní IP adresy oddílů pomocí kombinace názvu DNS stavové služby a názvu oddílu. Podporují se všechna tři schémata dělení:

  • Pojmenované dělení
  • Dělení s rozsahem
  • Dělení na jednoúčelové oddíly

Následující diagram ukazuje, jak služba DNS funguje pro dělené stavové služby.

Diagram znázorňující mapování názvů DNS na názvy služeb podle služby DNS pro dělené stavové služby

Další informace o dělených dotazech najdete v následující části.

Podpora operačního systému

Služba DNS je podporována v clusterech s Windows i Linuxem, i když podpora Linuxu je v současné době omezená na kontejnerizované služby a není možné ji povolit prostřednictvím webu Azure Portal. Windows ale podporuje všechny typy služeb a modely nasazení.

Povolení služby DNS

Poznámka:

Povolení služby DNS přepíše některá nastavení DNS na uzlech. Pokud dochází k problémům s připojením k internetu, zkontrolujte nastavení DNS.

Nové clustery

Clustery využívající šablony ARM

Pokud chcete nasadit nový cluster pomocí šablon ARM, můžete použít ukázkové šablony nebo si napsat vlastní. Pokud jste to ještě neudělali, můžete službu DNS povolit v šablonách pomocí minimálních podporovaných verzí rozhraní API a přidáním odpovídajících nastavení. Podrobnosti o tom, jak toho dosáhnout, najdete níže v bodech 1 a 2 očíslovaného seznamu.

Clustery s využitím webu Azure Portal

Pokud vytváříte standardní cluster na portálu, služba DNS je ve výchozím nastavení povolená v možnosti Zahrnout službu DNS v části Přidat funkce.

Snímek obrazovky s povolením služby DNS pro standardní cluster prostřednictvím portálu

Pokud vytváříte spravovaný cluster na portálu, služba DNS je ve výchozím nastavení povolená v možnosti služby DNS v části Přidat funkce.

Snímek obrazovky s povolením služby DNS pro spravovaný cluster prostřednictvím portálu

Existující clustery

Pokud aktualizujete existující spravovaný cluster, abyste povolili službu DNS, můžete to udělat z portálu tak , že na stránce prostředků clusteru přejdete na stránku Služby doplňku . Jinak můžete službu DNS povolit pomocí alternativních metod, na které se odkazuje níže:

  • Pokud je to možné, použijte šablonu ARM, která se použila k nasazení clusteru.
  • Přejděte do clusteru v Azure Resource Exploreru a aktualizujte prostředek clusteru, jak je vidět v následujících krocích (od kroku 2 a dále).
  • Přejděte do clusteru na portálu a klikněte na Exportovat šablonu. Další informace najdete v tématu Export šablony ze skupiny prostředků.

Po vytvoření šablony můžete službu DNS povolit pomocí následujících kroků:

  1. U standardních clusterů zkontrolujte, jestli apiVersion je prostředek nastavený 2017-07-01-preview nebo novější Microsoft.ServiceFabric/clusters , a pokud ne, aktualizujte ho, jak je znázorněno v následujícím příkladu:

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

    U spravovaných clusterů zkontrolujte, jestli apiVersion je prostředek Microsoft.ServiceFabric/managedClusters nastavený 2020-01-01-preview nebo novější, a pokud ne, aktualizujte ho, jak je znázorněno v následujícím příkladu:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. Teď povolte službu DNS jedním z následujících způsobů:

    • Pokud chcete povolit službu DNS s výchozím nastavením, přidejte ji do addonFeatures oddílu uvnitř oddílu properties , jak je znázorněno v následujícím příkladu:

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • Pokud chcete službu povolit s jiným než výchozím nastavením, přidejte DnsService do fabricSettings oddílu uvnitř oddílu properties oddíl. V takovém případě není nutné přidat službu DnsService do addonFeatures. Další informace o vlastnostech, které lze nastavit pro službu DNS, najdete v tématu Nastavení služby DNS.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. Jakmile šablonu clusteru aktualizujete změnami, použijte je a nechte upgrade dokončit. Po dokončení upgradu se v clusteru spustí systémová služba DNS. Název služby je fabric:/System/DnsServicea najdete ho v části Systémová služba v Service Fabric Exploreru.

Poznámka:

Při upgradu DNS z zakázaného na povolenou nemusí Service Fabric Explorer odrážet nový stav. Pokud chcete problém vyřešit, restartujte uzly úpravou zásad upgradu v šabloně.

Nastavení názvu DNS pro vaši službu

Názvy DNS pro služby můžete nastavit pomocí šablon ARM, s výchozími službami v souboru ApplicationManifest.xml nebo pomocí příkazů PowerShellu.

Název DNS pro vaši službu se dá přeložit v celém clusteru, takže je důležité zajistit jedinečnost názvu DNS v celém clusteru.

Důrazně doporučujeme použít schéma <ServiceName>.<AppName>pojmenování , například service1.application1. Pokud je aplikace nasazená pomocí Docker compose, služby se automaticky přiřazují názvy DNS pomocí tohoto schématu pojmenování.

Nastavení názvu DNS pomocí šablony ARM

Pokud k nasazení služeb používáte šablony ARM, můžete vlastnost přidat serviceDnsName do příslušného oddílu a přiřadit k ní hodnotu. Příklady si můžete prohlédnout níže:

Standardní clustery

U standardních clusterů zkontrolujte, jestli apiVersion je prostředek nastavený 2019-11-01-preview nebo novější Microsoft.ServiceFabric/clusters/applications/services , a pokud ne, aktualizujte ho, jak je znázorněno v následujícím příkladu:

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

Spravované clustery

U spravovaných clusterů zkontrolujte, jestli apiVersion je prostředek Microsoft.ServiceFabric/managedclusters/applications/services nastavený 2022-10-01-preview nebo novější, a pokud ne, aktualizujte ho, jak je znázorněno v následujícím příkladu:

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

Nastavení názvu DNS pro výchozí službu v ApplicationManifest.xml

Otevřete projekt v sadě Visual Studio nebo v oblíbeném editoru a otevřete ApplicationManifest.xml soubor. Přejděte do výchozí části služeb a pro každou službu přidejte ServiceDnsName atribut. Následující příklad ukazuje, jak nastavit název DNS služby na stateless1.application1

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

Následující příklad nastaví název DNS stavové služby na stateful1.application1. Služba používá pojmenované schéma dělení. Všimněte si, že názvy oddílů jsou malé. To je požadavek na oddíly, které budou cílem v dotazech DNS; Další informace naleznete v tématu Vytváření dotazů DNS na stavový oddíl služby.

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

Nastavení názvu DNS pro službu pomocí PowerShellu

Název DNS pro službu můžete nastavit při vytváření pomocí příkazu PowerShellu New-ServiceFabricService . Následující příklad vytvoří novou bezstavovou službu s názvem stateless1.application1DNS:

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

Existující službu můžete také aktualizovat pomocí příkazu PowerShellu Update-ServiceFabricService . Následující příklad aktualizuje existující bezstavovou službu a přidá název stateless1.application1DNS:

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

Ověřte, že je v Service Fabric Exploreru nastavený název DNS.

Jakmile se služba nasadí s názvem DNS, Service Fabric Explorer zobrazí název DNS pro službu, jak je znázorněno na následujícím obrázku:

Snímek obrazovky s názvem DNS v Service Fabric Exploreru

Poznámka:

Toto zobrazení se může lišit v závislosti na používané verzi Service Fabric Exploreru, ale pole názvu DNS by mělo být viditelné v určitém formuláři na stránce služby.

Vytváření dotazů DNS na oddíl stavové služby

Počínaje Service Fabric verze 6.3 podporuje služba DNS dotazy na oddíly služby. Pokud chcete povolit podporu dotazů na dělené služby, musí být nastavení služby DNS aktualizováno, aby bylo možné nastavit možnost EnablePartitionedQuery true.

Pro oddíly, které se použijí v dotazech DNS, platí následující omezení pojmenování:

  • Názvy oddílů by měly být kompatibilní s DNS.
  • Názvy oddílů s více popisky, včetně tečky nebo tečky, by se neměly používat.
  • Názvy oddílů by měly být malé.

Dotazy DNS, které cílí na oddíl, jsou formátované takto:

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

Kde:

  • First-Label-Of-Partitioned-Service-DNSName je první část názvu DNS vaší služby.
  • PartitionPrefix je hodnota, která se dá nastavit v části DnsService manifestu clusteru nebo prostřednictvím šablony ARM clusteru. Výchozí hodnota je --. Další informace najdete v tématu Nastavení služby DNS.
  • Název cílového oddílu je název oddílu.
  • PartitionSuffix je hodnota, která se dá nastavit v části DnsService manifestu clusteru nebo prostřednictvím šablony ARM clusteru. Výchozí hodnota je prázdný řetězec. Další informace najdete v tématu Nastavení služby DNS.
  • Zbývající část názvu DNS služby je zbývající část názvu DNS vaší služby.

Následující příklady ukazují dotazy DNS pro dělené služby spuštěné v clusteru s výchozím nastavením a PartitionPrefix PartitionSuffix:

  • Pokud chcete přeložit oddíl "0" služby s názvem backendrangedschemesvc.application DNS, který používá schéma dělení s rozsahem, použijte backendrangedschemesvc--0.application.
  • Pokud chcete přeložit oddíl "první" služby s názvem backendnamedschemesvc.application DNS, který používá pojmenované schéma dělení, použijte backendnamedschemesvc--first.application.

Služba DNS vrátí IP adresu koncového bodu přidruženého k primární replice oddílu. Pokud není zadaný žádný oddíl, služba DNS náhodně vybere oddíl.

Používání názvů DNS ve vašich službách

Pokud nasazujete služby s názvy DNS, můžete najít IP adresu vystavených koncových bodů odkazem na název DNS. Služba DNS funguje pro bezstavové služby a ve službě Service Fabric verze 6.3 a novější pro stavové služby. Pro stavové služby spuštěné ve verzích Service Fabric před verzí 6.3 můžete pro volání konkrétního oddílu služby použít integrovanou službu reverzního proxy serveru .

Služba DNS nepodporuje dynamické porty. Službu reverzního proxy serveru můžete použít k překladu služeb, které používají dynamické porty.

Následující kód ukazuje, jak volat bezstavovou službu prostřednictvím DNS. Jedná se jednoduše o běžné volání HTTP, kde jako součást adresy URL zadáte název DNS, port a libovolnou volitelnou cestu.

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

Následující kód ukazuje volání konkrétního oddílu stavové služby. V tomto případě název DNS obsahuje název oddílu (oddíl1). Volání předpokládá cluster s výchozími hodnotami pro PartitionPrefix a 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;
    }
}

Rekurzivní dotazy

U názvů DNS, které služba DNS nedokáže přeložit sami (například veřejný název DNS), předá dotaz předem existujícím rekurzivním serverům DNS na uzlech.

Diagram znázorňující překlad dotazů DNS na veřejné názvy

Před Service Fabric 9.0 byly tyto servery dotazovány sériově, dokud nebyla přijata odpověď s pevnou dobou časového limitu 5 sekund mezi. Pokud server během časového limitu neodpověděl, další server (pokud je k dispozici) by se dotazoval. V případě, že tyto servery DNS narazily na problémy, dokončení dotazů DNS by trvalo déle než 5 sekund, což není ideální.

Od verze Service Fabric 9.0 byla přidána podpora paralelních rekurzivních dotazů. Při paralelních dotazech je možné kontaktovat všechny rekurzivní servery DNS najednou, kde vyhraje první odpověď. Výsledkem jsou rychlejší odpovědi ve scénáři, který jsme zmínili dříve. Tato možnost není ve výchozím nastavení povolená.

V Service Fabric 9.0 jsou také zavedeny podrobné možnosti pro řízení chování rekurzivních dotazů, včetně časových limitů a pokusů o dotazy. Tyto možnosti je možné nastavit v nastavení služby DNS:

  • RecursiveQuerySerialMaxAttempts – počet sériových dotazů, které se budou pokoušet nejvíce. Pokud je toto číslo vyšší než počet serverů DNS pro předávání, dotazování se zastaví, jakmile se všechny servery pokusí provést přesně jednou.
  • RecursiveQuerySerialTimeout – hodnota časového limitu v sekundách pro každý pokus o sériový dotaz.
  • RecursiveQueryParallelMaxAttempts – počet pokusů o paralelní dotazy. Paralelní dotazy se spustí po vyčerpání maximálních pokusů o sériové dotazy.
  • RecursiveQueryParallelTimeout – hodnota časového limitu v sekundách pro každý pokus o paralelní dotaz.

Omezení a známé problémy

  • Služba DNS nepodporuje dynamické porty. K překladu služeb vystavených na dynamických portech použijte službu reverzního proxy serveru.
  • Podpora Linuxu je v současné době omezená na kontejnerizované služby. Procesní služby v Linuxu momentálně nemůžou používat službu DNS.
  • Službu DNS pro clustery s Linuxem nejde povolit prostřednictvím webu Azure Portal.
  • Pokud se pro službu změní název DNS, aktualizace názvů nemusí být v některých scénářích okamžitě viditelné. Pokud chcete tento problém vyřešit, instance služby DNS by se měly v clusteru restartovat.

Další kroky

Další informace o komunikaci služeb v clusteru s připojením a komunikací se službami