Compartir a través de


Servicio DNS en Azure Service Fabric

El servicio DNS es un servicio de sistema opcional que se puede habilitar en el clúster para detectar otros servicios que usan el protocolo DNS.

Muchos servicios, especialmente los servicios de contenedor, son direccionables a través de una dirección URL ya existente. Resulta conveniente tener la capacidad de resolver estos servicios mediante el protocolo de DNS estándar, en lugar de con el protocolo del Servicio de nombres de Service Fabric. El servicio DNS permite asignar nombres DNS a un nombre de servicio y, por tanto, resolver direcciones IP del punto de conexión. Esta funcionalidad mantiene la portabilidad de los servicios de contenedor en diferentes plataformas y puede facilitar escenarios de "Levantar y mover" ('lift and shift'), ya que permite usar las direcciones URL de servicio existentes en lugar de tener que volver a escribir el código para aprovechar Naming Service.

El servicio DNS asigna nombres DNS a nombres de servicio que el protocolo de Naming Service resuelve para devolver el punto de conexión del servicio. El nombre DNS para el servicio se proporciona en el momento de la creación. En el diagrama siguiente se muestra cómo funciona el servicio DNS para servicios sin estado. Por motivos de brevedad, los diagramas solo muestran un punto de conexión para los servicios, aunque cada servicio puede tener varios.

Diagrama que muestra cómo el servicio DNS asigna los nombres DNS a los nombres de servicio para los servicios sin estado.

A partir de la versión 6.3 de Service Fabric, el protocolo de DNS de Service Fabric se ha ampliado para incluir un esquema de direccionamiento de servicios con estado particionados. Estas extensiones permiten resolver direcciones IP de partición específicas mediante una combinación de nombre DNS del servicio con estado y el nombre de partición. Se admiten los tres esquemas de partición:

  • Particiones con nombre
  • Particiones por rangos
  • Particiones de singleton

En el diagrama siguiente se muestra cómo funciona el servicio DNS para servicios con estado particionados.

Diagrama que muestra cómo el servicio DNS asigna los nombres DNS a los nombres de servicio para los servicios sin estado con particiones.

Para obtener más información sobre las consultas con particiones, consulte la sección siguiente.

SO compatible

El servicio DNS se admite en clústeres de Windows y Linux, aunque actualmente la compatibilidad con Linux está limitada a los servicios en contenedores y no se puede habilitar a través de Azure Portal. Sin embargo, Windows admite todos los tipos de servicio y los modelos de implementación.

Actualizando el servicio DNS

Nota:

Al habilitar el servicio DNS, se invalidará alguna configuración de DNS en los nodos. Si tiene problemas para conectarse a Internet, compruebe la configuración de DNS.

Nuevos clústeres

Clústeres mediante plantillas de ARM

Para implementar un nuevo clúster con plantillas de ARM, puede usar las plantillas de ejemplo o escribir las suyas propias. Si aún no lo ha hecho, el servicio DNS se puede habilitar en las plantillas mediante las versiones de API mínimas admitidas y agregando la configuración adecuada. Los detalles sobre cómo hacerlo se pueden ver a continuación en los puntos 1 y 2 de la lista numerada.

Clústeres que usan Azure Portal

Si va a crear un clúster estándar en el portal, el servicio DNS se habilita de forma predeterminada en la opción Incluir servicio DNS en la sección Agregar características.

Captura de pantalla de la habilitación del servicio DNS para un clúster estándar a través del portal.

Si va a crear un clúster administrado en el portal, el servicio DNS se habilita de forma predeterminada en la opción Servicio DNS en la sección Agregar características.

Captura de pantalla de la habilitación del servicio DNS para un clúster administrado a través del portal.

Clústeres existentes

