Partilhar via


Serviço DNS no Azure Service Fabric

O serviço DNS é um serviço de sistema opcional que você pode habilitar em seu cluster para descobrir outros serviços usando o protocolo DNS.

Muitos serviços, especialmente serviços em contêineres, são endereçáveis por meio de uma URL pré-existente. Ser capaz de resolver esses serviços usando o protocolo DNS padrão, em vez do protocolo Service Fabric Naming Service, é desejável. O serviço DNS permite mapear nomes DNS para um nome de serviço e, portanto, resolver endereços IP de ponto final. Essa funcionalidade mantém a portabilidade de serviços em contêineres em diferentes plataformas e pode facilitar os cenários de "lift and shift", permitindo que você use URLs de serviço existentes em vez de reescrever o código para usar o Serviço de Nomenclatura.

O serviço DNS mapeia nomes DNS para nomes de serviço, que por sua vez são resolvidos pelo Serviço de Nomenclatura para retornar o ponto de extremidade do serviço. O nome DNS para o serviço é fornecido no momento da criação. O diagrama a seguir mostra como o serviço DNS funciona para serviços sem monitoração de estado. Para maior brevidade, os diagramas mostram apenas um ponto de extremidade para os serviços, embora cada serviço possa ter vários pontos de extremidade.

Diagrama mostrando como os nomes DNS são mapeados para nomes de serviço pelo serviço DNS para serviços sem monitoração de estado.

A partir da versão 6.3 do Service Fabric, o protocolo DNS do Service Fabric foi estendido para incluir um esquema de endereçamento de serviços com estado particionados. Essas extensões tornam possível resolver endereços IP de partição específicos usando uma combinação de nome DNS de serviço stateful e o nome da partição. Todos os três esquemas de particionamento são suportados:

  • Particionamento nomeado
  • Particionamento variado
  • Particionamento singleton

O diagrama a seguir mostra como o serviço DNS funciona para serviços com monitoração de estado particionados.

Diagrama mostrando como os nomes DNS são mapeados para nomes de serviço pelo serviço DNS para serviços com monitoração de estado particionados.

Para obter mais informações sobre consultas particionadas, consulte a seção abaixo.

Suporte a SO

O serviço DNS tem suporte em clusters Windows e Linux, embora o suporte para Linux esteja atualmente limitado a serviços em contêineres e não possa ser habilitado por meio do portal do Azure. O Windows, no entanto, oferece suporte a todos os tipos de serviço e modelos de implantação.

Ativando o serviço DNS

Nota

Habilitar o serviço DNS substituirá algumas configurações de DNS nos nós. Se tiver problemas de ligação à Internet, verifique as definições de DNS.

Novos clusters

Clusters usando modelos ARM

Para implantar um novo cluster com modelos ARM, você pode usar os modelos de exemplo ou escrever os seus próprios. Se ainda não tiver sido feito, o serviço DNS pode ser habilitado nos modelos usando as versões mínimas de API suportadas e adicionando as configurações apropriadas. Os pormenores sobre a forma de o fazer podem ser vistos abaixo nos pontos 1 e 2 da lista numerada.

Clusters usando o portal do Azure

Se você estiver criando um cluster padrão no portal, o serviço DNS será habilitado por padrão na opção Incluir serviço DNS na seção Adicionar recursos .

Captura de ecrã a mostrar a ativação do serviço DNS para um cluster padrão através do portal.

Se você estiver criando um cluster gerenciado no portal, o serviço DNS será habilitado por padrão na opção de serviço DNS na seção Adicionar recursos .

Captura de ecrã a mostrar a ativação do serviço DNS para um cluster gerido através do portal.

Clusters existentes

Se estiver a atualizar um cluster gerido existente para ativar o serviço DNS, pode fazê-lo a partir do portal visitando a página Serviços complementares a partir da página de recursos do cluster. Caso contrário, você pode habilitar o serviço DNS usando métodos alternativos que são referenciados abaixo:

  • Use o modelo ARM que foi usado para implantar o cluster, se aplicável.
  • Navegue até o cluster no Gerenciador de Recursos do Azure e atualize o recurso de cluster, conforme visto nas etapas abaixo (da etapa 2 em diante).
  • Navegue até o cluster no portal e clique em Exportar modelo. Para saber mais, consulte Exportar o modelo do grupo de recursos.

