Udostępnij za pośrednictwem


Usługa DNS w usłudze Azure Service Fabric

Usługa DNS to opcjonalna usługa systemowa, którą można włączyć w klastrze w celu odnajdywania innych usług przy użyciu protokołu DNS.

Wiele usług, zwłaszcza usług konteneryzowanych, jest adresowanych za pośrednictwem istniejącego adresu URL. Możliwość rozpoznawania tych usług przy użyciu standardowego protokołu DNS, a nie protokołu Service Fabric Naming Service, jest pożądana. Usługa DNS umożliwia mapowania nazw DNS na nazwę usługi, a tym samym rozpoznawanie adresów IP punktu końcowego. Takie funkcje utrzymują przenośność usług konteneryzowanych na różnych platformach i mogą ułatwić korzystanie ze scenariuszy "lift and shift", umożliwiając korzystanie z istniejących adresów URL usług, a nie ponowne zapisywanie kodu w celu korzystania z usługi Nazewnictwa.

Usługa DNS mapuje nazwy DNS na nazwy usług, które z kolei są rozpoznawane przez usługę Naming Service w celu zwrócenia punktu końcowego usługi. Nazwa DNS usługi jest udostępniana w momencie tworzenia. Na poniższym diagramie przedstawiono sposób działania usługi DNS dla usług bezstanowych. W przypadku zwięzłości diagramy pokazują tylko jeden punkt końcowy dla usług, chociaż każda usługa może mieć wiele punktów końcowych.

Diagram przedstawiający sposób mapowania nazw DNS na nazwy usług według usługi DNS dla usług bezstanowych.

Począwszy od usługi Service Fabric w wersji 6.3, protokół DNS usługi Service Fabric został rozszerzony w celu uwzględnienia schematu adresowania partycjonowanych usług stanowych. Te rozszerzenia umożliwiają rozpoznawanie określonych adresów IP partycji przy użyciu kombinacji nazwy DNS usługi stanowej i nazwy partycji. Obsługiwane są wszystkie trzy schematy partycjonowania:

  • Nazwane partycjonowanie
  • Partycjonowanie zakresowe
  • Partycjonowanie jednotonowe

Na poniższym diagramie przedstawiono sposób działania usługi DNS dla partycjonowanych usług stanowych.

Diagram przedstawiający sposób mapowania nazw DNS na nazwy usług według usługi DNS dla partycjonowanych usług stanowych.

Aby uzyskać więcej informacji na temat partycjonowanych zapytań, zapoznaj się z poniższą sekcją.

Obsługa systemu operacyjnego

Usługa DNS jest obsługiwana zarówno w klastrach systemu Windows, jak i Linux, chociaż obsługa systemu Linux jest obecnie ograniczona do usług konteneryzowanych i nie można jej włączyć za pośrednictwem witryny Azure Portal. System Windows obsługuje jednak wszystkie typy usług i modele wdrażania.

Włączanie usługi DNS

Uwaga

Włączenie usługi DNS spowoduje zastąpienie niektórych ustawień DNS w węzłach. Jeśli wystąpią problemy z nawiązywaniem połączenia z Internetem, sprawdź ustawienia DNS.

Nowe klastry

Klastry korzystające z szablonów usługi ARM

Aby wdrożyć nowy klaster przy użyciu szablonów usługi ARM, możesz użyć przykładowych szablonów lub napisać własne. Jeśli nie zostało to jeszcze zrobione, usługę DNS można włączyć w szablonach przy użyciu minimalnych obsługiwanych wersji interfejsu API i dodając odpowiednie ustawienia. Szczegółowe informacje na temat tego, jak to zrobić, można znaleźć poniżej w punktach 1 i 2 listy numerowanej.

Klastry korzystające z witryny Azure Portal

Jeśli tworzysz standardowy klaster w portalu, usługa DNS jest domyślnie włączona w opcji Uwzględnij usługę DNS w sekcji Dodawanie funkcji.

Zrzut ekranu przedstawiający włączanie usługi DNS dla klastra standardowego za pośrednictwem portalu.

Jeśli tworzysz klaster zarządzany w portalu, usługa DNS jest domyślnie włączona w opcji usługi DNS w sekcji Dodawanie funkcji.

Zrzut ekranu przedstawiający włączanie usługi DNS dla klastra zarządzanego za pośrednictwem portalu.

Istniejące klastry