Si va a actualizar un clúster administrado existente para habilitar el servicio DNS, puede hacerlo desde el portal en la página Servicios de complementos de la página de recursos del clúster. De lo contrario, puede habilitar el servicio DNS mediante métodos alternativos a los que se hace referencia a continuación:

  • Use la plantilla de ARM que se empleó para implementar el clúster, si procede.
  • Vaya al clúster en Azure Resource Explorer y actualice el recurso de clúster, como se muestra en los pasos siguientes (del paso 2 y versiones posteriores).
  • Vaya al clúster en el portal y haga clic en Exportar plantilla. Para obtener más información, vea Exportación de la plantilla desde el grupo de recursos.

Cuando tenga una plantilla, siga estos pasos para habilitar el servicio DNS:

  1. Para los clústeres estándar, compruebe que apiVersion se ha establecido en 2017-07-01-preview o una versión posterior para el recurso Microsoft.ServiceFabric/clusters y, si no es así, actualícela tal y como se muestra en el siguiente ejemplo:

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

    Para los clústeres administrados, compruebe que apiVersion se ha establecido en 2020-01-01-preview o una versión posterior para el recurso Microsoft.ServiceFabric/managedClusters y, si no es así, actualícela tal y como se muestra en el siguiente ejemplo:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. Ahora, habilite el servicio DNS de alguna de las maneras siguientes:

    • Para habilitar el servicio DNS con la configuración predeterminada, agréguelo a la sección addonFeatures dentro de la sección properties, tal como se muestra en el ejemplo siguiente:

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • Para habilitar el servicio con otra configuración que no sea la predeterminada, agregue una sección DnsService a la sección fabricSettings dentro de la sección properties. En este caso, no es necesario agregar DnsService a addonFeatures. Para más información sobre las propiedades que se pueden establecer para el servicio DNS, vea Configuración del servicio DNS.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. Una vez actualizada la plantilla del clúster con sus cambios, aplíquelos para completar la actualización. Cuando se lleva a cabo la actualización, el servicio del sistema DNS comienza a ejecutarse en el clúster. El nombre del servicio es fabric:/System/DnsService, que puede encontrar en la sección de servicio del sistema del Service Fabric Explorer.

Nota:

Al actualizar DNS de deshabilitado a habilitado, es posible que Service Fabric Explorer no refleje el nuevo estado. Para solucionarlo, modifique UpgradePolicy en la plantilla para reiniciar los nodos.

Definición del nombre DNS para el servicio

Puede establecer nombres DNS para los servicios con plantillas de ARM, con servicios predeterminados en el archivo ApplicationManifest.xml o con comandos de PowerShell.

El nombre DNS para el servicio se puede resolver en todo el clúster, por lo que es importante garantizar la exclusividad del nombre DNS en el clúster.

Es muy recomendable que utilice un esquema de nomenclatura de <ServiceName>.<AppName>; por ejemplo, service1.application1. Si una aplicación se implementa con Docker Compose, los nombres DNS se asignan automáticamente a los servicios mediante este esquema de nomenclatura.

Establecimiento del nombre DNS con la plantilla de ARM

Si usa plantillas de ARM para implementar los servicios, puede agregar la propiedad serviceDnsName a la sección adecuada y asignarle un valor. A continuación se muestran ejemplos:

Clústeres estándar

Para los clústeres estándar, compruebe que apiVersion se ha establecido en 2019-11-01-preview o una versión posterior para el recurso Microsoft.ServiceFabric/clusters/applications/services y, si no es así, actualícela tal y como se muestra en el siguiente ejemplo:

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

Clústeres administrados

Para los clústeres administrados, compruebe que apiVersion se ha establecido en 2022-10-01-preview o una versión posterior para el recurso Microsoft.ServiceFabric/managedclusters/applications/services y, si no es así, actualícela tal y como se muestra en el siguiente ejemplo:

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

Definición del nombre DNS de un servicio predeterminado en ApplicationManifest.xml

