Partilhar via

使用纯无状态节点类型部署 Azure Service Fabric 群集

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

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

现提供示例模板:Service Fabric 无状态节点类型模板

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

若要在群集资源中将一个或多个节点类型设置为无状态,请将“isStateless”属性设置为“true” 。 使用无状态节点类型部署 Service 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 自动扩缩助手

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

配置具有多个可用性区域的无状态节点类型

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

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

有关参考,请查看模板以配置具有多个可用性区域的无状态节点类型

网络要求

公共 IP 和负载均衡器资源

为了能够在虚拟机规模集资源中扩展到超过 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 地址或标准公共负载均衡器显式定义它。 有关详细信息,请参阅出站连接Azure 标准负载均衡器

注意

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

注意

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

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

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

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

应将新的 LB 和 IP 引用到您想要使用的新无状态节点类型中。 上面的示例中添加了一个新的虚拟机规模集资源,用于无状态节点类型。 这些虚拟机规模集引用新创建的 LB 和 IP,并在 Service Fabric 群集资源中被标记为无状态节点类型。

首先,需要将新资源添加到现有的资源管理器模板。 这些资源包括:

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

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

后续步骤