Bagikan melalui


Mode jaringan kontainer pada Service Fabric

Kluster Azure Service Fabric untuk layanan kontainer menggunakan mode jaringan nat secara default. Ketika lebih dari satu layanan kontainer mendengarkan pada port yang sama dan mode NAT sedang digunakan, kesalahan penyebaran dapat terjadi. Untuk mendukung beberapa layanan kontainer yang mendengarkan pada port yang sama, Service Fabric menawarkan mode jaringan Terbuka (versi 5.7 dan yang lebih baru). Dalam mode Terbuka, setiap layanan kontainer memiliki alamat IP internal yang ditetapkan secara dinamis yang mendukung beberapa layanan yang mendengarkan pada port yang sama.

Jika Anda memiliki satu layanan kontainer dengan titik akhir statis dalam manifes layanan, Anda dapat membuat dan menghapus layanan baru dengan menggunakan mode Buka tanpa kesalahan penyebaran. File docker-compose.yml yang sama juga dapat digunakan dengan pemetaan port statis untuk membuat beberapa layanan.

Ketika layanan kontainer dimulai ulang atau berpindah ke simpul lain di kluster, alamat IP berubah. Untuk alasan ini, kami tidak merekomendasikan penggunaan alamat IP yang ditetapkan secara dinamis untuk menemukan layanan kontainer. Hanya Layanan Penamaan Service Fabric atau Layanan DNS yang harus digunakan untuk penemuan layanan.

Peringatan

Azure memungkinkan total 65.356 IP per jaringan virtual. Jumlah simpul dan jumlah instans layanan kontainer (yang menggunakan mode Buka) tidak boleh melebihi 65.356 IP dalam jaringan virtual. Untuk skenario kepadatan tinggi, kami merekomendasikan mode jaringan nat. Selain itu, dependensi lain seperti load balancer akan memiliki batasan lain untuk dipertimbangkan . Saat ini hingga 50 IP per simpul telah diuji dan terbukti stabil.

