Azure Service Fabric의 DNS 서비스

DNS 서비스는 DNS 프로토콜을 통해 다른 서비스를 검색하기 위해 클러스터에서 사용하도록 설정할 수 있는 선택적 시스템 서비스입니다.

많은 서비스, 특히 컨테이너 서비스는 기존 URL을 통해 주소를 지정할 수 있습니다. Service Fabric Naming Service 프로토콜보다는 표준 DNS 프로토콜을 사용하여 이러한 서비스를 해결할 수 있어야 합니다. DNS 서비스를 사용하면 DNS 이름을 서비스 이름에 매핑할 수 있으므로 엔드포인트 IP 주소를 확인할 수 있습니다. 이러한 기능은 다양한 플랫폼에서 컨테이너화된 서비스의 이식성을 유지하며, Naming Service를 사용하도록 코드를 다시 작성하는 대신 기존 서비스 URL을 사용할 수 있도록 하여 “리프트 앤 시프트”시나리오를 더 쉽게 만들 수 있습니다.

DNS 서비스는 DNS 이름을 서비스 이름에 매핑하며, Naming Service에서 이를 확인하여 서비스 엔드포인트를 반환합니다. 서비스의 DNS 이름은 생성 시 제공됩니다. 다음 다이어그램에서는 DNS 서비스가 상태 비저장 서비스에 대해 작동하는 방식을 보여줍니다. 간단히 하기 위해 다이어그램에는 서비스에 대해 하나의 엔드포인트만 표시되지만, 각 서비스에는 여러 엔드포인트가 있을 수 있습니다.

상태 비저장 서비스에 대한 DNS 서비스에서 DNS 이름을 서비스 이름에 매핑하는 방법을 보여주는 다이어그램

Service Fabric 버전 6.3부터, 분할된 상태 저장 서비스 주소 지정 체계를 포함하도록 Service Fabric DNS 프로토콜이 확장되었습니다. 이러한 확장을 통해 상태 저장 서비스 DNS 이름과 파티션 이름을 조합하여 특정 파티션 IP 주소를 확인할 수 있습니다. 세 가지 파티션 구성표가 모두 지원됩니다.

  • 이름 지정된 분할
  • 범위 지정된 분할
  • 단일 분할

다음 다이어그램은 분할된 상태 비저장 서비스에 대해 DNS 서비스가 작동하는 방식을 보여줍니다.

분할된 상태 비저장 서비스의 DNS 서비스에서 DNS 이름을 서비스 이름에 매핑하는 방법을 보여주는 다이어그램

분할된 쿼리에 대한 자세한 내용은 아래 섹션을 참조하세요.

OS 지원

DNS 서비스는 Windows 및 Linux 클러스터 모두에서 지원되지만, Linux에 대한 지원은 현재 컨테이너화된 서비스로 제한되며 Azure Portal을 통해 사용하도록 설정할 수 없습니다. 그러나 Windows는 모든 서비스 유형과 배포 모델을 지원합니다.

DNS 서비스 사용

참고 항목

DNS 서비스를 사용하도록 설정하면 노드의 일부 DNS 설정이 무시됩니다. 인터넷 연결과 관련된 이슈가 발생하는 경우 DNS 설정을 확인합니다.

새 클러스터

ARM 템플릿을 사용하여 클러스터 배포

ARM 템플릿을 사용하여 새 클러스터를 배포하려면 샘플 템플릿을 사용하거나 직접 작성할 수 있습니다. 아직 수행하지 않은 경우 지원되는 최소 API 버전을 사용하고 적절한 설정을 추가하여 템플릿에서 DNS 서비스를 사용하도록 설정할 수 있습니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 아래에 있는 번호가 매겨진 목록의 1번과 2번 항목에서 확인할 수 있습니다.

Azure Portal을 사용하여 클러스터 만들기

포털에서 표준 클러스터를 만드는 경우 DNS 서비스는 기본적으로 추가 기능 섹션 아래의 DNS 서비스 포함 옵션에서 사용하도록 설정됩니다.

포털을 통해 DNS 서비스를 표준 클러스터에 사용하도록 설정하는 스크린샷

포털에서 관리형 클러스터를 만드는 경우 DNS 서비스는 기본적으로 추가 기능 섹션 아래의 DNS 서비스 옵션에서 사용하도록 설정됩니다.

포털을 통해 DNS 서비스를 관리형 클러스터에 사용하도록 설정하는 스크린샷

기존 클러스터

