【问题标题】:Azure AKS deployment raised an "InsufficientSubnetSize" errorAzure AKS 部署引发“InsufficientSubnetSize”错误
【发布时间】:2019-11-05 21:04:52
【问题描述】:

我正在尝试通过 ARM 模板部署 Azure AKS 实例。
我需要将 AKS 实例集成到现有 Vnet。
我有一个用于 AKS 服务的专用子网。
但是,部署失败并出现以下错误:

{"code":"DeploymentFailed","message":"At least one resource deployment operation  failed.  
Please list deployment operations for details. Please see  
https://aka.ms/arm-debug for usage details.","details":  
[{"code":"BadRequest","message":"{\r\n \"code\": \"InsufficientSubnetSize\",\r\n  
\"message\": \"Pre-allocated IPs 93 exceeds IPs available in Subnet 11\",\r\n  
\"target\": \"agentPoolProfile.count\"\r\n}"}]}  

我正在为 Vnet 使用以下地址空间:XX.XX.XX.0/24 (XX.XX.XX.0 - XX.XX.XX.255,它有 256 个地址。
我在这个 Vnet 中有一组专用子网,每个 /28 掩码(11+5 地址深度):

XX.XX.XX.0/28  
XX.XX.XX.16/28  
XX.XX.XX.64/28  
XX.XX.XX.128/28  
XX.XX.XX.144/28  
XX.XX.XX.160/28  
XX.XX.XX.176/28 

计划在 AKS 中使用子网 XX.XX.XX.144/28。
当前的 AKS 实例 ARM 模板如下:

"resources": [
        {
            "type": "Microsoft.ContainerService/managedClusters",
            "apiVersion": "2019-04-01",
            "name": "[parameters('resourceName')]",
            "location": "[parameters('location')]",
            "dependsOn": [],
            "tags": {},
            "properties": {
                "kubernetesVersion": "[parameters('kubernetesVersion')]",
                "enableRBAC": "[parameters('enableRBAC')]",
                "dnsPrefix": "[parameters('dnsPrefix')]",
                "agentPoolProfiles": [
                    {
                        "name": "agentpool",
                        "osDiskSizeGB": "[parameters('osDiskSizeGB')]",
                        "count": "3",
                        "vmSize": "[parameters('agentVMSize')]",
                        "osType": "[parameters('osType')]",
                        "storageProfile": "ManagedDisks",
                        "maxPods": "30",
                        "vnetSubnetID": "/subscriptions/XXXXX/resourceGroups/XXXX/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/akssubnet"
                    }
                ],
                "servicePrincipalProfile": {
                    "ClientId": "[parameters('servicePrincipalClientId')]",
                    "Secret": "[parameters('servicePrincipalClientSecret')]"
                },
                "networkProfile": {
                    "networkPlugin": "azure",
                    "serviceCidr": "10.0.0.0/16",
                    "dnsServiceIP": "10.0.0.10",
                    "dockerBridgeCidr": "172.17.0.1/16"
                },
                "addonProfiles": {
                    "httpApplicationRouting": {
                        "enabled": "[parameters('enableHttpApplicationRouting')]"
                    },
                    "omsagent": {
                        "enabled": "[parameters('enableOmsAgent')]",
                        "config": {
                            "logAnalyticsWorkspaceResourceID": "[parameters('omsWorkspaceId')]"
                        }
                    }
                }
            }
        },        
            "subscriptionId": "[split(parameters('omsWorkspaceId'),'/')[2]]",
            "resourceGroup": "[split(parameters('omsWorkspaceId'),'/')[4]]"
        }
    ]

根据以下文章设置网络配置文件参数:Microsoft.ContainerService managedClusters template reference

10.0.0.0/16 的 CIDR 属于私有范围,不会干扰我现有的 Vnet 范围。

我需要有关如何处理此部署错误的建议。

更新:
我已经尝试使用我的 Vnet/子网的值进行部署,但仍然失败:

更新2:

根据MS 文档“使用 Azure CNI 类型创建初始集群的最小 pod 数为 30”,根据formula,在我的情况下,这导致以下子网范围数:(number of nodes + 1) + ((number of nodes + 1) * maximum pods per node that you configure) = (3+1) + ((3+1)*30) = 124

因此,即使在 ARM 模板中将 pod 的数量设置为 1,30 的乘数也将始终存在。

更新3:

但是,由于我无法扩展现有子网范围,因此我设法使用以下配置部署了 AKS 实例:

"parameters": {
 "SvcCidr": {
      "type": "string",
      "defaultValue": "10.0.0.0/16",
      "metadata": {
        "description": "Maximum number of pods that can run on a node."
      }
    },
    "PodCidr": {
      "type": "string",
      "defaultValue": "10.244.0.0/16",
      "metadata": {
        "description": "Maximum number of pods that can run on a node."
      }
    },
    "DnsSvcIP": {
      "type": "string",
      "defaultValue": "10.0.0.10",
      "metadata": {
        "description": "Maximum number of pods that can run on a node."
      }
    },
    "DockerCidr": {
      "type": "string",
      "defaultValue": "",

"variables": {
    "vnetSubnetId": "[resourceId(resourceGroup().name, 'Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('vnetSubnetName'))]",

"resources": [
{
      "type": "Microsoft.ContainerService/managedClusters",
 "agentPoolProfiles": [
          {
      "vnetSubnetID": "[variables('vnetSubnetId')]",
 "networkProfile": {
          "networkPlugin": "[parameters('NetPlugin')]",
          "serviceCidr": "[parameters('SvcCidr')]",
          "podCidr": "[parameters('PodCidr')]",
          "DNSServiceIP": "[parameters('DnsSvcIP')]",
          "dockerBridgeCidr": "[parameters('DockerCidr')]"

这导致我的子网范围 IP 地址仅提供给集群节点,而 pod 将使用私有 IP 地址范围。

【问题讨论】:

    标签: azure azure-resource-manager azure-aks cidr vnet


    【解决方案1】:

    对于您的问题,当您使用 azure 模块网络时,正如它在其他答案中显示的计算方法一样,您的子网可能只有一个节点。但实际上,您的子网的 IP 地址数量对于一个节点来说是不够的。因为默认情况下已经有 Pod 在创建 AKS 集群时需要 IP 地址,例如 metric server 等。

    所以你可以使用网络节点 kubelet。在这个模块中,只有节点需要在子网中的 IP 地址。只需使用此网络模块,您就可以根据需要拥有 3 个节点,并使用现有的子网,只需 8 个 IP 地址。详情请见Use kubenet networking with your own IP address ranges in Azure Kubernetes Service (AKS)

    【讨论】:

    • 如果我理解正确,您建议切换到 kubenet 而不是 Azure CNI。但是,kubenet 不支持 Vnet 集成,这在我的情况下是强制性要求。您能否确认使用 kubenet 可以将 AKS 集群集成到我现有的 Vnet 中?
    • @Sergey 为什么不呢?您可以像使用 azure 网络模块一样使用子网 ID。
    • 由于在部署过程中使用 kubenet 时省略了“vnetSubnetID”参数,请您告知以下哪个值必须替换为我现有的 Vnet 子网范围 - Pod CIDR 或 Service CIDR?
    • @Sergey 即使您什么也不做,它也会起作用。 Pod 将使用 NAT 方式通过节点 IP 与外部通信。只需将 networkPlugin 更改为值 kubelet
    • 请查看我的初始帖子已更新。感谢您的建议,由于限制,我已切换到此方法。
    【解决方案2】:

    取自文档:

    子网:

    必须足够大以容纳节点、Pod 和所有 Kubernetes 和 Azure 资源可能在您的 簇。例如,如果您部署内部 Azure 负载均衡器, 它的前端 IP 是从集群子网分配的,而不是公共的 IP。子网大小还应考虑升级操作 或未来的扩展需求。计算最小子网大小 包括用于升级操作的附加节点:(节点数 + 1) + ((节点数 + 1) * 您配置的每个节点的最大 pod)

    50 节点集群的示例:(51) + (51 * 30 (默认)) = 1,581 (/21 或更大)

    50 节点集群的示例,其中还包括扩展配置 额外的 10 个节点:(61) + (61 * 30 (默认)) = 1,891 (/21 或 更大)

    如果您在创建时未指定每个节点的最大 pod 数 在您的集群中,每个节点的最大 pod 数设置为 30。 所需的最小 IP 地址数基于该值。如果你 根据不同的最大值计算您的最低 IP 地址要求 值,查看如何配置每个节点的最大 pod 数来设置 部署集群时的此值。

    这意味着对于您的情况,您至少需要 30*4 + 4 = 124 个 IP 地址才能使其正常工作,但请记住,如果您想添加 4 个节点并升级它是行不通的。如果你想扩展到 5 个节点,它就行不通。另外,这么小的子网有什么意义呢?您无需为子网大小付费,因此使它们相当大不是问题

    意味着你需要 /25,技术上。 128-4(由 azure 保留)= 124 ;)

    阅读:https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni#plan-ip-addressing-for-your-cluster

    【讨论】:

    • 您能否澄清一下 - “vnetSubnetID”的值和“serviceCidr”的值应该在同一个 Vnet 中但属于不同的子网?或者“serviceCidr”必须是“vnetSubnetID”的“一部分”?
    • 不,这些都不能重叠,并且 serviceCidr 是一个虚拟 ip 范围,它不必在子网内(实际上最好不要在任何子网范围内)。 vnetsubnetid - vnet kubernetes 工作节点的 resourceId 获取配置。 servicecidr - Kubernetes 上 Pod 的虚拟 IP 范围
    • 太好了,谢谢。根据您上面的计算,保留我的初始设置(vnetSubnetID XX.XX.XX.144/28,serviceCidr 10.0.0.0/16),参数“maxPods”设置为“1”(因为它在范围 1 内-110) 部署应该没问题。 IP 数量为 1*4+4 = 8,与我的 /28 掩码匹配。但是它失败了,并且(相同的)错误清楚地表明:在部署期间,预先分配了 93 个 IP,但在指定的子网中,只有可用的数字是 11。所以问题是 - 如果数字 8,为什么要计算数字 93一定是?我的配置有什么问题,我无法理解。
    • 你的最大 pods 设置为 30,设置为 1 没有意义。每个节点只能有 1 个容器
    • 要求离开 cmets 区域的聊天会话
    猜你喜欢
    • 2022-12-05
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多