DNS-Dienst in Azure Service Fabric

Der DNS-Dienst ist ein optionaler Systemdienst, den Sie in Ihrem Cluster aktivieren können, um andere Dienste mithilfe des DNS-Protokolls zu ermitteln.

Viele Dienste, insbesondere Containerdienste, können über eine bereits vorhandene URL aufgerufen werden. Es ist wünschenswert, diese Dienste mithilfe des standardmäßigen DNS-Protokolls auflösen zu können, anstatt das Service Fabric Naming Service-Protokoll zu verwenden. Mit dem DNS-Dienst können Sie einem Dienstnamen DNS-Namen zuordnen und so Endpunkt-IP-Adressen auflösen. Diese Funktion hält die Portabilität von Containerdiensten über verschiedene Plattformen hinweg aufrecht und kann „Lift & Shift“-Szenarien vereinfachen, da Sie vorhandene Dienst-URLs verwenden können und keinen Code umschreiben müssen, um den Naming Service zu nutzen.

Der DNS-Dienst ordnet DNS-Namen den Dienstnamen zu, die wiederum vom Naming Service aufgelöst werden, um den Dienstendpunkt zurückzugeben. Der DNS-Name für den Dienst wird zum Zeitpunkt der Erstellung bereitgestellt. Die folgende Abbildung zeigt, wie der DNS-Dienst für zustandslose Dienste funktioniert. Der Kürze halber zeigen die Abbildungen nur einen Endpunkt für die Dienste, obwohl jeder Dienst mehrere Endpunkte aufweisen kann.

Abbildung, die zeigt, wie DNS-Namen durch den DNS-Dienst für zustandslose Dienste Dienstnamen zugeordnet werden.

Ab Service Fabric-Version 6.3 wurde das Service Fabric-DNS-Protokoll erweitert und umfasst ein Schema für die Adressierung partitionierter zustandsbehafteter Dienste. Mit diesen Erweiterungen können Sie die IP-Adressen bestimmter Partitionen mithilfe einer Kombination aus dem DNS-Namen des zustandsbehafteten Diensts und dem Partitionsnamen auflösen. Alle drei Partitionsschemas werden unterstützt:

  • Namenspartitionierung
  • Bereichspartitionierung
  • Singleton-Partitionierung

Die folgende Abbildung zeigt, wie der DNS-Dienst für partitionierte zustandsbehaftete Dienste funktioniert.

Abbildung, die zeigt, wie DNS-Namen durch den DNS-Dienst für partitionierte zustandsbehaftete Dienstnamen zugeordnet werden.

Weitere Informationen zu partitionierten Abfragen finden Sie im Abschnitt unten.

Betriebssystemunterstützung

Der DNS-Dienst wird sowohl auf Windows- als auch auf Linux-Clustern unterstützt, auch wenn die Unterstützung für Linux derzeit auf containerisierte Dienste beschränkt ist und nicht über das Azure-Portal aktiviert werden kann. Windows unterstützt jedoch alle Diensttypen und Bereitstellungsmodelle.

Aktivieren des DNS-Diensts

Hinweis

Durch Aktivieren des DNS-Diensts werden einige DNS-Einstellungen auf den Knoten außer Kraft gesetzt. Wenn beim Herstellen einer Verbindung mit dem Internet Probleme auftreten, überprüfen Sie die DNS-Einstellungen.

Neue Cluster

Cluster mit ARM-Vorlagen

Um einen neuen Cluster mit ARM-Vorlagen bereitzustellen, können Sie entweder die Beispielvorlagen verwenden oder eigene Vorlagen schreiben. Wenn dies noch nicht geschehen ist, kann der DNS-Dienst in den Vorlagen aktiviert werden, indem die mindestens unterstützten API-Versionen verwendet und die entsprechenden Einstellungen hinzugefügt werden. Details dazu finden Sie unten unter den Punkten 1 und 2 der nummerierten Liste.