DNS 서비스를 사용하도록 설정하기 위해 기존 관리형 클러스터를 업데이트하는 경우 클러스터 리소스 페이지의 추가 기능 서비스 페이지를 방문하여 포털에서 해당 클러스터를 업데이트할 수 있습니다. 그렇지 않은 경우 아래에서 참조되는 대체 방법을 사용하여 DNS 서비스를 사용하도록 설정할 수 있습니다.

  • 해당하는 경우 클러스터를 배포하는 데 사용된 ARM 템플릿을 사용합니다.
  • 아래의 추가 단계(2단계부터)와 같이 Azure Resource Explorer에서 클러스터로 이동하고 클러스터 리소스를 업데이트합니다.
  • 포털에서 클러스터로 이동하고 템플릿 내보내기를 클릭합니다. 자세히 알아보려면 리소스 그룹에서 템플릿 내보내기를 참조하세요.

템플릿이 있으면 다음 단계에 따라 DNS 서비스를 사용하도록 설정할 수 있습니다.

  1. 표준 클러스터의 경우 Microsoft.ServiceFabric/clusters 리소스에 대해 apiVersion2017-07-01-preview 이상으로 설정되어 있는지 확인하고, 그렇지 않은 경우 다음 예제와 같이 업데이트합니다.

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

    관리형 클러스터의 경우 Microsoft.ServiceFabric/managedClusters 리소스에 대해 apiVersion2020-01-01-preview 이상으로 설정되어 있는지 확인하고, 그렇지 않은 경우 다음 예제와 같이 업데이트합니다.

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. 이제 다음 방법 중 하나로 DNS 서비스를 사용하도록 설정합니다.

    • DNS 서비스를 기본 설정으로 사용하도록 설정하려면 다음 예제와 같이 properties 섹션 내의 addonFeatures 섹션에 추가합니다.

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • 기본 설정 이외의 설정으로 서비스를 활성화하려면 properties 섹션의 fabricSettings 섹션 안에 DnsService 섹션을 추가합니다. 이 경우 addonFeatures에 DnsService를 추가할 필요가 없습니다. DNS 서비스에 대해 설정할 수 있는 속성에 대한 자세한 내용은 DNS 서비스 설정을 참조하세요.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. 변경 사항으로 클러스터 템플릿을 업데이트한 후에는 이를 적용하여 업그레이드를 완료합니다. 업그레이드가 완료되면 DNS 시스템 서비스가 클러스터에서 실행을 시작합니다. 서비스 이름은 fabric:/System/DnsService이며, Service Fabric 탐색기의 시스템 서비스 섹션 아래에서 찾을 수 있습니다.

참고 항목

DNS를 사용 안 함에서 사용으로 업그레이드하는 경우 Service Fabric Explorer에 새 상태가 반영되지 않을 수 있습니다. 문제를 해결하려면 템플릿에서 업그레이드 정책을 수정하여 노드를 다시 시작하세요.

서비스에 대한 DNS 이름 설정

서비스에 대한 DNS 이름은 ARM 템플릿, ApplicationManifest.xml 파일의 기본 서비스 또는 PowerShell 명령을 사용하여 설정할 수 있습니다.

서비스에 대한 DNS 이름은 클러스터 전체에서 확인할 수 있으므로 클러스터 전체에서 DNS 이름의 고유성을 확인해야 합니다.

<ServiceName>.<AppName>의 이름 지정 체계를 사용하는 것이 좋습니다(예: service1.application1). 애플리케이션이 Docker Compose를 사용하여 배포되는 경우 서비스는 이 이름 지정 체계를 사용하여 DNS 이름이 자동으로 할당됩니다.

ARM 템플릿을 사용하여 DNS 이름 설정

ARM 템플릿을 사용하여 서비스를 배포하는 경우 serviceDnsName 속성을 해당 섹션에 추가하고 값을 할당할 수 있습니다. 예제는 아래와 같습니다.

표준 클러스터

표준 클러스터의 경우 Microsoft.ServiceFabric/clusters/applications/services 리소스에 대해 apiVersion2019-11-01-preview 이상으로 설정되어 있는지 확인하고, 그렇지 않은 경우 다음 예제와 같이 업데이트합니다.

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

관리형 클러스터

관리형 클러스터의 경우 Microsoft.ServiceFabric/managedclusters/applications/services 리소스에 대해 apiVersion2022-10-01-preview 이상으로 설정되어 있는지 확인하고, 그렇지 않은 경우 다음 예제와 같이 업데이트합니다.

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

ApplicationManifest.xml에서 기본 서비스에 대한 DNS 이름 설정

