Layanan DNS di Azure Service Fabric

Layanan DNS adalah layanan sistem opsional yang dapat Anda aktifkan di kluster Anda untuk menemukan layanan lain menggunakan protokol DNS.

Banyak layanan, terutama layanan kontainer, dapat diatasi melalui URL yang sudah ada sebelumnya. Mampu menyelesaikan layanan ini menggunakan protokol DNS standar, daripada protokol Service Fabric Naming Service, sesuai keinginan. Layanan DNS memungkinkan Anda memetakan nama DNS ke nama layanan dan karenanya menyelesaikan alamat IP titik akhir. Fungsionalitas tersebut mempertahankan portabilitas layanan kontainer di berbagai platform dan dapat membuat skenario "angkat dan geser" lebih mudah, dengan memungkinkan Anda menggunakan URL layanan yang ada daripada menulis ulang kode untuk menggunakan Naming Service.

Layanan DNS memetakan nama DNS ke nama layanan, yang pada gilirannya diselesaikan oleh Layanan Penamaan untuk mengembalikan titik akhir layanan. Nama DNS untuk layanan disediakan pada saat pembuatan. Diagram berikut ini memperlihatkan cara kerja layanan DNS untuk layanan stateless. Untuk singkatnya, diagram hanya menampilkan satu titik akhir untuk layanan, meskipun setiap layanan dapat memiliki beberapa titik akhir.

Diagram memperlihatkan bagaimana nama DNS dipetakan ke nama layanan menurut layanan DNS untuk layanan stateless.

Dimulai dengan Service Fabric versi 6.3, protokol DNS Service Fabric telah diperluas untuk menyertakan skema untuk mengatasi layanan stateful yang dipartisi. Ekstensi ini memungkinkan untuk menyelesaikan alamat IP partisi tertentu menggunakan kombinasi nama DNS layanan stateful dan nama partisi. Ketiga skema partisi didukung:

  • Pemartisian nama
  • Pemartisian rentang
  • Pemartisian database tunggal

Diagram berikut ini memperlihatkan cara kerja layanan DNS untuk layanan stateful yang dipartisi.

Diagram memperlihatkan bagaimana nama DNS dipetakan ke nama layanan menurut layanan DNS untuk layanan stateful yang dipartisi.

Untuk informasi selengkapnya tentang kueri yang dipartisi, lihat bagian di bawah ini.

Dukungan OS

Layanan DNS didukung pada kluster Windows dan Linux, meskipun dukungan untuk Linux saat ini terbatas pada layanan kontainer dan tidak dapat diaktifkan melalui portal Azure. Namun, Windows mendukung semua jenis layanan dan model penyebaran.

Mengaktifkan layanan DNS

Catatan

Mengaktifkan layanan DNS akan mengambil alih beberapa pengaturan DNS pada simpul. Jika Anda mengalami masalah saat menyambungkan ke internet, periksa pengaturan DNS Anda.

Kluster baru

Kluster menggunakan templat ARM

Untuk menyebarkan kluster baru dengan templat ARM, Anda dapat menggunakan templat sampel atau menulis sendiri. Jika belum selesai, layanan DNS dapat diaktifkan dalam templat dengan menggunakan versi API minimum yang didukung dan dengan menambahkan pengaturan yang sesuai. Detail tentang cara mencapainya dapat dilihat di bawah ini dalam poin 1 dan 2 dari daftar bernomor.

Kluster yang menggunakan portal Azure

Jika Anda membuat kluster standar di portal, layanan DNS diaktifkan secara default di opsi Sertakan layanan DNS di bawah bagian Tambahkan fitur .

Cuplikan layar mengaktifkan layanan DNS untuk kluster standar melalui portal.

Jika Anda membuat kluster terkelola di portal, layanan DNS diaktifkan secara default di opsi layanan DNS di bawah bagian Tambahkan fitur .

Cuplikan layar mengaktifkan layanan DNS untuk kluster terkelola melalui portal.

Kluster yang ada

