部署具有无状态节点类型的Azure Service Fabric群集

服务Fabric节点类型具有固有假设,即在某些时间点,有状态服务可能放置在节点上。 无状态节点类型改变了对节点类型的此假设,从而使节点类型能够利用其他功能,例如更快速的横向扩展操作、支持铜级耐久性的自动操作系统升级,以及在单个虚拟机横向扩展集中扩展到超过 100 个节点。

  • 主节点类型不能配置为无状态
  • 无状态节点类型仅支持“青铜”持续性级别
  • 无状态节点类型仅在服务Fabric运行时版本 7.1.409 或更高版本上受支持。

示例模板可用:Service Fabric无状态节点类型模板

在服务Fabric群集中启用无状态节点类型

若要在群集资源中将一个或多个节点类型设置为无状态,请将“isStateless”属性设置为“true” 。 部署具有无状态节点类型的服务Fabric群集时,请记住群集资源中至少有一个主节点类型。

  • Service Fabric 群集资源的 apiVersion 应为“2020-12-01-preview”或更高版本。
{
    "nodeTypes": [
    {
        "name": "[parameters('vmNodeType0Name')]",
        "applicationPorts": {
            "endPort": "[parameters('nt0applicationEndPort')]",
            "startPort": "[parameters('nt0applicationStartPort')]"
        },
        "clientConnectionEndpointPort": "[parameters('nt0fabricTcpGatewayPort')]",
        "durabilityLevel": "Silver",
        "ephemeralPorts": {
            "endPort": "[parameters('nt0ephemeralEndPort')]",
            "startPort": "[parameters('nt0ephemeralStartPort')]"
        },
        "httpGatewayEndpointPort": "[parameters('nt0fabricHttpGatewayPort')]",
        "isPrimary": true,
        "isStateless": false, // Primary Node Types cannot be stateless
        "vmInstanceCount": "[parameters('nt0InstanceCount')]"
    },
    {
        "name": "[parameters('vmNodeType1Name')]",
        "applicationPorts": {
            "endPort": "[parameters('nt1applicationEndPort')]",
            "startPort": "[parameters('nt1applicationStartPort')]"
        },
        "clientConnectionEndpointPort": "[parameters('nt1fabricTcpGatewayPort')]",
        "durabilityLevel": "Bronze",
        "ephemeralPorts": {
            "endPort": "[parameters('nt1ephemeralEndPort')]",
            "startPort": "[parameters('nt1ephemeralStartPort')]"
        },
        "httpGatewayEndpointPort": "[parameters('nt1fabricHttpGatewayPort')]",
        "isPrimary": false,
        "isStateless": true,
        "vmInstanceCount": "[parameters('nt1InstanceCount')]"
    }    
    ],
}

配置虚拟机规模集以用于无状态节点类型

若要启用无状态节点类型,应按以下方式配置底层虚拟机规模集资源:

  • singlePlacementGroup 属性的值应设置为 false(如果需要扩展到超过 100 个 VM)。
  • 应将规模集的 upgradePolicy 设置为滚动升级。
  • 设置为滚动升级模式时,需要配置应用健康扩展或健康探针。 有关配置运行状况探测或应用程序运行状况扩展的详细信息,请参阅此 文档。使用无状态节点类型的默认配置来配置运行状况探测,建议如下。 将应用程序部署到节点类型后,可以更改运行状况探测/运行状况扩展端口,以监视实际的应用程序运行状况。

注意

对无状态节点类型使用自动缩放时,在缩减操作后,不会自动清理节点状态。 为了在自动缩放过程中清理下线节点的状态,建议使用 Service Fabric AutoScale Helper。