Depois de ter um modelo, você pode habilitar o serviço DNS com as seguintes etapas:

  1. Para clusters padrão, verifique se o apiVersion está definido como 2017-07-01-preview ou posterior para o Microsoft.ServiceFabric/clusters recurso e, se não, atualize-o conforme mostrado no exemplo a seguir:

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

    Para clusters gerenciados, verifique se o apiVersion está definido como 2020-01-01-preview ou posterior para o Microsoft.ServiceFabric/managedClusters recurso e, se não, atualize-o conforme mostrado no exemplo a seguir:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. Agora habilite o serviço DNS de uma das seguintes maneiras:

    • Para habilitar o serviço DNS com configurações padrão, adicione-o addonFeatures à seção dentro da properties seção como mostrado no exemplo a seguir:

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • Para habilitar o serviço com configurações diferentes das padrão, adicione uma DnsService seção à fabricSettings seção dentro da properties seção. Nesse caso, não é necessário adicionar o DnsService ao addonFeatures. Para saber mais sobre as propriedades que podem ser definidas para o serviço DNS, consulte Configurações do serviço DNS.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. Depois de atualizar o modelo de cluster com suas alterações, aplique-as e deixe a atualização ser concluída. Quando a atualização for concluída, o serviço do sistema DNS começará a ser executado no cluster. O nome do serviço é fabric:/System/DnsService, e você pode encontrá-lo na seção Serviço do sistema no Gerenciador do Service Fabric.

Nota

Ao atualizar o DNS de desabilitado para habilitado, o Service Fabric Explorer pode não refletir o novo estado. Para resolver, reinicie os nós modificando a política de atualização em seu modelo.

Definir o nome DNS para o seu serviço

Você pode definir nomes DNS para seus serviços com modelos ARM, com serviços padrão no arquivo ApplicationManifest.xml ou com comandos do PowerShell.

O nome DNS do seu serviço pode ser resolvido em todo o cluster, por isso é importante garantir a exclusividade do nome DNS no cluster.

É altamente recomendável que você use um esquema de nomenclatura de <ServiceName>.<AppName>, por exemplo, service1.application1. Se um aplicativo for implantado usando a composição do Docker, os serviços receberão automaticamente nomes DNS usando esse esquema de nomenclatura.

Definindo o nome DNS com o modelo ARM

Se você estiver usando modelos ARM para implantar seus serviços, poderá adicionar a serviceDnsName propriedade à seção apropriada e atribuir um valor a ela. Exemplos podem ser vistos abaixo:

Clusters padrão

Para clusters padrão, verifique se o apiVersion está definido como 2019-11-01-preview ou posterior para o Microsoft.ServiceFabric/clusters/applications/services recurso e, se não, atualize-o conforme mostrado no exemplo a seguir:

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

Clusters gerenciados

Para clusters gerenciados, verifique se o apiVersion está definido como 2022-10-01-preview ou posterior para o Microsoft.ServiceFabric/managedclusters/applications/services recurso e, se não, atualize-o conforme mostrado no exemplo a seguir:

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

Definindo o nome DNS para um serviço padrão no ApplicationManifest.xml

Abra seu projeto no Visual Studio, ou seu editor favorito, e abra o arquivo ApplicationManifest.xml. Vá para a seção de serviços padrão e, para cada serviço, adicione o ServiceDnsName atributo. O exemplo a seguir mostra como definir o nome DNS do serviço como stateless1.application1

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

O exemplo a seguir define o nome DNS de um serviço com monitoração de estado como stateful1.application1. O serviço usa um esquema de particionamento nomeado. Observe que os nomes das partições são minúsculos. Este é um requisito para partições que serão direcionadas em consultas DNS; para obter mais informações, consulte Fazendo consultas DNS em uma partição de serviço com monitoração de estado.

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

Definindo o nome DNS para um serviço com o PowerShell

Você pode definir o nome DNS para um serviço ao criá-lo usando o New-ServiceFabricService comando PowerShell. O exemplo a seguir cria um novo serviço sem estado com o nome stateless1.application1DNS :

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

Você também pode atualizar um serviço existente usando o Update-ServiceFabricService comando PowerShell. O exemplo a seguir atualiza um serviço sem estado existente para adicionar o nome stateless1.application1DNS :

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

Verifique se um nome DNS está definido no Service Fabric Explorer

Depois que o serviço for implantado com o nome DNS, o Service Fabric Explorer mostrará o nome DNS do serviço, conforme mostrado na figura a seguir:

Captura de ecrã do nome DNS no Service Fabric Explorer.

Nota

Essa exibição pode ser diferente dependendo da versão do Service Fabric Explorer usada, no entanto, o campo Nome DNS deve estar visível de alguma forma na página de serviço.

Fazendo consultas DNS em uma partição de serviço com monitoração de estado

A partir da versão 6.3 do Service Fabric, o serviço DNS suporta consultas para partições de serviço. Para habilitar o suporte para consultas de serviço particionadas, as configurações do serviço DNS devem ser atualizadas para definir a opção EnablePartitionedQuery como true.

Para partições que serão usadas em consultas DNS, aplicam-se as seguintes restrições de nomenclatura:

  • Os nomes de partição devem ser compatíveis com DNS.
  • Não devem ser utilizados nomes de partições com rótulos múltiplos, incluindo ponto ou '.'
  • Os nomes das partições devem ser minúsculos.

As consultas DNS destinadas a uma partição são formatadas da seguinte forma:

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

