我正在使用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}'
答案 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。