DNS-tjänst i Azure Service Fabric
DNS-tjänsten är en valfri systemtjänst som du kan aktivera i klustret för att identifiera andra tjänster med hjälp av DNS-protokollet.
Många tjänster, särskilt containerbaserade tjänster, kan adresseras via en befintlig URL. Det är önskvärt att kunna lösa dessa tjänster med hjälp av standard-DNS-protokollet i stället för Service Fabric Naming Service-protokollet. Med DNS-tjänsten kan du mappa DNS-namn till ett tjänstnamn och därmed matcha slutpunkts-IP-adresser. Sådana funktioner upprätthåller portabiliteten för containerbaserade tjänster på olika plattformar och kan göra "lift and shift"-scenarier enklare genom att du kan använda befintliga tjänst-URL:er i stället för att skriva om kod för att använda namngivningstjänsten.
DNS-tjänsten mappar DNS-namn till tjänstnamn, som i sin tur matchas av namngivningstjänsten för att returnera tjänstslutpunkten. DNS-namnet för tjänsten tillhandahålls när den skapas. Följande diagram visar hur DNS-tjänsten fungerar för tillståndslösa tjänster. Diagrammen visar bara en slutpunkt för tjänsterna, även om varje tjänst kan ha flera slutpunkter.
Från och med Service Fabric version 6.3 har Service Fabric DNS-protokollet utökats till att omfatta ett schema för att hantera partitionerade tillståndskänsliga tjänster. Dessa tillägg gör det möjligt att lösa specifika IP-adresser för partitioner med hjälp av en kombination av tillståndskänsligt DNS-namn för tjänsten och partitionsnamnet. Alla tre partitioneringsscheman stöds:
- Namngiven partitionering
- Intervallpartitionering
- Singleton-partitionering
Följande diagram visar hur DNS-tjänsten fungerar för partitionerade tillståndskänsliga tjänster.
Mer information om partitionerade frågor finns i avsnittet nedan.
Os-stöd
DNS-tjänsten stöds i både Windows- och Linux-kluster, men stödet för Linux är för närvarande begränsat till containerbaserade tjänster och kan inte aktiveras via Azure-portalen. Windows stöder dock alla tjänsttyper och distributionsmodeller.
Aktivera DNS-tjänst
Kommentar
Om du aktiverar DNS-tjänsten åsidosätts vissa DNS-inställningar på noderna. Om du har problem med att ansluta till Internet kontrollerar du DNS-inställningarna.
Nya kluster
Kluster med ARM-mallar
Om du vill distribuera ett nytt kluster med ARM-mallar kan du antingen använda exempelmallarna eller skriva egna. Om det inte redan är gjort kan DNS-tjänsten aktiveras i mallarna med hjälp av de lägsta API-versionerna som stöds och genom att lägga till lämpliga inställningar. Information om hur du gör detta finns nedan i punkterna 1 och 2 i den numrerade listan.
Kluster med Hjälp av Azure-portalen
Om du skapar ett standardkluster i portalen är DNS-tjänsten aktiverad som standard i alternativet Inkludera DNS-tjänst under avsnittet Lägg till funktioner .
Om du skapar ett hanterat kluster i portalen är DNS-tjänsten aktiverad som standard i dns-tjänstalternativet under avsnittet Lägg till funktioner.
Befintliga kluster
Om du uppdaterar ett befintligt hanterat kluster för att aktivera DNS-tjänsten kan du göra det från portalen genom att gå till sidan Tilläggstjänster från klusterresurssidan. Annars kan du aktivera DNS-tjänsten med hjälp av alternativa metoder som refereras nedan:
- Använd ARM-mallen som användes för att distribuera klustret, om tillämpligt.
- Gå till klustret i Azure Resource Explorer och uppdatera klusterresursen enligt stegen nedan (från steg 2 och senare).
- Gå till klustret på portalen och klicka på Exportera mall. Mer information finns i Exportera mallen från resursgruppen.
När du har en mall kan du aktivera DNS-tjänsten med följande steg:
För standardkluster kontrollerar du att
apiVersion
är inställt på2017-07-01-preview
eller senare för resursenMicrosoft.ServiceFabric/clusters
, och om inte uppdaterar du den enligt följande exempel:{ "apiVersion": "2017-07-01-preview", "type": "Microsoft.ServiceFabric/clusters", "name": "[parameters('clusterName')]", "location": "[parameters('clusterLocation')]", ... }
För hanterade kluster kontrollerar du att
apiVersion
är inställt2020-01-01-preview
på eller senare för resursenMicrosoft.ServiceFabric/managedClusters
, och om inte uppdaterar du den enligt följande exempel:{ "apiVersion": "2020-01-01-preview", "type": "Microsoft.ServiceFabric/managedClusters", "name": "[parameters('clusterName')]", "location": "[parameters('clusterLocation')]", ... }
Aktivera nu DNS-tjänsten på något av följande sätt:
Om du vill aktivera DNS-tjänsten med standardinställningar lägger du till den i
addonFeatures
avsnittet iproperties
avsnittet enligt följande exempel:"properties": { ... "addonFeatures": [ "DnsService" ], ... }
Om du vill aktivera tjänsten med andra inställningar än standardinställningar lägger du till ett
DnsService
avsnitt ifabricSettings
avsnittet iproperties
avsnittet. I det här fallet behöver du inte lägga till DnsService iaddonFeatures
. Mer information om de egenskaper som kan anges för DNS-tjänsten finns i DNS-tjänstinställningar."properties": { ... "fabricSettings": [ ... { "name": "DnsService", "parameters": [ { "name": "IsEnabled", "value": "true" }, { "name": "<key>", "value": "<value>" } ] }, ... ] }
När du har uppdaterat klustermallen med dina ändringar använder du dem och låter uppgraderingen slutföras. När uppgraderingen är klar börjar DNS-systemtjänsten köras i klustret. Tjänstnamnet är
fabric:/System/DnsService
, och du hittar det under avsnittet Systemtjänst i Service Fabric Explorer.
Kommentar
När du uppgraderar DNS från inaktiverad till aktiverad kanske Service Fabric Explorer inte återspeglar det nya tillståndet. Lös problemet genom att starta om noderna genom att ändra uppgraderingsprincipen i mallen.
Ange DNS-namnet för din tjänst
Du kan ange DNS-namn för dina tjänster med ARM-mallar, med standardtjänster i ApplicationManifest.xml-filen eller med PowerShell-kommandon.
DNS-namnet för din tjänst kan matchas i hela klustret, så det är viktigt att se till att DNS-namnet är unikt i klustret.
Vi rekommenderar starkt att du använder ett namngivningsschema med <ServiceName>.<AppName>
, till exempel service1.application1
. Om ett program distribueras med Docker Compose tilldelas tjänsterna automatiskt DNS-namn med hjälp av det här namngivningsschemat.
Ange DNS-namnet med ARM-mallen
Om du använder ARM-mallar för att distribuera dina tjänster kan du lägga till serviceDnsName
egenskapen i lämpligt avsnitt och tilldela ett värde till den. Nedan visas exempel:
Standardkluster
För standardkluster kontrollerar du att apiVersion
är inställt på 2019-11-01-preview
eller senare för resursen Microsoft.ServiceFabric/clusters/applications/services
, och om inte uppdaterar du den enligt följande exempel:
{
"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')]"
}
}
Hanterade kluster
För hanterade kluster kontrollerar du att apiVersion
är inställt 2022-10-01-preview
på eller senare för resursen Microsoft.ServiceFabric/managedclusters/applications/services
, och om inte uppdaterar du den enligt följande exempel:
{
"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')]"
}
}
Ange DNS-namnet för en standardtjänst i ApplicationManifest.xml
Öppna projektet i Visual Studio eller din favoritredigerare och öppna filen ApplicationManifest.xml. Gå till avsnittet standardtjänster och lägg till ServiceDnsName
attributet för varje tjänst. I följande exempel visas hur du anger DNS-namnet för tjänsten till stateless1.application1
<Service Name="Stateless1" ServiceDnsName="stateless1.application1">
<StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
I följande exempel anges DNS-namnet för en tillståndskänslig tjänst till stateful1.application1
. Tjänsten använder ett namngivet partitioneringsschema. Observera att partitionsnamnen är gemener. Detta är ett krav för partitioner som ska riktas i DNS-frågor. Mer information finns i Skapa DNS-frågor på en tillståndskänslig tjänstpartition.
<Service Name="Stateful1" ServiceDnsName="stateful1.application1" />
<StatefulService ServiceTypeName="Stateful1Type" TargetReplicaSetSize="2" MinReplicaSetSize="2">
<NamedPartition>
<Partition Name="partition1" />
<Partition Name="partition2" />
</NamedPartition>
</StatefulService>
</Service>
Ange DNS-namnet för en tjänst med PowerShell
Du kan ange DNS-namnet för en tjänst när du skapar den med hjälp New-ServiceFabricService
av PowerShell-kommandot. I följande exempel skapas en ny tillståndslös tjänst med DNS-namnet stateless1.application1
:
New-ServiceFabricService `
-Stateless `
-PartitionSchemeSingleton `
-ApplicationName fabric:/application1 `
-ServiceName fabric:/application1/stateless1 `
-ServiceTypeName Stateless1Type `
-InstanceCount 1 `
-ServiceDnsName stateless1.application1
Du kan också uppdatera en befintlig tjänst med hjälp Update-ServiceFabricService
av PowerShell-kommandot. I följande exempel uppdateras en befintlig tillståndslös tjänst för att lägga till DNS-namnet stateless1.application1
:
Update-ServiceFabricService `
-Stateless `
-ServiceName fabric:/application1/stateless1 `
-ServiceDnsName stateless1.application1
Kontrollera att ett DNS-namn har angetts i Service Fabric Explorer
När tjänsten har distribuerats med DNS-namnet visar Service Fabric Explorer DNS-namnet för tjänsten, enligt följande bild:
Kommentar
Den här vyn kan skilja sig beroende på vilken version av Service Fabric Explorer som används, men DNS-namnfältet bör vara synligt i något formulär på tjänstsidan.
Göra DNS-frågor på en tillståndskänslig tjänstpartition
Från och med Service Fabric version 6.3 stöder DNS-tjänsten frågor för tjänstpartitioner. Om du vill aktivera stöd för partitionerade tjänstfrågor måste DNS-tjänstinställningarna uppdateras för att ange alternativet EnablePartitionedQuery
till true
.
För partitioner som ska användas i DNS-frågor gäller följande namngivningsbegränsningar:
- Partitionsnamnen ska vara DNS-kompatibla.
- Partitionsnamn med flera etiketter, inklusive punkt eller ., bör inte användas.
- Partitionsnamn bör vara gemener.
DNS-frågor som riktar sig mot en partition formateras på följande sätt:
<First-Label-Of-Partitioned-Service-DNSName><PartitionPrefix><Target-Partition-Name><PartitionSuffix>.<Remaining-Partitioned-Service-DNSName>
Där:
- First-Label-Of-Partitioned-Service-DNSName är den första delen av tjänstens DNS-namn.
- PartitionPrefix är ett värde som kan anges i avsnittet DnsService i klustermanifestet eller via klustrets ARM-mall. Standardvärdet är "--". Mer information finns i DNS-tjänstinställningar.
- Target-Partition-Name är namnet på partitionen.
- PartitionSuffix är ett värde som kan anges i avsnittet DnsService i klustermanifestet eller via klustrets ARM-mall. Standardvärdet är tom sträng. Mer information finns i DNS-tjänstinställningar.
- Remaining-Partitioned-Service-DNSName är den återstående delen av tjänstens DNS-namn.
I följande exempel visas DNS-frågor för partitionerade tjänster som körs i ett kluster som har standardinställningar för PartitionPrefix
och PartitionSuffix
:
- Om du vill lösa partitionen "0" för en tjänst med DNS-namn
backendrangedschemesvc.application
som använder ett intervallpartitioneringsschema använder dubackendrangedschemesvc--0.application
. - Om du vill lösa partitionen "först" för en tjänst med DNS-namn
backendnamedschemesvc.application
som använder ett namngivet partitioneringsschema använder dubackendnamedschemesvc--first.application
.
DNS-tjänsten returnerar IP-adressen för slutpunkten som är associerad med partitionens primära replik. Om ingen partition anges väljer DNS-tjänsten slumpmässigt en partition.
Använda DNS-namn i dina tjänster
Om du distribuerar tjänster med DNS-namn kan du hitta IP-adressen för de exponerade slutpunkterna genom att referera till DNS-namnet. DNS-tjänsten fungerar för tillståndslösa tjänster och i Service Fabric version 6.3 och senare för tillståndskänsliga tjänster. För tillståndskänsliga tjänster som körs på versioner av Service Fabric före 6.3 kan du använda den inbyggda omvända proxytjänsten för HTTP-anrop för att anropa en viss tjänstpartition.
Dynamiska portar stöds inte av DNS-tjänsten. Du kan använda tjänsten omvänd proxy för att lösa tjänster som använder dynamiska portar.
Följande kod visar hur du anropar en tillståndslös tjänst via DNS. Det är helt enkelt ett vanligt HTTP-anrop där du anger DNS-namnet, porten och valfri sökväg som en del av URL:en.
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;
}
}
Följande kod visar ett anrop på en specifik partition av en tillståndskänslig tjänst. I det här fallet innehåller DNS-namnet partitionsnamnet (partition1). Anropet förutsätter ett kluster med standardvärden för PartitionPrefix
och 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;
}
}
Rekursiva frågor
För DNS-namn som DNS-tjänsten inte kan matcha på egen hand (till exempel ett offentligt DNS-namn) vidarebefordras frågan till befintliga rekursiva DNS-servrar på noderna.
Före Service Fabric 9.0 efterfrågades dessa servrar seriellt tills ett svar togs emot, med en fast tidsgräns på 5 sekunder däremellan. Om en server inte svarade inom tidsgränsen skulle nästa server (om tillgänglig) frågas. Om dessa DNS-servrar stöter på problem skulle det ta längre tid än 5 sekunder att slutföra DNS-frågor, vilket inte är idealiskt.
Från och med Service Fabric 9.0 har stöd för parallella rekursiva frågor lagts till. Med parallella frågor kan alla rekursiva DNS-servrar kontaktas samtidigt, där det första svaret vinner. Detta resulterar i snabbare svar i det scenario som tidigare nämnts. Det här alternativet är inte aktiverat som standard.
Detaljerade alternativ introduceras också i Service Fabric 9.0 för att styra beteendet för rekursiva frågor, inklusive tidsgränsperioder och frågeförsök. Dessa alternativ kan anges i DNS-tjänstinställningarna:
- RecursiveQuerySerialMaxAttempts – högst antalet seriefrågor som ska försökas. Om det här antalet är högre än antalet vidarebefordrande DNS-servrar stoppas frågan när alla servrar har försökt utföras exakt en gång.
- RecursiveQuerySerialTimeout – timeout-värdet i sekunder för varje seriell fråga.
- RecursiveQueryParallelMaxAttempts – Antalet gånger parallella frågor kommer att försökas. Parallella frågor körs när de maximala försöken för seriefrågor har uttömts.
- RecursiveQueryParallelTimeout – tidsgränsvärdet i sekunder för varje försök till parallell fråga.
Begränsningar och kända problem
- Dynamiska portar stöds inte av DNS-tjänsten. Om du vill lösa tjänster som exponeras på dynamiska portar använder du tjänsten omvänd proxy.
- Stöd för Linux är för närvarande begränsat till containerbaserade tjänster. Processbaserade tjänster i Linux kan för närvarande inte använda DNS-tjänsten.
- DNS-tjänsten för Linux-kluster kan inte aktiveras via Azure-portalen.
- Om ett DNS-namn ändras för en tjänst kanske namnuppdateringarna inte visas omedelbart i vissa scenarier. För att lösa problemet bör DNS-tjänstinstanser startas om i klustret.
Nästa steg
Läs mer om tjänstkommunikation i klustret med anslutning och kommunikation med tjänster