Abra el proyecto en Visual Studio o en su editor favorito y luego abra el archivo ApplicationManifest.xml. Vaya a la sección de servicios predeterminados y, para cada servicio, agregue el atributo ServiceDnsName. En el ejemplo siguiente se muestra cómo establecer el nombre DNS del servicio en stateless1.application1.

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

En el ejemplo siguiente se establece el nombre DNS para un servicio con estado en stateful1.application1. El servicio utiliza un esquema de partición con nombre. Tenga en cuenta que los nombres de particiones están en minúscula. Se trata de un requisito para las particiones de destino en las consultas de DNS; para más información, vea Realización de consultas de DNS en una partición de servicio con estado.

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

Definición del nombre DNS de un servicio mediante PowerShell

Puede establecer el nombre DNS de un servicio cuando se crea mediante el comando New-ServiceFabricService de PowerShell. En el ejemplo siguiente se crea un servicio sin estado nuevo con el nombre DNS stateless1.application1:

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

También puede actualizar un servicio existente mediante el comando Update-ServiceFabricService de PowerShell. En el ejemplo siguiente se actualiza un servicio sin estado existente para agregar el nombre DNS stateless1.application1:

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

Compruebe que se ha establecido un nombre DNS en Service Fabric Explorer

Una vez implementado el servicio con el nombre DNS, Service Fabric Explorer mostrará el nombre DNS del servicio, como se muestra en la ilustración siguiente:

Captura de pantalla del nombre DNS de Service Fabric Explorer.

Nota:

Esta vista puede ser diferente en función de la versión de Service Fabric Explorer usada. Sin embargo, el campo nombre DNS debe estar visible en algún formulario de la página del servicio.

Realización de consultas de DNS en una partición de servicio con estado

A partir de la versión 6.3 de Service Fabric, el servicio DNS de Service Fabric admite las consultas para las particiones del servicio. Para habilitar la compatibilidad con las consultas de servicio con particiones, la configuración del servicio DNS debe actualizarse para establecer la opción EnablePartitionedQuery en true.

Para las particiones que se usarán en las consultas de DNS, se aplican las restricciones de nomenclatura siguientes:

  • Los nombres de partición deben ser compatibles con DNS.
  • Los nombres de partición de varias etiquetas que incluyen un punto (".") no se deben usar.
  • Los nombres de partición deben estar en minúscula.

Las consultas de DNS destinadas a una partición presentan el siguiente formato:

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

Donde:

  • First-Label-Of-Partitioned-Service-DNSName es la primera parte de su nombre DNS del servicio.
  • PartitionPrefix es un valor que se puede establecer en la sección DnsService del manifiesto de clúster o con la plantilla de ARM del clúster. El valor predeterminado es "--". Para más información, consulte la configuración del servicio DNS.
  • Target-Partition-Name es el nombre de la partición.
  • PartitionSuffix es un valor que se puede establecer en la sección DnsService del manifiesto de clúster o con la plantilla de ARM del clúster. El valor predeterminado es una cadena vacía. Para más información, consulte la configuración del servicio DNS.
  • Remaining-Partitioned-Service-DNSName es la parte restante del nombre DNS del servicio.

En los ejemplos siguientes se muestran las consultas de DNS para servicios con particiones que se ejecutan en un clúster que tiene una configuración predeterminada para PartitionPrefix y PartitionSuffix:

  • Para resolver la partición "0" de un servicio con el nombre DNS backendrangedschemesvc.application que utiliza un esquema de particiones por rangos, utilice backendrangedschemesvc--0.application.
  • Para resolver la partición "first" de un servicio con el nombre DNS backendnamedschemesvc.application que utiliza un esquema de particiones con nombre, utilice backendnamedschemesvc--first.application.

El servicio DNS devuelve la dirección IP del punto de conexión asociado con la réplica principal de la partición. Si no se especifica ninguna partición, el servicio DNS seleccionará aleatoriamente una.

Uso de nombre de DNS en los servicios

