Compartilhar via


Serviço DNS no Azure Service Fabric

O serviço DNS é um serviço do sistema opcional que pode ser habilitado em seu cluster para descobrir outros serviços usando o protocolo DNS.

Muitos serviços, especialmente serviços em contêiner, são endereçáveis por meio de uma URL previamente existente. É preferível resolver esses serviços usando o protocolo DNS padrão, em vez do protocolo de Serviço de Nomenclatura do Service Fabric. O serviço DNS permite mapear nomes DNS para um nome de serviço e, portanto, resolver endereços IP do ponto de extremidade. Essa funcionalidade mantém a portabilidade dos serviços conteinerizados 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 de serviço. O nome DNS do serviço é fornecido no momento da criação. O diagrama a seguir mostra como o serviço DNS funciona para serviços sem estado. Para simplificar, os diagramas mostram apenas um ponto de extremidade dos 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 estado.

A partir do Service Fabric versão 6.3, o protocolo de DNS do Service Fabric foi estendido para incluir um esquema de endereçamento de serviços com estado particionados. Essas extensões possibilitam resolver endereços IP de partição específica usando uma combinação de nome do serviço DNS com estado e nome da partição. Há suporte para todos os três esquemas de particionamento:

  • Particionamento nomeado
  • Particionamento por intervalos
  • Particionamento de singleton

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

Diagrama mostrando como os nomes DNS são mapeados para nomes de serviço pelo serviço DNS para serviços com 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 do Windows e Linux, embora o suporte para Linux esteja atualmente limitado a serviços de contêineres e não possa ser habilitado por meio do portal do Azure. O Windows, no entanto, dá suporte a todos os tipos de serviço e modelos de implantação.

Habilitando o serviço DNS

Observação

Habilitar o serviço DNS substituirá algumas configurações de DNS nos nós. Em caso de problemas para se conectar à Internet, verifique as configurações de DNS.

Novos clusters

Clusters que usam modelos do ARM

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

Clusters que usam o portal do Azure

Se você estiver criando um cluster padrão no portal, o serviço DNS é habilitado por padrão na opção Incluir serviço DNS na seção Recursos adicionais.

Captura de tela da habilitação do serviço DNS para um cluster padrão por meio do portal.

Se você estiver criando um cluster gerenciado no portal, o serviço DNS é habilitado por padrão na opção Serviço DNS na seção Recursos adicionais.

Captura de tela da habilitação do serviço DNS para um cluster gerenciado por meio do portal.

Clusters existentes

Se você estiver atualizando um cluster gerenciado existente para habilitar o serviço DNS, poderá fazê-lo no portal visitando a página Serviços complementares na página de recurso de cluster. Caso contrário, você pode habilitar o serviço DNS usando métodos alternativos mencionados abaixo:

  • Use o modelo do ARM que foi usado para implantar o cluster, se aplicável.
  • Navegue até o cluster no Azure Resource Explorer 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, consulteExportar o modelo do grupo de recursos.

Depois de ter um modelo, habilite 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 recurso Microsoft.ServiceFabric/clusters e, caso contrário, 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 recurso Microsoft.ServiceFabric/managedClusters e, caso contrário, 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 em uma das seguintes maneiras:

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

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

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. Após atualizar o modelo de cluster com as alterações, aplique-as e permita a conclusão do upgrade. Quando a atualização for concluída, o serviço do sistema DNS começa a ser executado em seu cluster. O nome do serviço é fabric:/System/DnsService e você pode encontrar na seção do serviço Sistema no explorador do Microsoft Azure Service Fabric.

Observação

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

Configurando o nome DNS para o serviço

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

O nome DNS para seu serviço pode ser resolvido em todo o cluster, portanto, é 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, automaticamente são atribuídos nomes DNS usando esse esquema de nomenclatura.

Configurando o nome DNS com o modelo do ARM

Se você estiver usando os modelos do ARM para implementar seus serviços, poderá incluir a propriedade serviceDnsName na seção apropriada e atribuir um valor a ela. Veja os exemplos abaixo:

Clusters Padrão

Para clusters padrão, verifique se o apiVersion está definido como 2019-11-01-preview ou posterior para o recurso Microsoft.ServiceFabric/clusters/applications/services e, caso contrário, 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 recurso Microsoft.ServiceFabric/managedclusters/applications/services e, caso contrário, 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 de um serviço padrão no ApplicationManifest.xml