Cluster mit dem Azure-Portal

Wenn Sie einen Standardcluster im Portal erstellen, ist der DNS-Dienst standardmäßig in der Option DNS-Dienst einschließen im Abschnitt Add-On-Features aktiviert.

Screenshot: Aktivieren des DNS-Diensts für einen Standardcluster über das Portal.

Wenn Sie einen verwalteten Cluster im Portal erstellen, ist der DNS-Dienst standardmäßig in der Option DNS-Dienst im Abschnitt Add-On-Features aktiviert.

Screenshot: Aktivieren des DNS-Diensts für einen verwalteten Cluster über das Portal.

Vorhandene Cluster

Wenn Sie einen vorhandenen verwalteten Cluster aktualisieren, um den DNS-Dienst zu aktivieren, können Sie zu diesem Zweck das Portal verwenden, indem Sie die Seite Add-On-Dienste auf der Clusterressourcenseite besuchen. Andernfalls können Sie den DNS-Dienst mithilfe alternativer Methoden aktivieren, die unten genannt werden:

  • Verwenden Sie ggf. die ARM-Vorlage, die zum Bereitstellen des Clusters verwendet wurde.
  • Navigieren Sie im Azure-Ressourcen-Explorer zum Cluster, und aktualisieren Sie die Clusterressource, wie in den Schritten weiter unten beschrieben (ab Schritt 2).
  • Navigieren Sie im Portal zum Cluster, und klicken Sie auf Vorlage exportieren. Weitere Informationen finden Sie unter Exportieren der Vorlage aus der Ressourcengruppe.

Nachdem Sie die Vorlage erstellt haben, aktivieren Sie den DNS-Dienst mit den folgenden Schritten:

  1. Überprüfen Sie bei Standardclustern, ob die apiVersion für die Ressource Microsoft.ServiceFabric/clusters auf 2017-07-01-preview oder höher festgelegt ist. Wenn dies nicht der Fall ist, aktualisieren Sie die Ressource, wie im folgenden Beispiel gezeigt:

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

    Überprüfen Sie bei verwalteten Clustern, ob die apiVersion für die Ressource Microsoft.ServiceFabric/managedClusters auf 2020-01-01-preview oder höher festgelegt ist. Wenn dies nicht der Fall ist, aktualisieren Sie die Ressource, wie im folgenden Beispiel gezeigt:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. Aktivieren Sie jetzt den DNS-Dienst mit einer der folgenden Methoden:

    • Um den DNS-Dienst mit Standardeinstellungen zu aktivieren, fügen Sie ihn zum addonFeatures-Abschnitt innerhalb des properties-Abschnitts hinzu, wie im folgenden Beispiel gezeigt:

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • Um den Dienst mit nicht standardmäßigen Einstellungen zu aktivieren, fügen Sie dem fabricSettings-Abschnitt innerhalb des properties-Abschnitts einen DnsService-Abschnitt hinzu. In diesem Fall müssen Sie den DNS-Dienst nicht zu addonFeatures hinzufügen. Weitere Informationen zu den Eigenschaften, die für den DNS-Dienst festgelegt werden können, finden Sie unter Einstellungen des DNS-Diensts.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. Nachdem Sie die Clustervorlage mit Ihren Änderungen aktualisiert haben, wenden Sie die Änderungen an, und lassen Sie das Upgrade fortfahren. Nach Abschluss des Upgrades wird der DNS-Systemdienst in Ihrem Cluster ausgeführt. Der Dienstname lautet fabric:/System/DnsService. Sie finden ihn im Service Fabric-Explorer im Dienstabschnitt System.

Hinweis

Beim Aktualisieren von DNS aus „Deaktiviert“ in „Aktiviert“ zeigt Service Fabric Explorer den neuen Status möglicherweise nicht an. Um dieses Problem zu beheben, starten Sie die Knoten neu, indem Sie die Upgraderichtlinie in Ihrer Vorlage ändern.

