You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ARM模板更新Azure负载均衡器,保留旧规则新增探测与规则?

可以通过ARM模板增量更新Azure Load Balancer,无需覆盖原有规则/探测

当然可以!你遇到的问题是因为当前模板重新定义了LoadBalancer的frontendIPConfigurations和backendAddressPools属性,这会覆盖LB上原有的对应配置,而且默认情况下如果模板中没有包含原有探测/规则,ARM不会保留它们——但其实我们可以用增量部署模式,只定义需要新增的资源部分,完全不干扰原有配置。

核心要点

  1. 使用增量部署模式:ARM默认就是增量模式,但一定要确保部署时没有指定Complete模式(该模式会删除模板中未定义的所有资源)。
  2. 不要重复定义原有属性:模板中只需要包含你要新增的probes或loadBalancingRules,不要重新写frontendIPConfigurations、backendAddressPools这些已经存在的配置,避免覆盖。

修正后的模板示例(仅新增健康探测)

下面的模板只会给现有LB添加新的健康探测,完全保留原有配置:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "lbName": { "type": "string" },
    "lbLocation": { "type": "string" },
    "newHealthProbes": {
      "type": "array",
      "defaultValue": [
        {
          "name": "HealthProbe-TCP-8080",
          "protocol": "TCP",
          "port": 8080,
          "intervalInSeconds": 15,
          "numberOfProbes": 2,
          "requestPath": null
        }
      ]
    }
  },
  "resources": [
    {
      "apiVersion": "2023-05-01", // 建议使用最新API版本
      "name": "[parameters('lbName')]",
      "type": "Microsoft.Network/loadBalancers",
      "location": "[parameters('lbLocation')]",
      "properties": {
        "copy": [
          {
            "name": "probes",
            "count": "[length(parameters('newHealthProbes'))]",
            "input": {
              "name": "[parameters('newHealthProbes')[copyIndex('probes')].name]",
              "properties": {
                "protocol": "[parameters('newHealthProbes')[copyIndex('probes')].protocol]",
                "port": "[parameters('newHealthProbes')[copyIndex('probes')].port]",
                "intervalInSeconds": "[parameters('newHealthProbes')[copyIndex('probes')].intervalInSeconds]",
                "numberOfProbes": "[parameters('newHealthProbes')[copyIndex('probes')].numberOfProbes]",
                "requestPath": "[parameters('newHealthProbes')[copyIndex('probes')].requestPath]"
              }
            }
          }
        ]
      }
    }
  ]
}

新增负载均衡规则的模板示例

如果要新增LB规则,只需要在properties中添加loadBalancingRules的copy块,同样不需要覆盖原有配置:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "lbName": { "type": "string" },
    "lbLocation": { "type": "string" },
    "backendPoolName": { "type": "string" }, // 指定现有后端池名称
    "newLbRules": {
      "type": "array",
      "defaultValue": [
        {
          "name": "LBRule-TCP-8080",
          "protocol": "Tcp",
          "frontendPort": 8080,
          "backendPort": 8080,
          "probeName": "HealthProbe-TCP-8080" // 可以是现有或刚新增的探测
        }
      ]
    }
  },
  "resources": [
    {
      "apiVersion": "2023-05-01",
      "name": "[parameters('lbName')]",
      "type": "Microsoft.Network/loadBalancers",
      "location": "[parameters('lbLocation')]",
      "properties": {
        "copy": [
          {
            "name": "loadBalancingRules",
            "count": "[length(parameters('newLbRules'))]",
            "input": {
              "name": "[parameters('newLbRules')[copyIndex('loadBalancingRules')].name]",
              "properties": {
                "protocol": "[parameters('newLbRules')[copyIndex('loadBalancingRules')].protocol]",
                "frontendPort": "[parameters('newLbRules')[copyIndex('loadBalancingRules')].frontendPort]",
                "backendPort": "[parameters('newLbRules')[copyIndex('loadBalancingRules')].backendPort]",
                "frontendIPConfiguration": {
                  "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('lbName')), '/frontendIPConfigurations/LoadBalancerFrontEnd')]"
                },
                "backendAddressPool": {
                  "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('lbName')), '/backendAddressPools/', parameters('backendPoolName'))]"
                },
                "probe": {
                  "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('lbName')), '/probes/', parameters('newLbRules')[copyIndex('loadBalancingRules')].probeName)]"
                },
                "enableFloatingIP": false,
                "idleTimeoutInMinutes": 4
              }
            }
          }
        ]
      }
    }
  ]
}

部署命令示例

确保用增量模式部署,比如使用Azure CLI:

az deployment group create --resource-group your-resource-group-name --template-file ./your-template.json --mode Incremental --parameters lbName=your-lb-name lbLocation=eastus

或者PowerShell:

New-AzResourceGroupDeployment -ResourceGroupName your-resource-group-name -TemplateFile ./your-template.json -Mode Incremental -lbName your-lb-name -lbLocation eastus

关键提醒

  • 不要在模板中包含LB已有的frontendIPConfigurations、backendAddressPools等属性,否则会覆盖原有配置。
  • 使用最新的API版本(比如2023-05-01),避免兼容性问题。
  • 新增规则时,要确保引用的后端池、健康探测已经存在(可以是原有资源或本次模板新增的)。

内容的提问来源于stack exchange,提问作者Dilly B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:09:43