Si implementa servicios con nombres DNS, puede encontrar la dirección IP de los puntos de conexión expuestos haciendo referencia al nombre DNS. El servicio DNS funciona para los servicios sin estado y, en la versión 6.3 y versiones posteriores de Service Fabric, para los servicios con estado. En el caso de los servicios con estado que se ejecutan en versiones de Service Fabric anteriores a la 6.3, puede usar el servicio de proxy inverso integrado en llamadas HTTP para llamar a una partición de servicio determinada.

El servicio DNS no admite puertos dinámicos. Puede usar el servicio de proxy inverso para resolver servicios expuestos en puertos dinámicos.

El código siguiente muestra cómo llamar a un servicio sin estado mediante DNS. Se trata simplemente de una llamada HTTP normal donde se proporcionan el nombre DNS, el puerto y cualquier ruta de acceso opcional como parte de la dirección 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;
    }
}

El código siguiente muestra una llamada en una partición específica de un servicio con estado. En este caso, el nombre DNS contiene el nombre de partición (partition1). La llamada asume un clúster con valores predeterminados para PartitionPrefix y 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

En el caso de los nombres DNS que el servicio DNS no puede resolver por sí mismo (por ejemplo, un nombre DNS público), reenviará la consulta a servidores DNS recursivos preexistentes en los nodos.

Diagrama que muestra cómo se resuelven las consultas de DNS para nombres públicos.

Antes de Service Fabric 9.0, se realizaban consultas en serie en estos servidores hasta que se recibía una respuesta con un período de tiempo de espera fijo de 5 segundos entre ellos. Si un servidor no respondió dentro del período de tiempo de espera, se realizaría la consulta en el siguiente servidor (si está disponible). En caso de que estos servidores DNS experimentaran problemas, la finalización de las consultas DNS tardaría más de 5 segundos, lo cual no es idóneo.

A partir de Service Fabric 9.0, se agregó compatibilidad con consultas recursivas en paralelo. Con las consultas en paralelo, se puede contactar con todos los servidores DNS recursivos a la vez y la primera respuesta gana. Esto da lugar a respuestas más rápidas en el escenario mencionado anteriormente. Esta opción no está habilitada de forma predeterminada.

Se han incluido también opciones específicas en Service Fabric 9.0 para controlar el comportamiento de las consultas recursivas, incluidos los períodos de tiempo de espera y los intentos de consulta. Estas opciones se pueden establecer en la configuración del servicio DNS:

  • RecursiveQuerySerialMaxAttempts: número de consultas en serie que se intentarán, como máximo. Si este número es mayor que el número de servidores DNS de reenvío, la consulta se detendrá una vez que se haya intentado exactamente una vez en cada servidor.
  • RecursiveQuerySerialTimeout: valor de tiempo de espera en segundos para cada consulta en serie intentada.
  • RecursiveQueryParallelMaxAttempts: número de veces que se intentarán consultas en paralelo. Las consultas en paralelo se ejecutan después de que se haya agotado el número máximo de intentos de consultas en serie.
  • RecursiveQueryParallelTimeout: valor de tiempo de espera en segundos para cada consulta en paralelo intentada.

Limitaciones y problemas conocidos

  • El servicio DNS no admite puertos dinámicos. Para resolver servicios expuestos en puertos dinámicos, use el servicio de proxy inverso.
  • Actualmente, la compatibilidad con Linux está limitada a los servicios en contenedores. Actualmente, los servicios basados en procesos en Linux no pueden usar el servicio DNS.
  • El servicio DNS para clústeres de Linux no se puede habilitar a través de Azure Portal.
  • Si se cambia un nombre DNS para un servicio, es posible que las actualizaciones de nombres no sean visibles inmediatamente en algunos escenarios. Para resolver el problema, las instancias de servicio DNS deben reiniciarse en el clúster.

Pasos siguientes

Para más información sobre la comunicación de servicios dentro del clúster, vea Conexión y comunicación con servicios