Festlegen des DNS-Namens für den Dienst

Sie können DNS-Namen für Ihre Dienste mit ARM-Vorlagen, mit Standarddiensten in der Datei „ApplicationManifest.xml“ oder mit PowerShell-Befehlen festlegen.

Der DNS-Name für Ihren Dienst lässt sich im gesamten Cluster auflösen, daher müssen Sie die Eindeutigkeit des DNS-Namens im gesamten Cluster sicherstellen.

Es wird dringend empfohlen, dass Sie ein Benennungsschema für <ServiceName>.<AppName> verwenden, z.B. service1.application1. Wenn eine Anwendung mit Docker Compose bereitgestellt wird, werden den Diensten automatisch anhand dieses Benennungsschemas DNS-Namen zugewiesen.

Festlegen des DNS-Namens mit einer ARM-Vorlage

Wenn Sie ARM-Vorlagen zum Bereitstellen Ihrer Dienste verwenden, können Sie die serviceDnsName-Eigenschaft dem entsprechenden Abschnitt hinzufügen und ihr einen Wert zuweisen. Beispiele finden Sie unten:

Standardcluster

Überprüfen Sie bei Standardclustern, ob die apiVersion für die Ressource Microsoft.ServiceFabric/clusters/applications/services auf 2019-11-01-preview oder höher festgelegt ist. Wenn dies nicht der Fall ist, aktualisieren Sie die Ressource, wie im folgenden Beispiel gezeigt:

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

Verwaltete Cluster

Überprüfen Sie bei verwalteten Clustern, ob die apiVersion für die Ressource Microsoft.ServiceFabric/managedclusters/applications/services auf 2022-10-01-preview oder höher festgelegt ist. Wenn dies nicht der Fall ist, aktualisieren Sie die Ressource, wie im folgenden Beispiel gezeigt:

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

Festlegen des DNS-Namens für einen Standarddienst in der Datei „ApplicationManifest.xml“

Öffnen Sie das Projekt in Visual Studio oder Ihrem bevorzugten Editor, und öffnen Sie die Datei „ApplicationManifest.xml“. Navigieren Sie zum Abschnitt der Standarddienste, und fügen Sie für jeden Dienst das Attribut ServiceDnsName hinzu. Im folgenden Beispiel wird gezeigt, wie Sie den DNS-Namen des Diensts auf stateless1.application1 festlegen.

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

Das folgende Beispiel legt den DNS-Namen für einen zustandsbehafteten Dienst auf stateful1.application1 fest. Der Dienst verwendet ein benanntes Partitionsschema. Beachten Sie, dass die Partitionsnamen aus Kleinbuchstaben bestehen. Dies ist notwendig für Partitionen, für die DNS-Abfragen durchgeführt werden. Weitere Informationen finden Sie unter Senden von DNS-Abfragen in einer zustandsbehafteten Dienstpartition.

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

Festlegen des DNS-Namens für einen Dienst mit PowerShell

Sie können den DNS-Namen für einen Dienst festlegen, während Sie diesen Dienst mit dem PowerShell-Befehl New-ServiceFabricService erstellen. Im folgenden Beispiel wird ein neuer zustandsloser Dienst mit dem DNS-Namen stateless1.application1 erstellt:

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

Sie können einen vorhandenen Dienst auch mit dem PowerShell-Befehl Update-ServiceFabricService aktualisieren. Im folgenden Beispiel wird ein vorhandener zustandsloser Dienst aktualisiert, um den DNS-Namen stateless1.application1 hinzuzufügen:

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

Überprüfe, ob in Service Fabric Explorer ein DNS-Name festgelegt ist

Nachdem der Dienst mit dem DNS-Namen bereitgestellt wurde, zeigt Service Fabric Explorer den DNS-Namen für den Dienst an, wie in der folgenden Abbildung gezeigt:

Screenshot: DNS-Name in Service Fabric Explorer.

Hinweis

