Terraform AKS NSG安全规则错误

时间:2019-07-19 09:02:35

标签: azure terraform

我正在使用Terraform部署AKS集群,并且工作正常。但是,当尝试向自动创建的MC *组中的AKS网络安全组添加安全规则时,它会失败,并显示以下错误:

Creating/Updating Network Security Rule "myRule" (NSG "" / Resource Group "MC_terraform-aks-rg_terraform-aks_westeurope"): network.SecurityRulesClient#CreateOrUpdate: Failure sending request: StatusCode=404 -- Original Error: Code="ResourceNotFound" Message="The Resource 'Microsoft.Network/networkSecurityGroups/securityRules' under resource group 'MC_terraform-aks-rg_terraform-aks_westeurope' was not found."[0m

如果我再次运行terraform apply,它会工作并创建规则。我以为某个地方存在竞争条件,甚至添加了一个null_resource,它可以执行几分钟的sleep命令,但是在第一次尝试时仍然出错。

main.tf

resource "azurerm_kubernetes_cluster" "aks" {
....................................
}

resource "azurerm_network_security_rule" "https" {
  name                        = "myRule"
  priority                    = 101
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "443"
  destination_port_range      = "*"
  source_address_prefixes     = "${var.imperva_ips}"
  destination_address_prefix  = "${azurerm_public_ip.ingress.ip_address}"
  resource_group_name         = "${azurerm_kubernetes_cluster.aks.node_resource_group}"
  network_security_group_name = "${data.external.aks_nsg_name.result.output}"

  #depends_on = ["azurerm_resource_group.aks", "azurerm_mysql_virtual_network_rule.mysql", "helm_release.ingress"]
  depends_on  = [null_resource.delay]
}

resource "null_resource" "delay" {
  provisioner "local-exec" {
    command = "sleep 60"
  }

  depends_on = [helm_release.ingress]
}

# get the auto-generated NSG name 
data "external" "aks_nsg_id" {
  program = [
    "bash",
    "${path.root}/scripts/aks_nsg_name.sh"
  ]

  depends_on = [azurerm_resource_group.aks]
}

提取NSG名称的bash脚本:

#!/bin/bash 
OUTPUT=$(az network nsg list --query [].name -o tsv | grep aks | head -n 1)
jq -n --arg output "$OUTPUT" '{"output":$output}'

1 个答案:

答案 0 :(得分:0)

对于AKS群集,不建议手动创建NSG规则,Azure会自动为您创建适当的规则。如果手动创建规则,可能会导致问题。请参阅以下说明:

  

一个网络安全组为VM(例如AKS)过滤流量   节点。创建服务时,例如LoadBalancer,Azure   平台自动配置任何网络安全组规则   这是必需的。不要手动配置网络安全组规则   过滤AKS集群中Pod的流量。定义任何必需的   端口和转发是Kubernetes服务清单的一部分,并且   让Azure平台创建或更新适当的规则。您可以   也将使用网络策略(如下一节所述)来   自动将流量过滤器规则应用于广告连播。

因此,我不建议您自己创建规则。有关更多详细信息,请参见AKS Network Security Group。您最好使用network policy而不是NSG规则,并且在我这方面,更建议使用网络策略。

更新

您得到的错误表明它未在节点组中找到规则。如我所见,您需要在bash中使用AKS集群的组名更改命令。不带组名使用的命令将列出订阅中的所有NSG,如果不仅有AKS集群,它将找不到您的NSG。