Em que:

  • First-Label-Of-Partitioned-Service-DNSName é a primeira parte do nome DNS do seu serviço.
  • PartitionPrefix é um valor que pode ser definido na seção DnsService do manifesto do cluster ou por meio do modelo ARM do cluster. O valor padrão é "--". Para saber mais, consulte Configurações do serviço DNS.
  • Target-Partition-Name é o nome da partição.
  • PartitionSuffix é um valor que pode ser definido na seção DnsService do manifesto do cluster ou por meio do modelo ARM do cluster. O valor padrão é cadeia de caracteres vazia. Para saber mais, consulte Configurações do serviço DNS.
  • Remaining-Partitioned-Service-DNSName é a parte restante do nome DNS do seu serviço.

Os exemplos a seguir mostram consultas DNS para serviços particionados em execução em um cluster que tem configurações padrão para PartitionPrefix e PartitionSuffix:

  • Para resolver a partição "0" de um serviço com nome backendrangedschemesvc.application DNS que usa um esquema de particionamento variado, use backendrangedschemesvc--0.application.
  • Para resolver a partição "primeiro" de um serviço com nome backendnamedschemesvc.application DNS que usa um esquema de particionamento nomeado, use backendnamedschemesvc--first.application.

O serviço DNS retorna o endereço IP do ponto de extremidade associado à réplica primária da partição. Se nenhuma partição for especificada, o serviço DNS selecionará aleatoriamente uma partição.

Utilizar nomes DNS nos seus serviços

Se você implantar serviços com nomes DNS, poderá encontrar o endereço IP dos pontos de extremidade expostos fazendo referência ao nome DNS. O serviço DNS funciona para serviços sem estado e, no Service Fabric versão 6.3 e posterior, para serviços com monitoração de estado. Para serviços com monitoração de estado executados em versões do Service Fabric anteriores à 6.3, você pode usar o serviço de proxy reverso interno para chamadas HTTP para chamar uma partição de serviço específica.

As portas dinâmicas não são suportadas pelo serviço DNS. Você pode usar o serviço de proxy reverso para resolver serviços que usam portas dinâmicas.

O código a seguir mostra como chamar um serviço sem estado por meio do DNS. É simplesmente uma chamada HTTP regular onde você fornece o nome DNS, a porta e qualquer caminho opcional como parte da 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;
    }
}

O código a seguir mostra uma chamada em uma partição específica de um serviço com monitoração de estado. Neste caso, o nome DNS contém o nome da partição (partition1). A chamada assume um cluster com valores padrão para PartitionPrefix e 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;
    }
}

Consultas recursivas

Para nomes DNS que o serviço DNS não pode resolver sozinho (por exemplo, um nome DNS público), ele encaminhará a consulta para servidores DNS recursivos pré-existentes nos nós.

Diagrama mostrando como as consultas DNS para nomes públicos são resolvidas.

Antes do Service Fabric 9.0, esses servidores eram consultados em série até que uma resposta fosse recebida, com um período de tempo limite fixo de 5 segundos entre eles. Se um servidor não responder dentro do período de tempo limite, o próximo servidor (se disponível) será consultado. No caso de esses servidores DNS encontrarem algum problema, a conclusão das consultas DNS levaria mais de 5 segundos, o que não é o ideal.

A partir do Service Fabric 9.0, foi adicionado suporte para consultas recursivas paralelas. Com consultas paralelas, todos os servidores DNS recursivos podem ser contatados de uma só vez, onde a primeira resposta vence. Isso resulta em respostas mais rápidas no cenário mencionado anteriormente. Esta opção não está ativada por predefinição.

Opções refinadas também são introduzidas no Service Fabric 9.0 para controlar o comportamento das consultas recursivas, incluindo os períodos de tempo limite e as tentativas de consulta. Estas opções podem ser definidas nas configurações do serviço DNS:

  • RecursiveQuerySerialMaxAttempts - O número de consultas seriais que serão tentadas, no máximo. Se esse número for maior do que o número de servidores DNS de encaminhamento, a consulta será interrompida quando todos os servidores tiverem sido tentados exatamente uma vez.
  • RecursiveQuerySerialTimeout - O valor de tempo limite em segundos para cada tentativa de consulta serial.
  • RecursiveQueryParallelMaxAttempts - O número de vezes que consultas paralelas serão tentadas. As consultas paralelas são executadas após o esgotamento das tentativas máximas de consultas seriais.
  • RecursiveQueryParallelTimeout - O valor de tempo limite em segundos para cada tentativa de consulta paralela.

Problemas conhecidos e de limitações

  • As portas dinâmicas não são suportadas pelo serviço DNS. Para resolver serviços expostos em portas dinâmicas, use o serviço de proxy reverso.
  • O suporte para Linux está atualmente limitado a serviços em contêineres. Os serviços baseados em processos no Linux atualmente não podem usar o serviço DNS.
  • O serviço DNS para clusters Linux não pode ser habilitado por meio do portal do Azure.
  • Se um nome DNS for alterado para um serviço, as atualizações de nome podem não estar imediatamente visíveis em alguns cenários. Para resolver o problema, as instâncias de serviço DNS devem ser reiniciadas no cluster.

Próximos passos

Saiba mais sobre a comunicação de serviço dentro do cluster com conectar e se comunicar com serviços