Jeśli aktualizujesz istniejący klaster zarządzany w celu włączenia usługi DNS, możesz to zrobić z poziomu portalu, odwiedzając stronę Dodatki usług na stronie zasobu klastra. W przeciwnym razie możesz włączyć usługę DNS przy użyciu alternatywnych metod, do których się odwołujesz poniżej:

  • Użyj szablonu usługi ARM, który został użyty do wdrożenia klastra, jeśli ma to zastosowanie.
  • Przejdź do klastra w eksploratorze zasobów platformy Azure i zaktualizuj zasób klastra, jak pokazano w poniższych krokach (od kroku 2 i do wewnątrz).
  • Przejdź do klastra w portalu i kliknij pozycję Eksportuj szablon. Aby dowiedzieć się więcej, zobacz Eksportowanie szablonu z grupy zasobów.

Po utworzeniu szablonu możesz włączyć usługę DNS, wykonując następujące kroki:

  1. W przypadku klastrów standardowych sprawdź, czy apiVersion dla zasobu ustawiono 2017-07-01-preview wartość lub nowszą Microsoft.ServiceFabric/clusters , a jeśli nie, zaktualizuj ją, jak pokazano w poniższym przykładzie:

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

    W przypadku klastrów zarządzanych sprawdź, czy apiVersion dla zasobu ustawiono 2020-01-01-preview wartość lub nowszą Microsoft.ServiceFabric/managedClusters , a jeśli nie, zaktualizuj ją, jak pokazano w poniższym przykładzie:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. Teraz włącz usługę DNS na jeden z następujących sposobów:

    • Aby włączyć usługę DNS z ustawieniami domyślnymi, dodaj ją do addonFeatures sekcji wewnątrz properties sekcji, jak pokazano w poniższym przykładzie:

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • Aby włączyć usługę z innymi niż ustawienia domyślne, dodaj sekcję DnsService do fabricSettings sekcji w properties sekcji . W takim przypadku nie musisz dodawać usługi DnsService do addonFeaturesusługi . Aby dowiedzieć się więcej o właściwościach, które można ustawić dla usługi DNS, zobacz Ustawienia usługi DNS.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. Po zaktualizowaniu szablonu klastra za pomocą zmian zastosuj je i pozwól na ukończenie uaktualniania. Po zakończeniu uaktualniania usługa systemu DNS zostanie uruchomiona w klastrze. Nazwa usługi to fabric:/System/DnsService, a można ją znaleźć w sekcji Usługa systemowa w eksploratorze usługi Service Fabric.

Uwaga

Podczas uaktualniania systemu DNS z wyłączonego do włączonego eksploratora usługi Service Fabric może nie odzwierciedlać nowego stanu. Aby rozwiązać ten problem, uruchom ponownie węzły, modyfikując zasady uaktualniania w szablonie.

Ustawianie nazwy DNS dla usługi

Nazwy DNS usług można ustawić za pomocą szablonów usługi ARM, z domyślnymi usługami w pliku ApplicationManifest.xml lub za pomocą poleceń programu PowerShell.

Nazwa DNS usługi jest rozpoznawalna w całym klastrze, dlatego ważne jest zapewnienie unikatowości nazwy DNS w klastrze.

Zdecydowanie zaleca się użycie schematu nazewnictwa elementu <ServiceName>.<AppName>, na przykład service1.application1. Jeśli aplikacja jest wdrażana przy użyciu narzędzia Docker compose, usługi są automatycznie przypisywane nazwy DNS przy użyciu tego schematu nazewnictwa.

Ustawianie nazwy DNS przy użyciu szablonu usługi ARM

Jeśli używasz szablonów usługi ARM do wdrażania usług, możesz dodać serviceDnsName właściwość do odpowiedniej sekcji i przypisać do niej wartość. Przykłady można zobaczyć poniżej:

Klastry w warstwie Standardowa

W przypadku klastrów standardowych sprawdź, czy apiVersion dla zasobu ustawiono 2019-11-01-preview wartość lub nowszą Microsoft.ServiceFabric/clusters/applications/services , a jeśli nie, zaktualizuj ją, jak pokazano w poniższym przykładzie:

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

Klastry zarządzane

W przypadku klastrów zarządzanych sprawdź, czy apiVersion dla zasobu ustawiono 2022-10-01-preview wartość lub nowszą Microsoft.ServiceFabric/managedclusters/applications/services , a jeśli nie, zaktualizuj ją, jak pokazano w poniższym przykładzie:

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

Ustawianie nazwy DNS dla usługi domyślnej w ApplicationManifest.xml