Jika Anda memperbarui kluster terkelola yang ada untuk mengaktifkan layanan DNS, Anda dapat melakukannya dari portal dengan mengunjungi halaman Layanan add-on dari halaman sumber daya kluster. Jika tidak, Anda dapat mengaktifkan layanan DNS menggunakan metode alternatif yang direferensikan di bawah ini:

  • Gunakan templat ARM yang digunakan untuk menyebarkan kluster, jika berlaku.
  • Navigasikan ke kluster di Azure Resource Explorer dan perbarui sumber daya kluster, seperti yang terlihat pada langkah-langkah di bawah ini (dari langkah 2 dan seterusnya).
  • Navigasi ke kluster di portal dan klik Ekspor Templat. Untuk mempelajari selengkapnya, lihat Mengekspor templat dari grup sumber daya.

Setelah Anda memiliki templat, Anda bisa mengaktifkan layanan DNS dengan langkah-langkah berikut:

  1. Untuk kluster standar, periksa apakah diatur ke 2017-07-01-preview atau nanti untuk Microsoft.ServiceFabric/clusters sumber daya, dan, jika tidak, perbarui seperti yang apiVersion ditunjukkan dalam contoh berikut:

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

    Untuk kluster terkelola, periksa apakah apiVersion diatur ke 2020-01-01-preview atau nanti untuk Microsoft.ServiceFabric/managedClusters sumber daya, dan, jika tidak, perbarui seperti yang ditunjukkan dalam contoh berikut:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. Sekarang aktifkan layanan DNS dengan salah satu cara berikut:

    • Untuk mengaktifkan layanan DNS dengan pengaturan default, tambahkan ke bagian addonFeatures di dalam bagian properties seperti yang diperlihatkan dalam contoh berikut:

      "properties": {
        ...
        "addonFeatures": [
          "DnsService"
          ],
        ...
      }
      
    • Untuk mengaktifkan layanan selain pengaturan default, tambahkan bagian DnsService ke bagian fabricSettingsdi dalam bagianproperties. Dalam hal ini, Anda tidak perlu menambahkan DnsService ke addonFeatures. Untuk mempelajari selengkapnya tentang properti yang bisa diatur untuk layanan DNS, lihat Pengaturan layanan DNS.

      "properties": {
       ...
       "fabricSettings": [
         ...
         {
           "name": "DnsService",
           "parameters": [
             {
               "name": "IsEnabled",
               "value": "true"
             },
             {
               "name": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. Setelah Anda memperbarui template kluster dengan perubahan, terapkan dan biarkan peningkatan selesai. Ketika pemutakhiran selesai, layanan sistem DNS mulai berjalan di kluster Anda. Nama layanan adalah fabric:/System/DnsService, dan Anda dapat menemukannya di bawah bagian layanan Sistem di Service Fabric explorer.

Catatan

Saat meningkatkan DNS dari dinonaktifkan ke diaktifkan, Service Fabric Explorer mungkin tidak mencerminkan status baru. Untuk mengatasinya, mulai ulang simpul dengan memodifikasi kebijakan peningkatan di templat Anda.

Mengatur nama DNS untuk layanan Anda

Anda bisa mengatur nama DNS untuk layanan Anda dengan templat ARM, dengan layanan default dalam file ApplicationManifest.xml, atau dengan perintah PowerShell.

Nama DNS untuk layanan Anda dapat diselesaikan di seluruh kluster, jadi penting untuk memastikan keunikan nama DNS di seluruh kluster.

Sebaiknya gunakan skema penamaan <ServiceName>.<AppName>; misalnya, service1.application1. Jika aplikasi digunakan menggunakan dokumen Docker, layanan secara otomatis diberi nama DNS menggunakan skema penamaan ini.

Mengatur nama DNS dengan templat ARM

Jika Anda menggunakan templat ARM untuk menyebarkan layanan, Anda dapat menambahkan serviceDnsName properti ke bagian yang sesuai dan menetapkan nilai ke dalamnya. Contoh dapat dilihat di bawah ini:

Kluster standar

Untuk kluster standar, periksa apakah diatur ke 2019-11-01-preview atau nanti untuk Microsoft.ServiceFabric/clusters/applications/services sumber daya, dan, jika tidak, perbarui seperti yang apiVersion ditunjukkan dalam contoh berikut:

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

Kluster terkelola

Untuk kluster terkelola, periksa apakah apiVersion diatur ke 2022-10-01-preview atau nanti untuk Microsoft.ServiceFabric/managedclusters/applications/services sumber daya, dan, jika tidak, perbarui seperti yang ditunjukkan dalam contoh berikut:

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

Mengatur nama DNS untuk layanan default di ApplicationManifest.xml

Buka proyek Anda di Visual Studio, atau editor favorit Anda, dan buka file ApplicationManifest.xml. Buka bagian layanan default, dan untuk setiap layanan, tambahkan atribut ServiceDnsName. Contoh berikut ini memperlihatkan cara mengatur nama DNS layanan ke stateless1.application1

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

Contoh berikut ini mengatur nama DNS untuk layanan stateful menjadi stateful1.application1. Layanan ini menggunakan skema partisi bernama. Perhatikan bahwa nama partisi lebih rendah. Ini adalah persyaratan untuk partisi yang akan ditargetkan dalam kueri DNS; untuk informasi selengkapnya, lihat Membuat kueri DNS pada partisi layanan stateful.

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

Mengatur nama DNS untuk layanan dengan PowerShell

Anda bisa mengatur nama DNS untuk layanan saat membuatnya dengan menggunakan New-ServiceFabricService perintah PowerShell. Contoh berikut membuat layanan stateless baru dengan nama stateless1.application1DNS :

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

Anda juga dapat memperbarui layanan yang sudah ada dengan menggunakan Update-ServiceFabricService perintah PowerShell. Contoh berikut memperbarui layanan stateless yang ada untuk menambahkan nama stateless1.application1DNS :

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

Verifikasi bahwa nama DNS diatur di Service Fabric Explorer

Setelah layanan disebarkan dengan nama DNS, Service Fabric Explorer akan menampilkan nama DNS untuk layanan, seperti yang ditunjukkan pada gambar berikut:

Cuplikan layar nama DNS di Service Fabric Explorer.

Catatan

Tampilan ini mungkin berbeda tergantung pada versi Service Fabric Explorer yang digunakan, namun, bidang nama DNS harus terlihat dalam beberapa formulir di halaman layanan.

Membuat kueri DNS pada partisi layanan stateful

Dimulai dengan Service Fabric versi 6.3, layanan DNS mendukung kueri untuk partisi layanan. Untuk mengaktifkan dukungan untuk kueri layanan yang dipartisi, pengaturan layanan DNS harus diperbarui untuk mengatur opsi EnablePartitionedQuery ke true.

Untuk partisi yang akan digunakan dalam kueri DNS, pembatasan penamaan berikut ini berlaku:

  • Nama partisi harus sesuai dengan DNS.
  • Nama partisi multi-label termasuk titik atau '.' tidak boleh digunakan.
  • Nama partisi harus lebih rendah.

Kueri DNS yang menargetkan partisi diformat sebagai berikut:

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

Di mana:

  • First-Label-Of-Partitioned-Service-DNSName adalah bagian pertama dari nama DNS layanan Anda.
  • PartitionPrefix adalah nilai yang dapat diatur di bagian DnsService dari manifes kluster atau melalui templat ARM kluster. Nilai defaultnya adalah "--". Untuk mempelajari selengkapnya, lihat Pengaturan layanan DNS.
  • Target-Partition-Name adalah nama dari partisi.
  • PartitionSuffix adalah nilai yang dapat diatur di bagian DnsService dari manifes kluster atau melalui templat ARM kluster. Nilai default adalah string kosong. Untuk mempelajari selengkapnya, lihat Pengaturan layanan DNS.
  • Remaining-Partitioned-Service-DNSName adalah bagian yang tersisa dari nama DNS layanan Anda.

Contoh berikut menunjukkan kueri DNS untuk layanan yang dipartisi yang berjalan pada kluster yang memiliki pengaturan default untuk PartitionPrefix dan PartitionSuffix:

  • Untuk mengatasi partisi "0" layanan dengan nama backendrangedschemesvc.application DNS yang menggunakan skema pemartisian rentang, gunakan backendrangedschemesvc--0.application.
  • Untuk mengatasi partisi "pertama" layanan dengan nama backendnamedschemesvc.application DNS yang menggunakan skema partisi bernama, gunakan backendnamedschemesvc--first.application.

Layanan DNS mengembalikan alamat IP titik akhir yang terkait dengan replika utama partisi. Jika tidak ada partisi yang ditentukan, layanan DNS akan secara acak memilih partisi.

Menggunakan nama DNS di layanan Anda

Jika Anda menyebarkan layanan dengan nama DNS, Anda bisa menemukan alamat IP titik akhir yang diekspos dengan mereferensikan nama DNS. Layanan DNS berfungsi untuk layanan stateless, dan, di Service Fabric versi 6.3 dan yang lebih baru, untuk layanan stateful. Untuk layanan stateful yang berjalan pada versi Service Fabric sebelum 6.3, Anda dapat menggunakan layanan proksi terbalik bawaan untuk panggilan HTTP untuk memanggil partisi layanan tertentu.

Port dinamis tidak didukung oleh layanan DNS. Anda dapat menggunakan layanan proksi terbalik untuk mengatasi layanan yang menggunakan port dinamis.

Kode berikut ini memperlihatkan cara memanggil layanan tanpa status melalui DNS. Ini hanyalah panggilan HTTP biasa di mana Anda memberikan nama DNS, port, dan jalur opsional apa pun sebagai bagian dari 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;
    }
}

Kode berikut menunjukkan panggilan pada partisi tertentu dari layanan stateful. Dalam hal ini, nama DNS berisi nama partisi (partition1). Panggilan mengasumsikan kluster dengan nilai default untuk PartitionPrefix dan 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;
    }
}

Kueri rekursif

Untuk nama DNS yang tidak dapat diselesaikan layanan DNS sendiri (misalnya, nama DNS publik), itu akan meneruskan kueri ke server DNS rekursif yang sudah ada sebelumnya pada simpul.

Diagram memperlihatkan bagaimana kueri DNS untuk nama publik diselesaikan.

Sebelum Service Fabric 9.0, server ini dikueri secara serial sampai respons diterima, dengan periode batas waktu tetap 5 detik di antaranya. Jika server tidak merespons dalam periode batas waktu, server berikutnya (jika tersedia) akan dikueri. Jika server DNS ini mengalami masalah, penyelesaian kueri DNS akan memakan waktu lebih dari 5 detik, yang tidak ideal.

Mulai Service Fabric 9.0, dukungan untuk kueri rekursif paralel ditambahkan. Dengan kueri paralel, semua server DNS rekursif dapat dihubungi sekaligus, di mana respons pertama menang. Ini menghasilkan respons yang lebih cepat dalam skenario yang disebutkan sebelumnya. Opsi ini tidak diaktifkan secara default.

Opsi mendetail juga diperkenalkan dalam Service Fabric 9.0 untuk mengontrol perilaku kueri rekursif, termasuk periode batas waktu dan upaya kueri. Opsi ini dapat diatur dalam pengaturan layanan DNS:

  • RecursiveQuerySerialMaxAttempts - Jumlah maksimum kueri serial yang akan diupayakan. Jika jumlah ini lebih tinggi dari jumlah penerusan server DNS, kueri akan berhenti setelah semua server dicoba tepat sekali.
  • RecursiveQuerySerialTimeout - Nilai batas waktu dalam detik untuk kueri serial yang diupayakan.
  • RecursiveQueryParallelMaxAttempts - Frekuensi saat kueri paralel akan diupayakan. Kueri paralel dijalankan setelah upaya maksimum untuk kueri serial telah habis.
  • RecursiveQueryParallelTimeout - Nilai batas waktu dalam detik untuk setiap kueri paralel yang diupayakan.

Batasan dan masalah yang diketahui

  • Port dinamis tidak didukung oleh layanan DNS. Untuk mengatasi layanan yang terekspos pada port dinamis, gunakan layanan proksi terbalik.
  • Dukungan untuk Linux saat ini terbatas pada layanan kontainer. Layanan berbasis proses di Linux saat ini tidak dapat menggunakan layanan DNS.
  • Layanan DNS untuk kluster Linux tidak dapat diaktifkan melalui portal Azure.
  • Jika nama DNS diubah untuk layanan, pembaruan nama mungkin tidak segera terlihat dalam beberapa skenario. Untuk mengatasi masalah ini, instans layanan DNS harus dimulai ulang di seluruh kluster.

Langkah berikutnya

Pelajari lebih lanjut tentang komunikasi layanan dalam kluster dengan terhubung dan berkomunikasi dengan layanan