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, można 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żądane. Usługa DNS umożliwia mapowania nazw DNS na nazwę usługi, a tym samym rozpoznawanie adresów IP punktów końcowych. Takie funkcje utrzymują przenośność konteneryzowanych usług na różnych platformach i mogą ułatwić scenariusze "lift and shift", umożliwiając korzystanie z istniejących adresów URL usług, a nie ponownego zapisywania 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 podawana w momencie tworzenia. Na poniższym diagramie pokazano, jak działa usługa 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 przez usługę 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 w zakresie
  • Partycjonowanie jednotonowe

Na poniższym diagramie pokazano, jak działa usługa 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 zapytań podzielonych na partycje, 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 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 jeszcze nie zostało to 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 zobaczyć poniżej w punktach 1 i 2 listy numerowanej.

Klastry korzystające z Azure Portal

Jeśli tworzysz klaster standardowy 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ć w portalu, odwiedzając stronę Dodatki usług na stronie zasobów klastra. W przeciwnym razie można włączyć usługę DNS przy użyciu alternatywnych metod, do których odwołuje się 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 przodu).
  • 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 dla apiVersion zasobu ustawiono wartość 2017-07-01-preview 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 dla apiVersion zasobu ustawiono wartość 2020-01-01-preview 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 w 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 addonFeatureselementu . 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łączenia Service Fabric Explorer 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 dla 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 rozpoznawana w całym klastrze, dlatego ważne jest, aby zapewnić unikatowość nazwy DNS w klastrze.

Zdecydowanie zaleca się użycie schematu <ServiceName>.<AppName>nazewnictwa elementu , 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ść. Poniżej przedstawiono przykłady:

Klastry standardowe

W przypadku klastrów standardowych sprawdź, czy dla apiVersion zasobu ustawiono wartość 2019-11-01-preview 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 dla apiVersion zasobu ustawiono wartość 2022-10-01-preview 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>

Poniższy przykład ustawia nazwę DNS dla usługi stanowej na stateful1.application1. Usługa używa nazwanego schematu partycjonowania. Zwróć uwagę, że nazwy partycji są małe litery. Jest to wymaganie dla partycji, które będą objęte zapytaniami 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ę za pomocą Update-ServiceFabricService 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 Service Fabric Explorer

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

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

Uwaga

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

Tworzenie zapytań DNS na 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ć trueopcję EnablePartitionedQuery na .

W przypadku partycji, które będą używane w zapytaniach DNS, obowiązują następujące ograniczenia 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 to pozostała część nazwy DNS usługi.

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

  • Aby rozpoznać partycję "0" usługi z nazwą backendrangedschemesvc.application DNS, która używa schematu partycjonowania zakresu, użyj .backendrangedschemesvc--0.application
  • Aby rozpoznać partycję "first" usługi z nazwą backendnamedschemesvc.application DNS, która używa nazwanego schematu partycjonowania, użyj .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 losowo wybierze 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 dla 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ługi zwrotnego serwera proxy umożliwiają rozpoznawanie 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 na węzłach.

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

Przed usługą Service Fabric 9.0 te serwery były odpytywane 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 trwałoby 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 rekursywne serwery DNS mogą być kontaktowane jednocześnie, gdzie pierwsza odpowiedź wygrywa. Powoduje to szybsze reakcje we wspomnianym wcześniej 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 najwyżej. Jeśli liczba ta jest większa niż liczba przekazujących serwerów DNS, 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ń szeregowych.
  • 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.
  • Usługi DNS dla klastrów systemu Linux nie można włączyć za pośrednictwem 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 z połączeniem i komunikacją z usługami