Otwórz projekt w programie Visual Studio lub ulubionym edytorze i otwórz plik ApplicationManifest.xml. Przejdź do sekcji usług domyślnych i dla każdej usługi dodaj ServiceDnsName atrybut. W poniższym przykładzie pokazano, jak ustawić nazwę DNS usługi na stateless1.application1

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

W poniższym przykładzie ustawiono nazwę DNS dla usługi stanowej na stateful1.application1wartość . Usługa używa nazwanego schematu partycjonowania. Zwróć uwagę, że nazwy partycji są małe litery. Jest to wymaganie dotyczące partycji, które będą przeznaczone dla zapytań DNS; Aby uzyskać więcej informacji, zobacz Tworzenie zapytań DNS na partycji usługi stanowej.

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

Ustawianie nazwy DNS dla usługi przy użyciu programu PowerShell

Nazwę DNS usługi można ustawić podczas jej tworzenia przy użyciu New-ServiceFabricService polecenia programu PowerShell. W poniższym przykładzie zostanie utworzona nowa usługa bezstanowa o nazwie stateless1.application1DNS :

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

Możesz również zaktualizować istniejącą usługę Update-ServiceFabricService przy użyciu polecenia programu PowerShell. Poniższy przykład aktualizuje istniejącą usługę bezstanową, aby dodać nazwę stateless1.application1DNS :

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

Sprawdź, czy nazwa DNS jest ustawiona w narzędziu Service Fabric Explorer

Po wdrożeniu usługi przy użyciu nazwy DNS narzędzie Service Fabric Explorer wyświetli nazwę DNS dla usługi, jak pokazano na poniższym rysunku:

Zrzut ekranu przedstawiający nazwę DNS w narzędziu Service Fabric Explorer.

Uwaga

Ten widok może się różnić w zależności od używanej wersji narzędzia Service Fabric Explorer, jednak pole nazwy DNS powinno być widoczne w jakiejś formie na stronie usługi.

Wykonywanie zapytań DNS w partycji usługi stanowej

Począwszy od usługi Service Fabric w wersji 6.3, usługa DNS obsługuje zapytania dotyczące partycji usługi. Aby włączyć obsługę zapytań usługi partycjonowanej, należy zaktualizować ustawienia usługi DNS, aby ustawić opcję EnablePartitionedQuery na true.

W przypadku partycji, które będą używane w zapytaniach DNS, obowiązują następujące ograniczenia dotyczące nazewnictwa:

  • Nazwy partycji powinny być zgodne z systemem DNS.
  • Nie należy używać nazw partycji z wieloma etykietami, w tym kropki lub ".".
  • Nazwy partycji powinny mieć małe litery.

Zapytania DNS przeznaczone dla partycji są sformatowane w następujący sposób:

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

Gdzie:

  • First-Label-Of-Partitioned-Service-DNSName jest pierwszą częścią nazwy DNS usługi.
  • PartitionPrefix to wartość, którą można ustawić w sekcji DnsService manifestu klastra lub za pomocą szablonu arm klastra. Wartość domyślna to "--". Aby dowiedzieć się więcej, zobacz Ustawienia usługi DNS.
  • Target-Partition-Name to nazwa partycji.
  • PartitionSuffix to wartość, którą można ustawić w sekcji DnsService manifestu klastra lub za pomocą szablonu arm klastra. Wartość domyślna to pusty ciąg. Aby dowiedzieć się więcej, zobacz Ustawienia usługi DNS.
  • Remaining-Partitioned-Service-DNSName jest pozostałą częścią nazwy DNS usługi.

W poniższych przykładach pokazano zapytania DNS dla usług partycjonowanych uruchomionych w klastrze z domyślnymi ustawieniami PartitionPrefix i PartitionSuffix:

  • Aby rozpoznać partycję "0" usługi o nazwie backendrangedschemesvc.application DNS używającej schematu partycjonowania z zakresem, użyj polecenia backendrangedschemesvc--0.application.
  • Aby rozpoznać partycję "first" usługi o nazwie backendnamedschemesvc.application DNS używającej nazwanego schematu partycjonowania, użyj polecenia backendnamedschemesvc--first.application.

Usługa DNS zwraca adres IP punktu końcowego skojarzonego z repliką podstawową partycji. Jeśli żadna partycja nie zostanie określona, usługa DNS wybierze losowo partycję.

Używanie nazw DNS w usługach

