DNS-service in Azure Service Fabric
DNS-service is een optionele systeemservice die u in uw cluster kunt inschakelen om andere services te detecteren met behulp van het DNS-protocol.
Veel services, met name in containers geplaatste services, zijn adresseerbaar via een bestaande URL. Het is wenselijk om deze services op te lossen met behulp van het standaard-DNS-protocol in plaats van het Service Fabric Naming Service-protocol. Met de DNS-service kunt u DNS-namen toewijzen aan een servicenaam en daarom EINDPUNT-IP-adressen omzetten. Deze functionaliteit behoudt de draagbaarheid van in containers geplaatste services op verschillende platforms en kan 'lift and shift'-scenario's vereenvoudigen door bestaande service-URL's te gebruiken in plaats van code te herschrijven om de Naming Service te gebruiken.
DNS-service wijst DNS-namen toe aan servicenamen, die op hun beurt worden omgezet door de Naamgevingsservice om het service-eindpunt te retourneren. De DNS-naam voor de service wordt opgegeven op het moment van maken. In het volgende diagram ziet u hoe de DNS-service werkt voor stateless services. Kortheid: in de diagrammen wordt slechts één eindpunt voor de services weergegeven, hoewel elke service meerdere eindpunten kan hebben.
Vanaf Service Fabric versie 6.3 is het DNS-protocol van Service Fabric uitgebreid met een schema voor het adresseren van gepartitioneerde stateful services. Deze extensies maken het mogelijk om specifieke IP-adressen van partities op te lossen met behulp van een combinatie van stateful service DNS-naam en de partitienaam. Alle drie de partitioneringsschema's worden ondersteund:
- Benoemde partitionering
- Gebereikte partitionering
- Singleton partitioneren
In het volgende diagram ziet u hoe de DNS-service werkt voor gepartitioneerde stateful services.
Raadpleeg de onderstaande sectie voor meer informatie over gepartitioneerde query's.
Besturingssysteemondersteuning
DNS-service wordt ondersteund op zowel Windows- als Linux-clusters, hoewel ondersteuning voor Linux momenteel beperkt is tot containerservices en niet kan worden ingeschakeld via Azure Portal. Windows ondersteunt echter alle servicetypen en implementatiemodellen.
DNS-service inschakelen
Notitie
Als u de DNS-service inschakelt, worden bepaalde DNS-instellingen op de knooppunten overschreven. Als u problemen ondervindt bij het maken van verbinding met internet, controleert u uw DNS-instellingen.
Nieuwe clusters
Clusters met ARM-sjablonen
Als u een nieuw cluster met ARM-sjablonen wilt implementeren, kunt u de voorbeeldsjablonen gebruiken of uw eigen sjablonen schrijven. Als dit nog niet is gebeurd, kan de DNS-service in de sjablonen worden ingeschakeld met behulp van de minimaal ondersteunde API-versies en door de juiste instellingen toe te voegen. Meer informatie over hoe u dit doet, kunt u hieronder bekijken in punten 1 en 2 van de genummerde lijst.
Clusters met Behulp van Azure Portal
Als u een standaardcluster in de portal maakt, wordt de DNS-service standaard ingeschakeld in de optie DNS-service opnemen in de sectie Functies toevoegen.
Als u een beheerd cluster in de portal maakt, wordt de DNS-service standaard ingeschakeld in de optie DNS-service onder de sectie Functies toevoegen.
Bestaande clusters
Als u een bestaand beheerd cluster bijwerkt om dns-service in te schakelen, kunt u dit doen vanuit de portal door naar de pagina Services voor invoegtoepassingen te gaan vanaf de clusterresourcepagina. Anders kunt u de DNS-service inschakelen met behulp van alternatieve methoden waarnaar hieronder wordt verwezen:
- Gebruik de ARM-sjabloon die is gebruikt om het cluster te implementeren, indien van toepassing.
- Navigeer naar het cluster in Azure Resource Explorer en werk de clusterresource bij, zoals u kunt zien in de onderstaande stappen (vanaf stap 2 en hoger).
- Navigeer naar het cluster in de portal en klik op Sjabloon exporteren. Zie De sjabloon exporteren uit de resourcegroep voor meer informatie.
Nadat u een sjabloon hebt, kunt u de DNS-service inschakelen met de volgende stappen:
Voor standaardclusters controleert u of de
apiVersion
resource is ingesteld op2017-07-01-preview
of laterMicrosoft.ServiceFabric/clusters
en, indien niet, werkt u deze bij, zoals wordt weergegeven in het volgende voorbeeld:{ "apiVersion": "2017-07-01-preview", "type": "Microsoft.ServiceFabric/clusters", "name": "[parameters('clusterName')]", "location": "[parameters('clusterLocation')]", ... }
Voor beheerde clusters controleert u of de
apiVersion
resource is ingesteld op2020-01-01-preview
of hogerMicrosoft.ServiceFabric/managedClusters
en, indien niet, werkt u deze bij zoals wordt weergegeven in het volgende voorbeeld:{ "apiVersion": "2020-01-01-preview", "type": "Microsoft.ServiceFabric/managedClusters", "name": "[parameters('clusterName')]", "location": "[parameters('clusterLocation')]", ... }
Schakel de DNS-service nu op een van de volgende manieren in:
Als u dns-service met standaardinstellingen wilt inschakelen, voegt u deze toe aan de
addonFeatures
sectie in deproperties
sectie, zoals wordt weergegeven in het volgende voorbeeld:"properties": { ... "addonFeatures": [ "DnsService" ], ... }
Als u de service wilt inschakelen met andere dan standaardinstellingen, voegt u een
DnsService
sectie toe aan defabricSettings
sectie in deproperties
sectie. In dit geval hoeft u de DnsService niet toe te voegen aanaddonFeatures
. Zie DNS-service-instellingen voor meer informatie over de eigenschappen die kunnen worden ingesteld voor de DNS-service."properties": { ... "fabricSettings": [ ... { "name": "DnsService", "parameters": [ { "name": "IsEnabled", "value": "true" }, { "name": "<key>", "value": "<value>" } ] }, ... ] }
Nadat u de clustersjabloon hebt bijgewerkt met uw wijzigingen, past u deze toe en laat u de upgrade voltooien. Wanneer de upgrade is voltooid, wordt de DNS-systeemservice uitgevoerd in uw cluster. De servicenaam is
fabric:/System/DnsService
en u vindt deze onder de sectie Systeemservice in Service Fabric Explorer.
Notitie
Bij het upgraden van DNS van uitgeschakeld naar ingeschakeld, geeft Service Fabric Explorer mogelijk niet de nieuwe status weer. U kunt dit oplossen door de knooppunten opnieuw op te starten door het upgradebeleid in uw sjabloon te wijzigen.
De DNS-naam voor uw service instellen
U kunt DNS-namen instellen voor uw services met ARM-sjablonen, met standaardservices in het ApplicationManifest.xml-bestand of met PowerShell-opdrachten.
De DNS-naam voor uw service kan overal in het cluster worden omgezet, dus het is belangrijk dat u de uniekheid van de DNS-naam in het cluster controleert.
Het wordt ten zeerste aanbevolen om een naamgevingsschema van <ServiceName>.<AppName>
bijvoorbeeld . service1.application1
Als een toepassing wordt geïmplementeerd met Behulp van Docker Compose, krijgen services automatisch DNS-namen toegewezen met behulp van dit naamgevingsschema.
De DNS-naam instellen met een ARM-sjabloon
Als u ARM-sjablonen gebruikt om uw services te implementeren, kunt u de serviceDnsName
eigenschap toevoegen aan de juiste sectie en er een waarde aan toewijzen. Hieronder ziet u voorbeelden:
Standaardclusters
Voor standaardclusters controleert u of de apiVersion
resource is ingesteld op 2019-11-01-preview
of later Microsoft.ServiceFabric/clusters/applications/services
en, indien niet, werkt u deze bij, zoals wordt weergegeven in het volgende voorbeeld:
{
"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')]"
}
}
Beheerde clusters
Voor beheerde clusters controleert u of de apiVersion
resource is ingesteld op 2022-10-01-preview
of hoger Microsoft.ServiceFabric/managedclusters/applications/services
en, indien niet, werkt u deze bij zoals wordt weergegeven in het volgende voorbeeld:
{
"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')]"
}
}
De DNS-naam voor een standaardservice instellen in de ApplicationManifest.xml
Open uw project in Visual Studio of uw favoriete editor en open het ApplicationManifest.xml-bestand. Ga naar de sectie Standaardservices en voeg voor elke service het ServiceDnsName
kenmerk toe. In het volgende voorbeeld ziet u hoe u de DNS-naam van de service instelt op stateless1.application1
<Service Name="Stateless1" ServiceDnsName="stateless1.application1">
<StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
In het volgende voorbeeld wordt de DNS-naam voor een stateful service ingesteld op stateful1.application1
. De service maakt gebruik van een benoemd partitioneringsschema. U ziet dat de partitienamen kleine letters bevatten. Dit is een vereiste voor partities die worden gericht op DNS-query's; Zie DNS-query's maken voor een stateful servicepartitie voor meer informatie.
<Service Name="Stateful1" ServiceDnsName="stateful1.application1" />
<StatefulService ServiceTypeName="Stateful1Type" TargetReplicaSetSize="2" MinReplicaSetSize="2">
<NamedPartition>
<Partition Name="partition1" />
<Partition Name="partition2" />
</NamedPartition>
</StatefulService>
</Service>
De DNS-naam voor een service instellen met PowerShell
U kunt de DNS-naam voor een service instellen wanneer u deze maakt met behulp van de New-ServiceFabricService
PowerShell-opdracht. In het volgende voorbeeld wordt een nieuwe stateless service gemaakt met de DNS-naam stateless1.application1
:
New-ServiceFabricService `
-Stateless `
-PartitionSchemeSingleton `
-ApplicationName fabric:/application1 `
-ServiceName fabric:/application1/stateless1 `
-ServiceTypeName Stateless1Type `
-InstanceCount 1 `
-ServiceDnsName stateless1.application1
U kunt ook een bestaande service bijwerken met behulp van de Update-ServiceFabricService
PowerShell-opdracht. In het volgende voorbeeld wordt een bestaande staatloze service bijgewerkt om de DNS-naam stateless1.application1
toe te voegen:
Update-ServiceFabricService `
-Stateless `
-ServiceName fabric:/application1/stateless1 `
-ServiceDnsName stateless1.application1
Controleer of een DNS-naam is ingesteld in Service Fabric Explorer
Zodra de service is geïmplementeerd met de DNS-naam, wordt in Service Fabric Explorer de DNS-naam voor de service weergegeven, zoals wordt weergegeven in de volgende afbeelding:
Notitie
Deze weergave kan verschillen, afhankelijk van de versie van Service Fabric Explorer die wordt gebruikt, maar het veld DNS-naam moet in een bepaalde vorm zichtbaar zijn op de servicepagina.
DNS-query's maken op een stateful servicepartitie
Vanaf Service Fabric versie 6.3 ondersteunt de DNS-service query's voor servicepartities. Als u ondersteuning voor gepartitioneerde servicequery's wilt inschakelen, moeten de DNS-service-instellingen worden bijgewerkt om de optie EnablePartitionedQuery
in te true
stellen op .
Voor partities die worden gebruikt in DNS-query's, zijn de volgende naamgevingsbeperkingen van toepassing:
- Partitienamen moeten dns-compatibel zijn.
- Partitienamen met meerdere labels, waaronder punt of punt, mogen niet worden gebruikt.
- Partitienamen moeten kleine letters bevatten.
DNS-query's die zijn gericht op een partitie, worden als volgt opgemaakt:
<First-Label-Of-Partitioned-Service-DNSName><PartitionPrefix><Target-Partition-Name><PartitionSuffix>.<Remaining-Partitioned-Service-DNSName>
Hierin:
- First-Label-Of-Partitioned-Service-DNSName is het eerste deel van de DNS-naam van uw service.
- PartitionPrefix is een waarde die kan worden ingesteld in de sectie DnsService van het clustermanifest of via de ARM-sjabloon van het cluster. De standaardwaarde is '--'. Zie DNS-service-instellingen voor meer informatie.
- Target-Partition-Name is de naam van de partitie.
- PartitionSuffix is een waarde die kan worden ingesteld in de sectie DnsService van het clustermanifest of via de ARM-sjabloon van het cluster. De standaardwaarde is een lege tekenreeks. Zie DNS-service-instellingen voor meer informatie.
- Resterend Gepartitioneerd-Service-DNSName is het resterende deel van de DNS-naam van uw service.
In de volgende voorbeelden ziet u DNS-query's voor gepartitioneerde services die worden uitgevoerd op een cluster met standaardinstellingen voor PartitionPrefix
en PartitionSuffix
:
- Als u partitie 0 van een service wilt oplossen met een DNS-naam
backendrangedschemesvc.application
die gebruikmaakt van een bereikpartitioneringsschema, gebruikt ubackendrangedschemesvc--0.application
. - Als u de partitie 'eerste' van een service wilt oplossen met een DNS-naam
backendnamedschemesvc.application
die gebruikmaakt van een benoemd partitioneringsschema, gebruikt ubackendnamedschemesvc--first.application
.
DNS-service retourneert het IP-adres van het eindpunt dat is gekoppeld aan de primaire replica van de partitie. Als er geen partitie is opgegeven, selecteert de DNS-service willekeurig een partitie.
DNS-namen gebruiken in uw services
Als u services met DNS-namen implementeert, kunt u het IP-adres van de weergegeven eindpunten vinden door te verwijzen naar de DNS-naam. DNS-service werkt voor stateless services en, in Service Fabric versie 6.3 en hoger, voor stateful services. Voor stateful services die worden uitgevoerd op versies van Service Fabric vóór 6.3, kunt u de ingebouwde omgekeerde proxyservice gebruiken voor HTTP-aanroepen om een bepaalde servicepartitie aan te roepen.
Dynamische poorten worden niet ondersteund door de DNS-service. U kunt de omgekeerde proxyservice gebruiken om services op te lossen die gebruikmaken van dynamische poorten.
De volgende code laat zien hoe u een stateless service aanroept via DNS. Het is gewoon een gewone HTTP-aanroep waarbij u de DNS-naam, de poort en een optioneel pad opgeeft als onderdeel van de 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;
}
}
De volgende code toont een aanroep van een specifieke partitie van een stateful service. In dit geval bevat de DNS-naam de partitienaam (partition1). Bij de aanroep wordt ervan uitgegaan dat een cluster met standaardwaarden voor PartitionPrefix
en 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;
}
}
Recursieve query's
Voor DNS-namen die de DNS-service niet zelfstandig kan omzetten (bijvoorbeeld een openbare DNS-naam), wordt de query doorgestuurd naar bestaande recursieve DNS-servers op de knooppunten.
Vóór Service Fabric 9.0 werden deze servers serieel opgevraagd totdat een antwoord werd ontvangen, met een vaste time-outperiode van 5 seconden tussendoor. Als een server niet binnen de time-outperiode heeft gereageerd, wordt er een query uitgevoerd op de volgende server (indien beschikbaar). In het geval dat deze DNS-servers problemen ondervinden, duurt het voltooien van DNS-query's langer dan 5 seconden, wat niet ideaal is.
Vanaf Service Fabric 9.0 is ondersteuning voor parallelle recursieve query's toegevoegd. Met parallelle query's kunnen alle recursieve DNS-servers tegelijk worden gecontacteerd, waarbij het eerste antwoord wint. Dit resulteert in snellere reacties in het eerder genoemde scenario. Deze optie is niet standaard ingeschakeld.
Gedetailleerde opties worden ook geïntroduceerd in Service Fabric 9.0 om het gedrag van de recursieve query's te beheren, waaronder de time-outperioden en querypogingen. Deze opties kunnen worden ingesteld in de DNS-service-instellingen:
- RecursiveQuerySerialMaxAttempts : het aantal seriële query's dat maximaal wordt geprobeerd. Als dit aantal hoger is dan het aantal doorstuurservers van DNS-servers, wordt het uitvoeren van query's gestopt zodra alle servers precies één keer zijn geprobeerd.
- RecursiveQuerySerialTimeout : de time-outwaarde in seconden voor elke geprobeerde seriële query.
- RecursiveQueryParallelMaxAttempts : het aantal keren dat parallelle query's worden uitgevoerd. Parallelle query's worden uitgevoerd nadat de maximumpogingen voor seriële query's zijn uitgeput.
- RecursiveQueryParallelTimeout : de time-outwaarde in seconden voor elke geprobeerde parallelle query.
Beperkingen en bekende problemen
- Dynamische poorten worden niet ondersteund door de DNS-service. Als u services wilt oplossen die beschikbaar zijn op dynamische poorten, gebruikt u de omgekeerde proxyservice.
- Ondersteuning voor Linux is momenteel beperkt tot services in containers. Op processen gebaseerde services op Linux kunnen momenteel geen DNS-service gebruiken.
- DNS-service voor Linux-clusters kan niet worden ingeschakeld via Azure Portal.
- Als een DNS-naam voor een service wordt gewijzigd, zijn de naamupdates mogelijk niet direct zichtbaar in sommige scenario's. Om het probleem op te lossen, moeten DNS-service-exemplaren opnieuw worden opgestart in het cluster.
Volgende stappen
Meer informatie over servicecommunicatie in het cluster met verbinding maken en communiceren met services