Visual Studio 또는 원하는 편집기에서 프로젝트를 연 다음 ApplicationManifest.xml 파일을 엽니다. 기본 서비스 섹션으로 이동한 다음 각 서비스에 대해 ServiceDnsName 특성을 추가합니다. 다음 예제에서는 서비스의 DNS 이름을 stateless1.application1로 설정하는 방법을 보여 줍니다.

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

다음 예제에서는 상태 저장 서비스에 대한 DNS 이름을 stateful1.application1으로 설정합니다. 서비스는 이름 지정된 파티션 구성표를 사용합니다. 파티션 이름은 소문자입니다. 이것은 DNS 쿼리에서 대상이 될 파티션에 대한 요구 사항입니다. 자세한 내용은 상태 저장 서비스 파티션에서 DNS 쿼리 만들기를 참조하세요.

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

PowerShell을 사용하여 서비스에 대한 DNS 이름 설정

New-ServiceFabricService PowerShell 명령을 사용하여 서비스를 만들 때 이 서비스에 대한 DNS 이름을 설정할 수 있습니다. 다음 예제에서는 stateless1.application1 DNS 이름을 사용하여 새 상태 비저장 서비스를 만듭니다.

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

Update-ServiceFabricService PowerShell 명령을 사용하여 기존 서비스를 업데이트할 수도 있습니다. 다음 예제에서는 stateless1.application1 DNS 이름을 추가하도록 기존 상태 비저장 서비스를 업데이트합니다.

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

Service Fabric Explorer에서 DNS 이름이 설정되어 있는지 확인

서비스가 DNS 이름으로 배포되면 Service Fabric Explorer에서 다음 그림과 같이 해당 서비스에 대한 DNS 이름을 표시합니다.

Service Fabric Explorer의 DNS 이름에 대한 스크린샷

참고 항목

이 보기는 사용되는 Service Fabric Explorer 버전에 따라 다를 수 있지만, DNS 이름 필드는 어떤 형태로든 서비스 페이지에 표시됩니다.

상태 저장 서비스 파티션에서 DNS 쿼리 만들기

Service Fabric 버전 6.3부터 DNS 서비스는 서비스 파티션에 대한 쿼리를 지원합니다. 분할된 서비스 쿼리에 대한 지원을 사용하도록 설정하려면 EnablePartitionedQuery 옵션을 true로 설정하도록 DNS 서비스 설정을 업데이트해야 합니다.

DNS 쿼리에 사용될 파티션의 경우 다음과 같은 명명 제한이 적용됩니다.

  • 파티션 이름은 DNS와 호환되어야 합니다.
  • 점('.')을 포함한 다중 레이블 파티션 이름을 사용하면 안 됩니다.
  • 파티션 이름은 소문자여야 합니다.

파티션을 대상으로 하는 DNS 쿼리 형식은 다음과 같습니다.

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

여기서

  • First-Label-Of-Partitioned-Service-DNSName은 서비스 DNS 이름의 첫 번째 부분입니다.
  • PartitionPrefix는 클러스터 매니페스트의 DnsService 섹션에서 또는 클러스터의 ARM 템플릿을 통해 설정할 수 있는 값입니다. 기본값은 “--”입니다. 자세한 내용은 DNS 서비스 설정을 참조하세요.
  • Target-Partition-Name은 파티션의 이름입니다.
  • PartitionSuffix는 클러스터 매니페스트의 DnsService 섹션에서 또는 클러스터의 ARM 템플릿을 통해 설정할 수 있는 값입니다. 기본값은 빈 문자열입니다. 자세한 내용은 DNS 서비스 설정을 참조하세요.
  • Remaining-Partitioned-Service-DNSName은 서비스 DNS 이름의 나머지 부분입니다.

다음 예제는 PartitionPrefixPartitionSuffix에 대한 기본 설정이 있는 클러스터에서 실행 중인 분할된 서비스에 대한 DNS 쿼리를 보여 줍니다.

  • 범위가 지정된 분할 구성표를 사용하는 DNS 이름이 backendrangedschemesvc.application인 서비스의 "0" 파티션을 확인하려면 backendrangedschemesvc--0.application을 사용합니다.
  • 명명된 분할 구성표를 사용하는 DNS 이름이 backendnamedschemesvc.application인 서비스의 "first" 파티션을 확인하려면 backendnamedschemesvc--first.application을 사용합니다.

DNS 서비스는 파티션의 주 복제본과 연결된 엔드포인트의 IP 주소를 반환합니다. 파티션이 지정되지 않으면 DNS 서비스에서 파티션을 임의로 선택합니다.

서비스에서 DNS 이름 사용

