2

我正在尝试通过 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 

子网 XX.XX.XX.144/28 计划用于 AKS。
当前的 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 模板参考

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

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

更新:
我已经尝试使用我的 Vnet/子网的值进行部署,但仍然失败:
在此处输入图像描述

更新2:

根据MS文档“使用 Azure CNI 类型创建初始集群的最小 pod 数为 30”,根据公式,在我的情况下,子网范围的数量如下:(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 地址范围。

4

2 回答 2

3

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

所以你可以使用网络节点kubelet。在这个模块中,只有节点需要在子网中的 IP 地址。只需使用此网络模块,您就可以根据需要拥有 3 个节点,并使用现有的子网,只需 8 个 IP 地址。有关更多详细信息,请参阅在 Azure Kubernetes 服务 (AKS) 中将 kubenet 网络与您自己的 IP 地址范围一起使用

于 2019-06-24T07:10:57.833 回答
1

取自文档:

子网:

必须足够大以容纳可能在集群中预配的节点、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

于 2019-06-24T05:32:28.510 回答