Abra o projeto no Visual Studio ou em seu editor favorito e abra o arquivo ApplicationManifest.xml. Acesse a seção de serviços padrão e, para cada serviço, adicione o atributo ServiceDnsName. 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 para um serviço com estado em stateful1.application1. O serviço usa um esquema de particionamento nomeado. Observe que os nomes de partição estão em letras minúsculas. Esse é um requisito para partições que serão direcionadas em consultas DNS; para obter mais informações, consulte Fazer consultas DNS em uma partição de serviço com estado.

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

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

É possível definir o nome DNS para um serviço ao criá-lo usando o comando New-ServiceFabricService do PowerShell. O exemplo a seguir cria um novo serviço sem estado com o nome DNS stateless1.application1:

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 comando Update-ServiceFabricService do PowerShell. O exemplo a seguir atualiza um serviço sem estado existente para adicionar o nome DNS stateless1.application1:

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 tela do nome DNS no Service Fabric Explorer.

Observação

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

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

A partir da versão 6.3 do Service Fabric, o serviço DNS dá suporte a consultas para partições de serviço. Para habilitar o suporte para consultas de serviço particionado, 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, as restrições de nomenclatura a seguir se aplicam:

  • Nomes de partição devem ser compatíveis com DNS.
  • Nomes de partição com vários rótulos, incluindo ponto ou '.' não deve ser usado.
  • Nomes de partição devem estar em letras minúsculas.

Consultas DNS destinadas a uma partição são formatadas da seguinte maneira:

    <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 serviço.
  • PartitionPrefix é um valor que pode ser definido na seção DnsService do manifesto do cluster ou por meio do modelo do ARM do cluster. O valor padrão é "--". Para saber mais, confira as 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 do ARM do cluster. O valor padrão pode ser uma cadeia de caracteres vazia. Para saber mais, confira as Configurações do serviço DNS.
  • Remaining-Partitioned-Service-DNSName é a parte restante do nome DNS do 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 DNS backendrangedschemesvc.application que usa um esquema de partição variado, use backendrangedschemesvc--0.application.
  • Para resolver a partição "primeiro" de um serviço com nome DNS backendnamedschemesvc.application que usa um esquema de partição 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.

Usando nomes DNS em 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 estado. Para serviços com estado em execução em versões do Service Fabric anteriores a 6.3, você pode usar o serviço de proxy reverso interno de 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. É possível 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 pelo DNS. É simplesmente uma chamada HTTP regular na qual você fornece o nome DNS, a porta e qualquer caminho opcional como parte do 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 estado. Nesse 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 de 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 elas. Se um servidor não respondesse dentro do período de tempo limite, o próximo servidor (se disponível) seria consultado. No caso de esses servidores DNS encontrarem problemas, a conclusão de consultas DNS levaria mais de 5 segundos, o que não é o ideal.

No Service Fabric 9.0 e posteriores, foi adicionado suporte para consultas recursivas paralelas. Com consultas paralelas, todos os servidores DNS recursivos podem ser contatados de uma só vez, quando a primeira resposta ganha. Isso resulta em respostas mais rápidas no cenário mencionado anteriormente. Essa opção não está habilitada por padrão.

As opções detalhadas também foram 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. Essas 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 a quantidade de servidores DNS de encaminhamento, a consulta será interrompida depois que todos os servidores forem tentados exatamente uma vez.
  • RecursiveQuerySerialTimeout: o valor do tempo limite em segundos para cada consulta serial tentada.
  • RecursiveQueryParallelMaxAttempts: o número de vezes que consultas paralelas serão tentadas. As consultas paralelas são executadas depois que as tentativas máximas de consultas seriais são esgotadas.
  • RecursiveQueryParallelTimeout: o valor do tempo limite em segundos para cada consulta paralela tentada.

Limitações e problemas conhecidos

  • 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 reverter.
  • Atualmente, o suporte para Linux está limitado a serviços de contêineres. Atualmente, os serviços baseados em processo no Linux não podem usar o serviço DNS.
  • O serviço DNS para clusters do 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 ser imediatamente visíveis em alguns cenários. Para resolver o problema, as instâncias do serviço DNS devem ser reiniciadas no cluster.

Próximas etapas

Saiba mais sobre a comunicação de serviço no cluster com Conectar e comunicar-se com serviços