DNS 이름을 사용하여 서비스를 배포하는 경우 DNS 이름을 참조하여 공개된 엔드포인트의 IP 주소를 찾을 수 있습니다. DNS 서비스는 상태 비저장 서비스에 대해 작동하며, Service Fabric 버전 6.3 이상에서는 상태 저장 서비스에 대해 작동합니다. Service Fabric 6.3 이전 버전에서 실행되는 상태 저장 서비스의 경우 기본 제공 역방향 프록시 서비스를 HTTP 호출에 사용하여 특정 서비스 파티션을 호출할 수 있습니다.

동적 포트는 DNS 서비스에서 지원되지 않습니다. 역방향 프록시 서비스를 사용하여 동적 포트를 사용하는 서비스를 확인할 수 있습니다.

다음 코드에는 DNS 통해 상태 비저장 서비스를 호출하는 방법을 보여 줍니다. 이는 DNS 이름, 포트 및 선택적 경로를 URL의 일부로 제공하는 일반적인 HTTP 호출입니다.

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;
    }
}

다음 코드는 상태 저장 서비스의 특정 파티션에서 호출을 보여 줍니다. 이 경우 DNS 이름은 파티션 이름(partition1)을 포함합니다. 이 호출에서는 PartitionPrefixPartitionSuffix에 대한 기본값이 있는 클러스터를 가정합니다.

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;
    }
}

재귀 쿼리

DNS 서비스에서 자체적으로 확인할 수 없는 DNS 이름(예: 공용 DNS 이름)의 경우 쿼리를 노드의 기존 재귀 DNS 서버에 전달합니다.

공용 이름에 대한 DNS 쿼리를 확인하는 방법을 보여주는 다이어그램

Service Fabric 9.0 이전에는 응답을 받을 때까지 이러한 서버가 5초의 고정된 시간 제한 기간으로 순차적으로 쿼리되었습니다. 서버가 제한 시간 내에 응답하지 않으면 다음 서버(사용 가능한 경우)가 쿼리됩니다. 이러한 DNS 서버에서 문제가 발생하는 경우 DNS 쿼리를 완료하는 데 5초보다 오래 걸리며 이는 이상적이지 않습니다.

Service Fabric 9.0부터 병렬 재귀 쿼리에 대한 지원이 추가되었습니다. 병렬 쿼리를 사용하면 모든 재귀 DNS 서버에 한 번에 연결할 수 있으며 첫 번째 응답이 우선합니다. 이로 인해 이전에 언급한 시나리오에서 응답이 빨라집니다. 이 옵션은 기본적으로 사용하도록 설정되지 않습니다.

시간 제한 기간 및 쿼리 시도를 포함하여 재귀 쿼리의 동작을 제어하기 위해 Service Fabric 9.0에도 세분화된 옵션이 도입되었습니다. 이러한 옵션은 DNS 서비스 설정에서 설정할 수 있습니다.

  • RecursiveQuerySerialMaxAttempts - 최대 시도할 직렬 쿼리의 수입니다. 이 숫자가 전달하는 DNS 서버의 수보다 높은 경우 모든 서버가 정확히 한 번 시도된 후에 쿼리가 중지됩니다.
  • RecursiveQuerySerialTimeout - 시도된 각 직렬 쿼리에 대한 시간 제한 값(초)입니다.
  • RecursiveQueryParallelMaxAttempts - 병렬 쿼리가 시도되는 횟수입니다. 병렬 쿼리는 직렬 쿼리에 대한 최대 시도가 소진된 후에 실행됩니다.
  • RecursiveQueryParallelTimeout - 시도된 각 병렬 쿼리에 대한 시간 제한 값(초)입니다.

제한 사항 및 알려진 문제

  • 동적 포트는 DNS 서비스에서 지원되지 않습니다. 동적 포트에서 노출되는 서비스를 확인하려면 역방향 프록시 서비스를 사용합니다.
  • Linux에 대한 지원은 현재 컨테이너화된 서비스로 제한됩니다. Linux의 프로세스 기반 서비스는 현재 DNS 서비스를 사용할 수 없습니다.
  • Linux 클러스터에 대한 DNS 서비스는 Azure Portal을 통해 사용하도록 설정할 수 없습니다.
  • 서비스에 대한 DNS 이름이 변경되면 일부 시나리오에서 이름 업데이트가 즉시 표시되지 않을 수 있습니다. 문제를 해결하려면 클러스터 전체에서 DNS 서비스 인스턴스를 다시 시작해야 합니다.

다음 단계

서비스와 연결 및 통신에서 클러스터 내의 서비스 통신에 대해 자세히 알아봅니다.