{
    "apiVersion": "2019-03-01",
    "type": "Microsoft.Compute/virtualMachineScaleSets",
    "name": "[parameters('vmNodeType1Name')]",
    "location": "[parameters('computeLocation')]",
    "properties": {
        "overprovision": "[variables('overProvision')]",
        "upgradePolicy": {
          "mode": "Rolling",
          "automaticOSUpgradePolicy": {
            "enableAutomaticOSUpgrade": true
          }
        },
        "platformFaultDomainCount": 5
    },
    "virtualMachineProfile": {
    "extensionProfile": {
    "extensions": [
    {
    "name": "[concat(parameters('vmNodeType1Name'),'_ServiceFabricNode')]",
    "properties": {
        "type": "ServiceFabricNode",
        "autoUpgradeMinorVersion": false,
        "publisher": "Microsoft.Azure.ServiceFabric",
        "settings": {
            "clusterEndpoint": "[reference(parameters('clusterName')).clusterEndpoint]",
            "nodeTypeRef": "[parameters('vmNodeType1Name')]",
            "dataPath": "D:\\\\SvcFab",
            "durabilityLevel": "Bronze",
            "certificate": {
                "thumbprint": "[parameters('certificateThumbprint')]",
                "x509StoreName": "[parameters('certificateStoreValue')]"
            },
            "systemLogUploadSettings": {
                "Enabled": true
            },
        },
        "typeHandlerVersion": "1.1"
    }
    },
    {
        "type": "extensions",
        "name": "HealthExtension",
        "properties": {
            "publisher": "Microsoft.ManagedServices",
            "type": "ApplicationHealthWindows",
            "autoUpgradeMinorVersion": true,
            "typeHandlerVersion": "1.0",
            "settings": {
            "protocol": "tcp",
            "port": "19000"
            }
            }
        },
    ]
}

配置具有多个Availability Zones的无状态节点类型

若要配置跨多个可用性区域的无状态节点类型,请遵循此处的文档进行操作,并作如下一些更改:

  • 将 singlePlacementGroup 设置为 false,如果需要启用多个放置组。
  • 设置upgradePolicy为滚动,并按照上文说明添加应用程序运行状况扩展和运行状况探针。
  • 将 platformFaultDomainCount 设置为5,用于虚拟机扩展集。

要获得参考资料,请查看 template,了解如何配置具有多个可用区的无状态节点类型。

网络要求

公共 IP 和 Load Balancer 资源

为了能够在虚拟机规模集资源中扩展到超过 100 个 VM,该虚拟机规模集所引用的负载均衡器和 IP 资源必须都使用标准 SKU。 在没有 SKU 属性的情况下创建 IP 资源会创建基本 SKU,不支持扩展到 100 多个 VM。 默认情况下,标准 SKU 负载均衡器会阻止外部的所有流量;若要允许外部流量,必须将 NSG 部署到子网。

{
    "apiVersion": "2018-11-01",
    "type": "Microsoft.Network/publicIPAddresses",
    "name": "[concat('LB','-', parameters('clusterName')]",
    "location": "[parameters('computeLocation')]",
    "sku": {
        "name": "Standard"
    }
}
{
    "apiVersion": "2018-11-01",
    "type": "Microsoft.Network/loadBalancers",
    "name": "[concat('LB','-', parameters('clusterName')]", 
    "location": "[parameters('computeLocation')]",
    "dependsOn": [
        "[concat('Microsoft.Network/networkSecurityGroups/', concat('nsg', parameters('subnet0Name')))]"
    ],
    "properties": {
        "addressSpace": {
            "addressPrefixes": [
                "[parameters('addressPrefix')]"
            ]
        },
        "subnets": [
        {
            "name": "[parameters('subnet0Name')]",
            "properties": {
                "addressPrefix": "[parameters('subnet0Prefix')]",
                "networkSecurityGroup": {
                "id": "[resourceId('Microsoft.Network/networkSecurityGroups', concat('nsg', parameters('subnet0Name')))]"
              }
            }
          }
        ]
    },
    "sku": {
        "name": "Standard"
    }
}

注意

无法在公共 IP 和负载均衡器资源上就地更改 SKU。

虚拟机规模集 NAT 规则

负载均衡器的入站 NAT 规则应与虚拟机扩展集中 NAT 池相匹配。 每个虚拟机规模集必须有一个唯一的入站 NAT 池。

{
"inboundNatPools": [
    {
        "name": "LoadBalancerBEAddressNatPool0",
        "properties": {
            "backendPort": "3389",
            "frontendIPConfiguration": {
                "id": "[variables('lbIPConfig0')]"
            },
            "frontendPortRangeEnd": "50999",
            "frontendPortRangeStart": "50000",
            "protocol": "tcp"
        }
    },
    {
        "name": "LoadBalancerBEAddressNatPool1",
        "properties": {
            "backendPort": "3389",
            "frontendIPConfiguration": {
                "id": "[variables('lbIPConfig0')]"
            },
            "frontendPortRangeEnd": "51999",
            "frontendPortRangeStart": "51000",
            "protocol": "tcp"
        }
    },
    {
        "name": "LoadBalancerBEAddressNatPool2",
        "properties": {
            "backendPort": "3389",
            "frontendIPConfiguration": {
                "id": "[variables('lbIPConfig0')]"
            },
            "frontendPortRangeEnd": "52999",
            "frontendPortRangeStart": "52000",
            "protocol": "tcp"
        }
    }
    ]
}

标准 SKU 的负载均衡器出站规则

与基本 SKU 相比,标准公共 IP 为出站连接引入了新的功能和不同的行为。 如果希望在使用标准 SKU 时建立出站连接,则必须使用标准公共 IP 地址或标准公共Load Balancer显式定义出站连接。 有关详细信息,请参阅 出站连接 和 Azure Standard Load Balancer。

注意

标准模板引用默认情况下允许所有出站流量的 NSG。 入站流量仅限于Service Fabric管理操作所需的端口。 你可以根据需要对 NSG 规则进行修改。

注意

任何使用标准 SKU SLB 的服务 Fabric 群集都需要确保每个节点类型都有允许端口 443 上的出站流量的规则。 这是完成群集设置所必需的,没有此类规则的任何部署都将失败。

迁移为在群集中使用无状态节点类型

对于所有迁移方案,都需要添加一个新的纯无状态节点类型。 现有节点类型不能迁移为仅无状态。

若要迁移使用具有基本 SKU 的 IP 的群集,必须先使用标准 SKU 创建全新的 IP 资源。 无法就地更新这些资源。

应将新的 LB 和 IP 引用到您想要使用的新无状态节点类型中。 上面的示例中添加了一个新的虚拟机规模集资源,用于无状态节点类型。 这些虚拟机规模设置引用新创建的负载均衡器(LB)和 IP,并在服务构架集群资源中标记为无状态节点类型。

首先,需要将新资源添加到现有Resource Manager模板。 这些资源包括:

  • 使用标准 SKU 的公共 IP 资源。
  • 使用标准 SKU 的Load Balancer资源。
  • 由在其中部署虚拟机规模集的子网所引用的 NSG。

资源完成部署后,你就可以开始禁用要从原始群集中删除的节点类型中的节点。

后续步骤