Diese Ansicht kann je nach verwendeter Version von Service Fabric Explorer unterschiedlich sein. Das Feld „DNS-Name“ sollte jedoch in irgendeiner Form auf der Dienstseite angezeigt werden.

Senden von DNS-Abfragen in einer zustandsbehafteten Dienstpartition

Ab Service Fabric-Version 6.3 unterstützt der DNS-Dienst Abfragen für Dienstpartitionen. Um Unterstützung für partitionierte Dienstabfragen zu aktivieren, müssen die DNS-Diensteinstellungen aktualisiert werden, um die Option EnablePartitionedQuery auf true festzulegen.

Bei Partitionen, die in DNS-Abfragen verwendet werden sollen, gelten folgende Einschränkungen bei der Benennung:

  • Partitionsnamen müssen DNS-konform sein.
  • Partitionsnamen mit mehreren Bezeichnungen einschließlich Punkt oder „.“ sollten nicht verwendet werden.
  • Partitionsnamen müssen in Kleinbuchstaben geschrieben werden.

DNS-Abfragen für eine Partition sind folgendermaßen partitioniert:

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

Hierbei gilt:

  • First-Label-Of-Partitioned-Service-DNSName ist der erste Teil des DNS-Namens Ihres Diensts.
  • PartitionPrefix ist ein Wert, der im DnsService-Abschnitt des Clustermanifests oder über die ARM-Vorlage des Clusters festgelegt werden kann. Der Standardwert lautet „--“. Weitere Informationen finden Sie unter Einstellungen des DNS-Diensts.
  • Target-Partition-Name ist der Name der Partition.
  • PartitionSuffix ist ein Wert, der im DnsService-Abschnitt des Clustermanifests oder über die ARM-Vorlage des Clusters festgelegt werden kann. Der Standardwert ist eine leere Zeichenfolge. Weitere Informationen finden Sie unter Einstellungen des DNS-Diensts.
  • Remaining-Partitioned-Service-DNSName ist der verbleibende Teil des DNS-Namens Ihres Diensts.

Die folgenden Beispiele zeigen DNS-Abfragen für partitionierte Dienste, die auf einem Cluster mit Standardeinstellungen für PartitionPrefix und PartitionSuffix ausgeführt werden:

  • Um die Partition „0“ eines Diensts mit dem DNS-Namen backendrangedschemesvc.application aufzulösen, der ein Bereichspartitionierungsschema verwendet, geben Sie backendrangedschemesvc--0.application an.
  • Um die Partition „first“ eines Diensts mit dem DNS-Namen backendnamedschemesvc.application aufzulösen, der ein Namenspartitionierungsschema verwendet, geben Sie backendnamedschemesvc--first.application an.

Der DNS-Dienst gibt die IP-Adresse des Endpunkts zurück, der dem primären Replikat der Partition zugeordnet ist. Wenn keine Partition angegeben wird, wählt der DNS-Dienst eine Partition nach dem Zufallsprinzip aus.

Verwenden von DNS-Namen in Ihren Diensten

Wenn Sie Dienste mit DNS-Namen bereitstellen, können Sie die IP-Adresse der verfügbar gemachten Endpunkte ermitteln, indem Sie auf den DNS-Namen verweisen. Der DNS-Dienst funktioniert für zustandslose Dienste und in Service Fabric, Version 6.3 und höher, auch für zustandsbehaftete Dienste. Bei zustandsbehafteten Diensten, die auf Service Fabric-Versionen vor 6.3 ausgeführt werden, können Sie den integrierten Reverseproxydienst für HTTP-Aufrufe verwenden, um eine bestimmte Dienstpartition aufzurufen.

Dynamische Ports werden vom DNS-Dienst nicht unterstützt. Sie können den Reverseproxydienst verwenden, um Dienste aufzulösen, die dynamische Ports verwenden.

