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 services in containers, kunnen worden adresseerd 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 dus EINDPUNT-IP-adressen omzetten. Dergelijke functionaliteit behoudt de draagbaarheid van containerservices op verschillende platforms en kan lift-and-shift-scenario's eenvoudiger maken door bestaande service-URL's te gebruiken in plaats van code te herschrijven voor het gebruik van de naamgevingsservice.
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. Kortheidshalve tonen de diagrammen slechts één eindpunt voor de services, hoewel elke service meerdere eindpunten kan hebben.
Vanaf Service Fabric versie 6.3 is het SERVICE Fabric DNS-protocol uitgebreid met een schema voor het aanpakken van gepartitioneerde stateful services. Deze extensies maken het mogelijk om specifieke partitie-IP-adressen om te zetten met behulp van een combinatie van stateful service DNS-naam en de partitienaam. Alle drie de partitioneringsschema's worden ondersteund:
- Benoemde partitionering
- Bereikpartitionering
- 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.
Ondersteuning van het besturingssysteem
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 sommige 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 worden ingeschakeld in de sjablonen door de minimaal ondersteunde API-versies te gebruiken en door de juiste instellingen toe te voegen. Details over hoe u dit kunt doen, vindt u hieronder in de punten 1 en 2 van de genummerde lijst.
Clusters met 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, is 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 de DNS-service in te schakelen, kunt u dit doen vanuit de portal door naar de pagina Invoegtoepassingsservices te gaan op de pagina clusterresource. 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 te zien is 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 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
is ingesteld op2017-07-01-preview
of hoger voor deMicrosoft.ServiceFabric/clusters
resource en werkt u deze bij zoals in het volgende voorbeeld wordt weergegeven:{ "apiVersion": "2017-07-01-preview", "type": "Microsoft.ServiceFabric/clusters", "name": "[parameters('clusterName')]", "location": "[parameters('clusterLocation')]", ... }
Voor beheerde clusters controleert u of de
apiVersion
is ingesteld op2020-01-01-preview
of hoger voor deMicrosoft.ServiceFabric/managedClusters
resource en werkt u deze bij zoals in het volgende voorbeeld wordt weergegeven:{ "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 de 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 met andere dan standaardinstellingen wilt inschakelen, 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>" } ] }, ... ] }
Zodra 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 in 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 voor uw services instellen met ARM-sjablonen, met standaardservices in het ApplicationManifest.xml-bestand of met PowerShell-opdrachten.
De DNS-naam voor uw service kan worden omgezet in het hele cluster, dus het is belangrijk om ervoor te zorgen dat de DNS-naam uniek is in het hele cluster.
Het wordt ten zeerste aanbevolen om een naamgevingsschema van te gebruiken, <ServiceName>.<AppName>
service1.application1
bijvoorbeeld . Als een toepassing wordt geïmplementeerd met Docker Compose, worden aan services automatisch DNS-namen toegewezen met behulp van dit naamgevingsschema.
De DNS-naam instellen met 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. Voorbeelden zijn hieronder te zien:
Standaardclusters
Voor standaardclusters controleert u of de apiVersion
is ingesteld op 2019-11-01-preview
of hoger voor de Microsoft.ServiceFabric/clusters/applications/services
resource en werkt u deze bij zoals in het volgende voorbeeld wordt weergegeven:
{
"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
is ingesteld op 2022-10-01-preview
of hoger voor de Microsoft.ServiceFabric/managedclusters/applications/services
resource en werkt u deze bij zoals in het volgende voorbeeld wordt weergegeven:
{
"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 bestand ApplicationManifest.xml. 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 zijn. Dit is een vereiste voor partities die worden gericht in DNS-query's; Zie DNS-query's maken op 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 staatloze 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 Service Fabric Explorer de DNS-naam voor de service weergegeven, zoals wordt weergegeven in de volgende afbeelding:
Notitie
Deze weergave kan afwijken, afhankelijk van de versie van Service Fabric Explorer 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 wilt inschakelen voor gepartitioneerde servicequery's, moeten de DNS-service-instellingen worden bijgewerkt om de optie EnablePartitionedQuery
in te stellen op true
.
Voor partities die worden gebruikt in DNS-query's, gelden de volgende naamgevingsbeperkingen:
- Partitienamen moeten DNS-compatibel zijn.
- Namen van partities met meerdere labels, inclusief punt of '.' mogen niet worden gebruikt.
- Partitienamen moeten kleine letters bevatten.
DNS-query's die zijn gericht op een partitie, worden als volgt geformatteerd:
<First-Label-Of-Partitioned-Service-DNSName><PartitionPrefix><Target-Partition-Name><PartitionSuffix>.<Remaining-Partitioned-Service-DNSName>
Waar:
- 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.
- Remaining-Partitioned-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 de partitie '0' van een service met een DNS-naam
backendrangedschemesvc.application
wilt oplossen die gebruikmaakt van een bereikpartitioneringsschema, gebruikt ubackendrangedschemesvc--0.application
. - Als u de partitie 'first' wilt oplossen van een service met een DNS-naam
backendnamedschemesvc.application
die gebruikmaakt van een benoemd partitioneringsschema, gebruikt ubackendnamedschemesvc--first.application
.
De 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 blootgestelde eindpunten vinden door te verwijzen naar de DNS-naam. DE 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 ouder dan 6.3, kunt u de ingebouwde omgekeerde proxyservice voor HTTP-aanroepen gebruiken 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 staatloze 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 op een specifieke partitie van een stateful service. In dit geval bevat de DNS-naam de partitienaam (partition1). De aanroep gaat uit van 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 er een antwoord werd ontvangen, met een vaste time-outperiode van 5 seconden ertussen. 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 benaderd, waarbij het eerste antwoord wint. Dit resulteert in snellere reacties in het eerder genoemde scenario. Deze optie is niet standaard ingeschakeld.
In Service Fabric 9.0 worden ook gedetailleerde opties geïntroduceerd om het gedrag van de recursieve query's te beheren, inclusief 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 doorstuur-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 poging tot seriële query.
- RecursiveQueryParallelMaxAttempts : het aantal keren dat parallelle query's worden uitgevoerd. Parallelle query's worden uitgevoerd nadat het maximum aantal pogingen voor seriële query's is uitgeput.
- RecursiveQueryParallelTimeout : de time-outwaarde in seconden voor elke 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 containerservices. Op proces 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 wordt gewijzigd voor een service, zijn de naamupdates in sommige scenario's mogelijk niet direct zichtbaar. Om het probleem op te lossen, moeten DNS-service-exemplaren opnieuw worden opgestart in het hele cluster.
Volgende stappen
Meer informatie over servicecommunicatie binnen het cluster met verbinding maken en communiceren met services