使用Azurerm设置Terraform子网时出错

时间:2020-09-15 14:47:12

标签: azure terraform azure-aks

最近我发现我的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}"
}

为了使事情变得更容易,我决定首先将子网添加到不带节点池的网络中。这将带我进入这个地形计划:

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"
    }

希望有人可以向我解释为什么会发生此错误。

最好, Pim

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如我的评论和某人的回答中所述,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之前的状态。这是因为应聘符合计划