Der folgende Code zeigt, wie Sie einen zustandslosen Dienst über DNS aufrufen. Es handelt sich ganz einfach um einen regulären HTTP-Aufruf, bei dem Sie den DNS-Namen, den Port und ggf. einen optionalen Pfad als Bestandteil der URL angeben.

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

Der folgende Code zeigt den Aufruf einer bestimmten Partition eines zustandsbehafteten Diensts. In diesem Fall enthält der DNS-Name den Partitionsnamen (Partition1). Der Aufruf geht von einem Cluster mit Standardwerten für PartitionPrefix und PartitionSuffix aus.

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

Rekursive Abfragen

Bei DNS-Namen, die der DNS-Dienst nicht selbst auflösen kann (z. B. ein öffentlicher DNS-Name), leitet er die Abfrage an bereits vorhandene rekursive DNS-Server auf den Knoten weiter.

Abbildung, die zeigt, wie DNS-Abfragen für öffentliche Namen aufgelöst werden.

Vor Service Fabric 9.0 wurden diese Server seriell mit einem festen Timeoutzeitraum von 5 Sekunden abgefragt, bis eine Antwort empfangen wurde. Wenn ein Server innerhalb des Timeoutzeitraums nicht reagiert hat, wurde der nächste Server (wenn verfügbar) abgefragt. Bei Problemen mit diesen DNS-Servern würde der Abschluss von DNS-Abfragen länger als 5 Sekunden dauern, was nicht ideal ist.

Ab Service Fabric 9.0 wurde Unterstützung für parallele rekursive Abfragen hinzugefügt. Bei parallelen Abfragen können alle rekursiven DNS-Server auf einmal kontaktiert werden, wobei die erste Antwort gewinnt. Dies führt zu schnelleren Antworten im oben beschriebenen Szenario. Diese Option ist standardmäßig nicht aktiviert.

In Service Fabric 9.0 wurden auch differenzierte Optionen eingeführt, um das Verhalten der rekursiven Abfragen zu steuern, einschließlich der Timeoutzeiträume und Abfrageversuche. Diese Optionen können in den Einstellungen des DNS-Diensts festgelegt werden:

  • RecursiveQuerySerialMaxAttempts: Die Anzahl der seriellen Abfragen, die höchstens versucht werden. Wenn dieser Wert größer ist als die Anzahl der weiterleitenden DNS-Server, wird das Abfragen beendet, sobald alle Server genau ein Mal versucht wurden.
  • RecursiveQuerySerialTimeout: Der Timeoutwert in Sekunden für jede versuchte serielle Abfrage.
  • RecursiveQueryParallelMaxAttempts: Die Anzahl der Versuche, parallele Abfragen zu starten. Parallele Abfragen werden ausgeführt, nachdem die maximale Anzahl von Versuchen für serielle Abfragen ausgeschöpft wurde.
  • RecursiveQueryParallelTimeout: Der Timeoutwert in Sekunden für jeden Versuch einer parallelen Abfrage.

Einschränkungen und bekannte Probleme

  • Dynamische Ports werden vom DNS-Dienst nicht unterstützt. Verwenden Sie zum Auflösen der Dienste, die über dynamische Ports verfügbar gemacht werden, den Reverseproxydienst.
  • Die Unterstützung für Linux ist derzeit auf containerisierte Dienste beschränkt. Prozessbasierte Dienste unter Linux können derzeit keinen DNS-Dienst verwenden.
  • Der DNS-Dienst für Linux-Cluster kann nicht über das Azure-Portal aktiviert werden.
  • Wenn ein DNS-Name für einen Dienst geändert wird, sind die Namensaktualisierungen in einigen Szenarien möglicherweise nicht sofort sichtbar. Um dieses Problem zu beheben, sollten DNS-Dienstinstanzen im gesamten Cluster neu gestartet werden.

Nächste Schritte

Erfahren Sie mehr über Dienstkommunikation innerhalb des Clusters unter Herstellung einer Verbindung mit Diensten und Kommunikation mit diesen Diensten.