W przypadku wdrażania usług z nazwami DNS można znaleźć adres IP uwidocznionych punktów końcowych, odwołując się do nazwy DNS. Usługa DNS działa w przypadku usług bezstanowych i w usłudze Service Fabric w wersji 6.3 lub nowszej dla usług stanowych. W przypadku usług stanowych działających w wersjach usługi Service Fabric wcześniejszych niż 6.3 można użyć wbudowanej usługi zwrotnego serwera proxy dla wywołań HTTP w celu wywołania określonej partycji usługi.

Porty dynamiczne nie są obsługiwane przez usługę DNS. Usługę zwrotnego serwera proxy można użyć do rozpoznawania usług korzystających z portów dynamicznych.

Poniższy kod pokazuje, jak wywołać usługę bezstanową za pośrednictwem systemu DNS. Jest to zwykłe wywołanie HTTP, w którym podajesz nazwę DNS, port i dowolną opcjonalną ścieżkę jako część adresu 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;
    }
}

Poniższy kod przedstawia wywołanie określonej partycji usługi stanowej. W takim przypadku nazwa DNS zawiera nazwę partycji (partycja1). Wywołanie zakłada klaster z wartościami domyślnymi dla PartitionPrefix i 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;
    }
}

Zapytania cykliczne

W przypadku nazw DNS, które usługa DNS nie może rozpoznać samodzielnie (na przykład publicznej nazwy DNS), przekaże zapytanie do istniejących cyklicznych serwerów DNS w węzłach.

Diagram przedstawiający sposób rozpoznawania zapytań DNS dla nazw publicznych.

Przed usługą Service Fabric w wersji 9.0 te serwery były wykonywane szeregowo do momentu odebrania odpowiedzi z ustalonym limitem czasu 5 sekund między. Jeśli serwer nie odpowiedział w okresie przekroczenia limitu czasu, zostanie zapytany następny serwer (jeśli jest dostępny). W przypadku, gdy te serwery DNS napotkały jakiekolwiek problemy, ukończenie zapytań DNS potrwa dłużej niż 5 sekund, co nie jest idealne.

Począwszy od usługi Service Fabric 9.0, dodano obsługę równoległych zapytań cyklicznych. W przypadku zapytań równoległych wszystkie cykliczne serwery DNS mogą być kontaktowane jednocześnie, gdzie pierwsza odpowiedź wygrywa. Skutkuje to szybszymi odpowiedziami we wcześniej wymienionym scenariuszu. Ta opcja nie jest domyślnie włączona.

Szczegółowe opcje są również wprowadzane w usłudze Service Fabric 9.0 w celu kontrolowania zachowania zapytań cyklicznych, w tym okresów limitu czasu i prób zapytań. Te opcje można ustawić w ustawieniach usługi DNS:

  • RecursiveQuerySerialMaxAttempts — liczba zapytań seryjnych, które będą podejmowane co najwyżej. Jeśli ta liczba jest większa niż liczba serwerów DNS przekazujących, zapytanie zostanie zatrzymane po próbie dokładnie raz wszystkich serwerów.
  • RecursiveQuerySerialTimeout — wartość limitu czasu w sekundach dla każdego próby kwerendy szeregowej.
  • RecursiveQueryParallelMaxAttempts — liczba prób równoległych zapytań. Zapytania równoległe są wykonywane po wyczerpaniu maksymalnej liczby prób dla zapytań seryjnych.
  • RecursiveQueryParallelTimeout — wartość limitu czasu w sekundach dla każdego próby zapytania równoległego.

Ograniczenia i znane problemy

  • Porty dynamiczne nie są obsługiwane przez usługę DNS. Aby rozwiązać problemy z usługami uwidocznianych na portach dynamicznych, użyj usługi zwrotnego serwera proxy.
  • Obsługa systemu Linux jest obecnie ograniczona do usług konteneryzowanych. Obecnie usługi oparte na przetwarzaniu w systemie Linux nie mogą używać usługi DNS.
  • Nie można włączyć usługi DNS dla klastrów systemu Linux za pośrednictwem witryny Azure Portal.
  • Jeśli nazwa DNS zostanie zmieniona dla usługi, aktualizacje nazw mogą nie być natychmiast widoczne w niektórych scenariuszach. Aby rozwiązać ten problem, wystąpienia usługi DNS powinny być ponownie uruchamiane w klastrze.

Następne kroki

Dowiedz się więcej o komunikacji między usługami w klastrze za pomocą połączeń i komunikacji z usługami