2

我正在使用 Terraform azurerm 提供程序版本 1.19 创建 AKS 群集。我想在创建集群时指定网络安全组规则,但我不知道如何引用创建的安全组,因为生成的安全组的名称是随机数。

就像是:

aks-agentpool-33577837-nsg

有没有办法引用创建的 nsg 或至少输出名称中使用的随机数?

创建集群的配置:

resource "azurerm_resource_group" "k8s" {
  name     = "${var.resource_group_name}"
  location = "${var.location}"
}

resource "azurerm_kubernetes_cluster" "k8s" {
  name                = "${var.cluster_name}"
  location            = "${azurerm_resource_group.k8s.location}"
  resource_group_name = "${azurerm_resource_group.k8s.name}"
  dns_prefix          = "${var.dns_prefix}"
  kubernetes_version  = "${var.kubernetes_version}"

  linux_profile {
    admin_username = "azureuser"

    ssh_key {
      key_data = "${file("${var.ssh_public_key}")}"
    }
  }

  agent_pool_profile {
    name    = "default"
    count   = "${var.agent_count}"
    vm_size = "${var.vm_size}"
    os_type = "Linux"
  }

  service_principal {
    client_id     = "${var.client_id}"
    client_secret = "${var.client_secret}"
  }

  tags {
    source      = "terraform"
    environment = "${var.environment}" 
  }
}

这会生成一个安全组,我想向其中添加其他规则。这是我想添加的一条规则,以便可以检查 nginx-controller 的 liveness 探针。

resource "azurerm_network_security_rule" "nginx_liveness_probe" {
  name                        = "nginx_liveness"
  priority                    = 100 
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "*"
  destination_port_range      = "${var.nginx_liveness_probe_port}"
  source_address_prefix       = "*"
  destination_address_prefix  = "*"
  resource_group_name         = "${azurerm_kubernetes_cluster.k8s.node_resource_group}"
  network_security_group_name = How do I reference the auto-generated nsg ?
  description = "Allow access to nginx liveness probe"
}
4

3 回答 3

3

回答您的问题的解决方案:

data "azurerm_resources" "example" {
  resource_group_name = azurerm_kubernetes_cluster.example.node_resource_group

  type = "Microsoft.Network/networkSecurityGroups"
}

output name_nsg {
    value = data.azurerm_resources.example.resources.0.name
}

resource "azurerm_network_security_rule" "example" {
  name                        = "example"
  priority                    = 100
  direction                   = "Outbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "*"
  destination_port_range      = "*"
  source_address_prefix       = "*"
  destination_address_prefix  = "*"
  resource_group_name         = azurerm_kubernetes_cluster.example.node_resource_group
  network_security_group_name = data.azurerm_resources.example.resources.0.name
}

..然后以同样的方式添加所有规则。

一般来说,最好并建议使用 Azure Kubernetes 服务对 Kubernetes 服务的创建做出反应的自动化方式,而不是使用更多的 Terraform(尽管 Kubernetes yaml 也可以与Kubernetes Terraform 提供程序一起使用):

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

在当前设置中应该可以通过简单地为您想要公开的那些端口创建一个 Kubernetes 服务来实现。

例如,当我部署一个入口控制器时,Kubernetes 服务的创建会触发一个 IP 地址/负载均衡器及其 NSG 的创建:

apiVersion: v1
kind: Service
metadata:
  name: ingress-ingress-nginx-controller
  namespace: ingress
spec:
  loadBalancerSourceRanges:
  - 8.8.8.8/32
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: http
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer

通过创建映射到所需 pod 端口并指定 loadBalancerSourceRanges 的 Kubernetes 服务(类型 LoadBalancer),可以为您的自定义目标指定类似的设置。

apiVersion: v1
kind: Service
metadata:
  name: mycustomservice
  namespace: myownnamespace
spec:
  loadBalancerSourceRanges:
  - 8.8.8.8/32 # your source IPs
  - 9.9.9.9/32
  ports:
  - name: myaccessport
    port: 777
    protocol: TCP
    targetPort: mydestinationport
  selector:
    app.kubernetes.io/name: myapp
  type: LoadBalancer

另请参阅azurerm 提供程序 GitHub 中的问题

于 2021-01-27T15:19:38.090 回答
1

这里有点晚了,但刚刚遇到了这个问题。因此,对于仍在寻找解决方案的任何人,这就是我最终为获得 AKS NSG 名称所做的事情:

将此添加到预配 AKS 的 *.tf 文件中:

resource "azurerm_network_security_rule" "http" {
  name                        = "YOUR_NAME"
  priority                    = 102
  direction                   = "Inbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "80"
  destination_port_range      = "*"
  source_address_prefixes     = "${var.ips}"
  destination_address_prefix  = "${azurerm_public_ip.ingress.ip_address}"
  resource_group_name         = "${azurerm_kubernetes_cluster.test.node_resource_group}"
  network_security_group_name = "${data.external.aks_nsg_name.result.output}"

  depends_on = ["azurerm_resource_group.test"]
}

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

  depends_on = [azurerm_resource_group.test]
}

在您的项目中创建 aks_nsg_name.sh 并添加以下内容:

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

于 2019-07-18T12:01:41.607 回答
0

azurerm_resource_group我假设您的 AKC 已添加到您使用 Terraform 配置的 . 如果是这样,您可以将azurerm_network_security_group具有任意数量的自定义添加azurerm_network_security_rule到该资源组,如此处详述

例子:

resource "azurerm_resource_group" "test" {
  name     = "acceptanceTestResourceGroup1"
  location = "West US"
}

resource "azurerm_network_security_group" "test" {
  name                = "acceptanceTestSecurityGroup1"
  location            = "${azurerm_resource_group.test.location}"
  resource_group_name = "${azurerm_resource_group.test.name}"
}

resource "azurerm_network_security_rule" "test" {
  name                        = "test123"
  priority                    = 100
  direction                   = "Outbound"
  access                      = "Allow"
  protocol                    = "Tcp"
  source_port_range           = "*"
  destination_port_range      = "*"
  source_address_prefix       = "*"
  destination_address_prefix  = "*"
  resource_group_name         = "${azurerm_resource_group.test.name}"
  network_security_group_name = "${azurerm_network_security_group.test.name}"
}

不幸的name是,网络安全组数据源需要该参数,并且似乎不支持通配符,否则这也是一种选择。

于 2018-12-04T10:23:38.007 回答