Menyiapkan mode Jaringan terbuka

  1. Siapkan templat Azure Resource Manager. Di bagian fabricSettings dari sumber daya Kluster, aktifkan Layanan DNS dan Penyedia IP:

    "fabricSettings": [
                {
                    "name": "DnsService",
                    "parameters": [
                       {
                            "name": "IsEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Hosting",
                    "parameters": [
                      { 
                            "name": "IPProviderEnabled",
                            "value": "true"
                      }
                    ]
                },
                {
                    "name": "Setup",
                    "parameters": [
                    {
                            "name": "ContainerNetworkSetup",
                            "value": "true"
                    }
                    ]
                }
            ],
    
  2. Siapkan bagian profil jaringan dari sumber daya Virtual Machine Scale Set. Ini memungkinkan beberapa alamat IP dikonfigurasi pada setiap simpul kluster. Contoh berikut menyiapkan lima alamat IP per simpul untuk kluster Service Fabric Windows/Linux. Anda dapat memiliki lima instans layanan yang mendengarkan di port pada setiap node. Agar lima IP dapat diakses dari Azure Load Balancer, daftarkan lima IP di Kumpulan Alamat Backend Azure Load Balancer seperti yang ditunjukkan di bawah ini. Anda juga perlu menambahkan variabel ke bagian atas templat Anda di bagian variabel.

    Tambahkan bagian ini ke Variabel:

    "variables": {
        "nicName": "NIC",
        "vmName": "vm",
        "virtualNetworkName": "VNet",
        "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
        "vmNodeType0Name": "[toLower(concat('NT1', variables('vmName')))]",
        "subnet0Name": "Subnet-0",
        "subnet0Prefix": "10.0.0.0/24",
        "subnet0Ref": "[concat(variables('vnetID'),'/subnets/',variables('subnet0Name'))]",
        "lbID0": "[resourceId('Microsoft.Network/loadBalancers',concat('LB','-', parameters('clusterName'),'-',variables('vmNodeType0Name')))]",
        "lbIPConfig0": "[concat(variables('lbID0'),'/frontendIPConfigurations/LoadBalancerIPConfig')]",
        "lbPoolID0": "[concat(variables('lbID0'),'/backendAddressPools/LoadBalancerBEAddressPool')]",
        "lbProbeID0": "[concat(variables('lbID0'),'/probes/FabricGatewayProbe')]",
        "lbHttpProbeID0": "[concat(variables('lbID0'),'/probes/FabricHttpGatewayProbe')]",
        "lbNatPoolID0": "[concat(variables('lbID0'),'/inboundNatPools/LoadBalancerBEAddressNatPool')]"
    }
    

    Tambahkan bagian ini ke sumber daya Virtual Machine Scale Set:

    "networkProfile": {
                "networkInterfaceConfigurations": [
                  {
                    "name": "[concat(parameters('nicName'), '-0')]",
                    "properties": {
                      "ipConfigurations": [
                        {
                          "name": "[concat(parameters('nicName'),'-',0)]",
                          "properties": {
                            "primary": "true",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "loadBalancerInboundNatPools": [
                              {
                                "id": "[variables('lbNatPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 1)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 2)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 3)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 4)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        },
                        {
                          "name": "[concat(parameters('nicName'),'-', 5)]",
                          "properties": {
                            "primary": "false",
                            "loadBalancerBackendAddressPools": [
                              {
                                "id": "[variables('lbPoolID0')]"
                              }
                            ],
                            "subnet": {
                              "id": "[variables('subnet0Ref')]"
                            }
                          }
                        }
                      ],
                      "primary": true
                    }
                  }
                ]
              }
    
  3. Hanya untuk kluster Windows, siapkan aturan Azure Network Security Group (NSG) yang membuka port UDP/53 untuk jaringan virtual dengan nilai berikut:

    Pengaturan Nilai
    Prioritas 2000
    Nama Custom_Dns
    Sumber VirtualNetwork
    Tujuan VirtualNetwork
    Pelayanan DNS (UDP/53)
    Tindakan Izinkan
  4. Tentukan mode jaringan dalam manifes aplikasi untuk setiap layanan: <NetworkConfig NetworkType="Open">. Mode jaringan terbuka menghasilkan layanan mendapatkan alamat IP khusus. Jika mode tidak ditentukan, layanan default ke mode nat . Dalam contoh manifes berikut, NodeContainerServicePackage1 dan NodeContainerServicePackage2 layanan dapat mendengarkan pada port yang sama (kedua layanan mendengarkan pada Endpoint1). Ketika mode jaringan terbuka ditentukan, konfigurasi PortBinding tidak dapat ditentukan.

    <?xml version="1.0" encoding="UTF-8"?>
    <ApplicationManifest ApplicationTypeName="NodeJsApp" ApplicationTypeVersion="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
      <Description>Calculator Application</Description>
      <Parameters>
        <Parameter Name="ServiceInstanceCount" DefaultValue="3"></Parameter>
        <Parameter Name="MyCpuShares" DefaultValue="3"></Parameter>
      </Parameters>
      <ServiceManifestImport>
        <ServiceManifestRef ServiceManifestName="NodeContainerServicePackage1" ServiceManifestVersion="1.0"/>
        <Policies>
          <ContainerHostPolicies CodePackageRef="NodeContainerService1.Code" Isolation="hyperv">
           <NetworkConfig NetworkType="Open"/>
          </ContainerHostPolicies>
        </Policies>
      </ServiceManifestImport>
      <ServiceManifestImport>
        <ServiceManifestRef ServiceManifestName="NodeContainerServicePackage2" ServiceManifestVersion="1.0"/>
        <Policies>
          <ContainerHostPolicies CodePackageRef="NodeContainerService2.Code" Isolation="default">
            <NetworkConfig NetworkType="Open"/>
          </ContainerHostPolicies>
        </Policies>
      </ServiceManifestImport>
    </ApplicationManifest>
    

    Anda dapat mencampur dan mencocokkan mode jaringan yang berbeda di seluruh layanan dalam aplikasi untuk kluster Windows. Beberapa layanan dapat menggunakan mode Buka sementara yang lain menggunakan mode nat. Ketika layanan dikonfigurasi untuk menggunakan mode nat, port yang didengarkan layanan harus unik.

    Nota

    Pada kluster Linux, mencampur mode jaringan untuk layanan yang berbeda tidak didukung.

  5. Ketika mode Buka dipilih, definisi Titik akhir dalam manifes layanan harus secara eksplisit menunjuk ke paket kode yang sesuai dengan titik akhir, bahkan jika paket layanan hanya memiliki satu paket kode di dalamnya.

    <Resources>
      <Endpoints>
        <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" CodePackageRef="Code"/>
      </Endpoints>
    </Resources>
    
  6. Untuk Windows, boot ulang VM akan menyebabkan jaringan terbuka dibuat ulang. Ini untuk mengatasi masalah yang mendasar dalam tumpukan jaringan. Perilaku defaultnya adalah membuat ulang jaringan. Jika perilaku ini perlu dinonaktifkan, konfigurasi berikut dapat digunakan diikuti dengan peningkatan konfigurasi.

"fabricSettings": [
                {
                    "name": "Setup",
                    "parameters": [
                    {
                            "name": "SkipContainerNetworkResetOnReboot",
                            "value": "true"
                    }
                    ]
                }
            ],          

Langkah berikutnya