【问题标题】:Error while provisioning Terraform subnet using azurerm使用 azurerm 预配 Terraform 子网时出错
【发布时间】:2021-01-02 08:36:48
【问题描述】:

最近我发现我的 AKS 群集包含一个太小的子网。因此,我尝试添加第二个子网和节点池,现在可以使用 Azure CNI,然后创建一个适当的子网并将其迁移回来。

terraform plan 期间,一切顺利,有效响应,但在应用时会引发错误。

Error: Error Creating/Updating Subnet "me-test-k8s-subnet2" (Virtual Network "me-test-k8s-vnet" / Resource Group "me-test-k8s-rg"): network.SubnetsClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="NetcfgInvalidSubnet" Message="Subnet 'me-test-k8s-subnet2' is not valid in virtual network 'me-test-k8s-vnet'." Details=[]

  on main.tf line 28, in resource "azurerm_subnet" "subnet2":
  28: resource "azurerm_subnet" "subnet2" {

我原来的集群就是用Terraform这个配置创建的:

  name     = "${var.cluster_name}-rg"
  location = "${var.location}"
}

resource "azurerm_virtual_network" "network" {
  name                = "${var.cluster_name}-vnet"
  location            = "${azurerm_resource_group.rg.location}"
  resource_group_name = "${azurerm_resource_group.rg.name}"
  address_space       = ["10.1.0.0/16"]
}

resource "azurerm_subnet" "subnet" {
  name                 = "${var.cluster_name}-subnet"
  resource_group_name  = "${azurerm_resource_group.rg.name}"
  address_prefixes     = ["10.1.0.0/24"]
  virtual_network_name = "${azurerm_virtual_network.network.name}"
}

为了让事情变得更简单,我决定首先将子网添加到没有节点池的网络中。这将把我带到这个 terraform 计划:

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # azurerm_subnet.subnet2 will be created
  + resource "azurerm_subnet" "subnet2" {
      + address_prefix                                 = (known after apply)
      + address_prefixes                               = [
          + "10.2.0.0/22",
        ]
      + enforce_private_link_endpoint_network_policies = false
      + enforce_private_link_service_network_policies  = false
      + id                                             = (known after apply)
      + name                                           = "me-test-k8s-subnet2"
      + resource_group_name                            = "me-test-k8s-rg"
      + virtual_network_name                           = "me-test-k8s-vnet"
    }

希望有人能解释一下为什么会出现这个错误。

最好, 皮姆

【问题讨论】:

  • 我可能误读了您的设置,但您是否将 10.2.0.0/22 子网添加到 10.1.0.0/16 网络?即- 10.2.0.0/22 不是该网络的一部分
  • 我也面临这个问题.. 最终删除了集群并创建了一个更大的 sunbet 范围的新集群
  • @Howard_Roark 正确。我有一个无法更改的 /24 子网。但是,如果正确,我可以向网络添加第二个子网,迁移所有内容并完成。但我应该能够将 /22 子网添加到 /16 vnet 对吧?
  • 当您有一个 10.1.0.0/16 网络,该网络包含所有看起来像 10.1.x.y 的 IP(即,它们都需要以 10.1 开头)。在这里,您要添加一个不属于该范围的 10.2

标签: azure terraform azure-aks


【解决方案1】:

在虚拟网络中创建子网时,必须检查它是否没有跳出网络范围。

您的网络掩码刚刚超出范围:10.1.0.0/16

First host: 10.1.0.1    
Last  host: 10.1.255.254

您正在尝试创建子网10.2.0.0/22

例如,为了不与已创建的子网重叠,可以接受10.1.4.0/22

【讨论】:

  • 问题是/24太小了。我应该能够将 /22 子网添加到 /16 网络吧?
  • 是的,你可以使用 10.1.0.0/22,但是你会和 10.1.0.0/24 重叠
  • 谢谢,我会试一试。重叠不是直接问题,因为我要迁移到新子网。我猜在这种情况下,所有符合 vnet 的重叠内容对吗?
  • 比如10.1.4.0/22就可以了
  • 感谢@Oleh,也许是一个很好的补充,可以在解释答案中添加这个。我刚刚接受它,现在正在创建资源
【解决方案2】:

正如我的评论和某人的回答中提到的,Azure 抛出此错误是因为您尝试将 10.2.0.0/22 子网添加到 10.1.0.0/16 网络。即 10.2.0.0/22 不是该网络的一部分。

我还想指出,当您运行 plan 时,它没有向 Azure 提交实际的 API 调用来进行更改,这就是为什么在您运行计划时看起来一切正常,但 Azure 抱怨你试图应用它。我认为这个解释很好in this tutorial。适用的摘录是:

一旦您对声明的配置感到满意,您可以询问 Terraform 为其生成执行计划。计划命令在 CLI 用于从配置中生成执行计划。 执行计划会告诉您 Terraform 需要进行哪些更改 将您当前的基础设施带到您的声明状态 配置。

如果您接受该计划,您可以指示 Terraform 应用更改。 Terraform 将发出实现更改所需的 API 调用。如果出现任何问题,terraform 将不会尝试将基础架构自动回滚到运行应用之前的状态。这是因为 apply 遵守计划

【讨论】:

    【解决方案3】:

    如果您尝试将另一个 vnet 部署到已经存在具有相同地址空间的 vnet 的订阅中,您也可能会遇到类似的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 2020-07-06
      • 2020-07-26
      • 2021-10-23
      • 2021-03-19
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多