Služba DNS v Azure Service Fabric

Služba DNS je volitelná systémová služba, kterou můžete v 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. Možnost překladu těchto služeb pomocí standardního protokolu DNS, nikoli pomocí protokolu Service Fabric Naming Service Fabric, je žádoucí. Služba DNS umožňuje namapovat názvy DNS na název služby, a tím přeložit IP adresy koncových bodů. Tato funkce udržuje přenositelnost kontejnerizovaných služeb na různých platformách a může usnadnit scénáře "lift and shift" tím, že umožňuje používat stávající adresy URL služeb místo přepisování kódu pro použití služby pojmenování.

Služba DNS mapuje názvy DNS na názvy služeb, které následně přeloží služba pojmenování, aby vrátila koncový bod služby. Název DNS pro službu se poskytuje v okamžiku vytvoření. Následující diagram znázorňuje, jak služba DNS funguje pro bezstavové služby. Kvůli stručnosti diagramy zobrazují jenom 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 o schéma pro adresování dělených stavových služeb. Tato rozšíření umožňují přeložit IP adresy konkrétních 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é oddíly v rozsahu
  • Jednoúčelové dělení

Následující diagram ukazuje, jak služba DNS funguje u dělených stavových služeb.

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

Další informace o rozdělených dotazech najdete v části níže.

Podpora operačního systému

Služba DNS je podporovaná v clusterech s Windows i Linuxem, i když podpora linuxu je v současné době omezená na kontejnerizované služby a nedá se povolit prostřednictvím Azure Portal. Systém 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 máte problémy 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 buď použít ukázkové šablony , nebo napsat vlastní. Pokud to ještě není hotové, můžete službu DNS povolit v šablonách pomocí minimálních podporovaných verzí rozhraní API a přidáním příslušných nastavení. Podrobnosti o tom, jak toho dosáhnout, najdete níže v bodech 1 a 2 číslování seznamu.

Clustery využívající 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žba 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 tak, aby povoloval službu DNS, můžete to udělat na portálu tak, že přejdete na stránku Doplňkové služby na stránce prostředku clusteru. V opačném případě 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).
  • Na portálu přejděte do clusteru a klikněte na Exportovat šablonu. Další informace najdete v tématu Export šablony ze skupiny prostředků.

Jakmile budete mít šablonu, můžete službu DNS povolit pomocí následujících kroků:

  1. U standardních clusterů zkontrolujte, že apiVersion je pro prostředek nastavený na 2017-07-01-preview hodnotu nebo novější, a pokud ne, aktualizujte ho Microsoft.ServiceFabric/clusters , 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')]",
        ...
    }
    

    V případě spravovaných clusterů zkontrolujte, jestli apiVersion je prostředek Microsoft.ServiceFabric/managedClusters nastavený na 2020-01-01-preview hodnotu 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 službu DNS povolit s výchozím nastavením, přidejte ji do oddílu addonFeatures 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 oddíl do oddílu fabricSettings uvnitř oddílu properties . V tomto případě není potřeba přidávat službu DnsService do addonFeatures. Další informace o vlastnostech, které je možné 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 aktualizujete šablonu clusteru svými změnami, použijte je a nechte upgrade dokončit. Po dokončení upgradu se ve vašem clusteru spustí systémová služba DNS. Název služby je fabric:/System/DnsServicea najdete ho v části Systémová služba v Průzkumníku Service Fabric.

Poznámka

Při upgradu DNS ze zakázaného na povoleno nemusí Service Fabric Explorer odrážet nový stav. Pokud chcete tento 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, výchozích služeb v souboru ApplicationManifest.xml nebo pomocí příkazů PowerShellu.

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

Důrazně doporučujeme použít schéma pojmenování typu <ServiceName>.<AppName>; 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 jí hodnotu. Příklady najdete níže:

Clustery úrovně Standard

U standardních clusterů zkontrolujte, že apiVersion je pro prostředek nastavený na 2019-11-01-preview hodnotu nebo novější, a pokud ne, aktualizujte ho Microsoft.ServiceFabric/clusters/applications/services , 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

V případě spravovaných clusterů zkontrolujte, jestli apiVersion je prostředek Microsoft.ServiceFabric/managedclusters/applications/services nastavený na 2022-10-01-preview hodnotu 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 soubor ApplicationManifest.xml. Přejděte do části Výchozí služby 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 pro oddíly, které budou cílené v dotazech DNS. Další informace najdete v tématu Vytváření dotazů DNS na oddíl stavové 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 jejím 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 název DNS nastavený v Service Fabric Explorer

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 Explorer

Poznámka

Toto zobrazení se může lišit v závislosti na použité verzi Service Fabric Explorer, ale pole s názvem DNS by mělo být na stránce služby viditelné v nějaké podobě.

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 pro dotazy služby rozdělené na oddíly, je potřeba aktualizovat nastavení služby DNS tak, aby nastavila možnost EnablePartitionedQuery na true.

Pro oddíly, které se budou používat 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 ., 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 naformá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, kterou je možné 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.
  • Target-Partition-Name je název oddílu.
  • PartitionSuffix je hodnota, kterou je možné 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 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 pro PartitionPrefix a 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 "first" 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í zadán žádný oddíl, služba DNS náhodně vybere oddíl.

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

Pokud nasadíte služby s názvy DNS, můžete zjistit 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. U stavových služeb spuštěných ve verzích Service Fabric starších než 6.3 můžete použít integrovanou službu reverzního proxy serveru pro volání HTTP k volání konkrétního oddílu služby.

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, při kterém 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 nemůže sama přeložit (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í způsob překladu dotazů DNS pro veřejné názvy

Před verzí Service Fabric 9.0 se tyto servery dotazovaly sériově, dokud nebyla přijata odpověď s pevným časovým limitem 5 sekund. Pokud server neodpověděl během časového limitu, bude dotazován na další server (pokud je k dispozici). V případě, že na těchto serverech DNS došlo k problémům, dokončení dotazů DNS by trvalo déle než 5 sekund, což není ideální.

Od verze Service Fabric 9.0 se přidala podpora paralelních rekurzivních dotazů. U paralelních dotazů je možné kontaktovat všechny rekurzivní servery DNS najednou, kde vyhrává první odpověď. Výsledkem jsou rychlejší odpovědi ve výše zmíněném scénáři. Tato možnost není ve výchozím nastavení povolená.

V Service Fabric 9.0 jsou také zavedeny jemně odstupňované možnosti, které řídí chování rekurzivních dotazů, včetně časových limitů a pokusů o dotazy. V nastavení služby DNS je možné nastavit tyto možnosti:

  • RecursiveQuerySerialMaxAttempts – maximální počet sériových dotazů, o které se pokusíte. Pokud je toto číslo vyšší než počet serverů DNS pro předávání, dotazování se zastaví, jakmile se o všechny servery pokusíte 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 spouštějí po vyčerpání maximálního počtu 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. Pokud chcete vyřešit služby vystavené na dynamických portech, použijte službu reverzního proxy serveru.
  • Podpora Linuxu je v současné době omezená na kontejnerizované služby. Služby založené na procesech v Linuxu v současné době nemůžou používat službu DNS.
  • Službu DNS pro clustery s Linuxem nejde povolit prostřednictvím Azure Portal.
  • Pokud se pro službu změní název DNS, nemusí být aktualizace názvu v některých scénářích okamžitě viditelné. Pokud chcete tento problém vyřešit, je potřeba restartovat instance služby DNS v rámci clusteru.

Další kroky

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