【问题标题】:How to assign only one static public IP to AKS-multiAZ Loadbalancer如何仅将一个静态公共 IP 分配给 AKS-multi AZ 负载均衡器
【发布时间】:2020-05-17 02:22:51
【问题描述】:

我正在设置一个多可用区 AKS 集群,我想将我创建的静态公共 IP 分配给此负载均衡器。这是我所拥有的:

#### Creating a Public static IP ####
resource "azurerm_public_ip" "lb-public-ip1" {
  name                = "${var.public_ip_name}"
  location            = "${var.location}"
  resource_group_name = "${var.resource_group_name}"
  allocation_method   = "Static"
  ip_version          = "IPv4"
  sku                 = "standard"
  #domain_name_label   =
  tags = {
    Environment = "${var.environment}"
    owner       = "${var.resource_owner}"
    created-by  = "${var.policy_created_by}"
  }
  depends_on    = ["null_resource.module_depends_on"]
}
data "azurerm_public_ip" "lb-public-ip1" {
  name                = "${azurerm_public_ip.lb-public-ip1.name}"
  resource_group_name = "${azurerm_public_ip.lb-public-ip1.resource_group_name}"
  depends_on          = ["null_resource.module_depends_on"]
}
resource "null_resource" "module_depends_on" {
  triggers = {
    value = "${length(var.module_depends_on)}"
  }
}

#### Creating AKS Cluster ####
resource "azurerm_kubernetes_cluster" "k8s" {
    name                = "${var.cluster_name}"
    location            = "${var.location}"
    resource_group_name = "${var.resource_group_name}"
    dns_prefix          = "${var.dns_prefix}"
    kubernetes_version  = "1.14.8"
    linux_profile {
        admin_username = "ubuntu"

        ssh_key {
            key_data = "${var.key_data}"
        }
    }

    default_node_pool {
        availability_zones    = ["1","2"]
        enable_auto_scaling   = true 
        enable_node_public_ip = false 
        max_count             = "8" 
        min_count             = "2" 
        name                  = "default" 
        node_count            = "${var.node_count}"  
        os_disk_size_gb       = "${var.os_disk_size}" 
        type                  = "VirtualMachineScaleSets" 
        vm_size               = "Standard_DS2_v2"
       }

    role_based_access_control {
          enabled = true
    }
    service_principal {
        client_id      = "${var.client_id}"
        client_secret  = "${var.client_secret}"
    }
    addon_profile {
        kube_dashboard {
              enabled = true
        }
        oms_agent {
        enabled                    = "${var.oms_agent_activation}"
        log_analytics_workspace_id = "${var.log_analytics_workspace_id}"
        }
    }
    network_profile {
        network_plugin    = "kubenet"
        load_balancer_sku = "Standard"
        load_balancer_profile {
            outbound_ip_address_ids = [ "${azurerm_public_ip.lb-public-ip1.id}" ]

        }
    }
    tags = {
        Environment = "${var.environment}"
        Name        = "${var.cluster_name}"
        owner       = "${var.resource_owner}"
        created-by  = "${var.policy_created_by}"
    }
    depends_on       = [azurerm_public_ip.lb-public-ip1]
}

通过此设置,它创建了一个名为 kubernetes 的 AKS 集群和 LoadBalancer,并将我创建的静态公共 IP 分配给 LoadBalancer,而没有任何分配的 LB 规则,我可以在“前端 IP 配置”下看到它还创建了另一个IP 和所有 LoadBalancer 规则和 HealthProbe 都分配给自动创建的 IP。此外还创建了两个后端池:kubernetes (2 VMs) 和 aksOutboundBackendPool(2 VMs)

在 Azure 文档中它说:“默认情况下,如果未指定公共 IP、公共 IP 前缀或 IP 数量,将自动在与 AKS 群集相同的资源组中创建一个公共 IP。”但就我而言,我已经指定了 PublicIP!

我想知道为什么它自己创建了另一个 IP? 如何跳过自动创建的 IP 并仅使用我创建并分配给 loadbalancer-profile 的 IP,以及 AKS 如何将 LoadBalancer 规则和运行状况探测分配给我分配的 IP?

拥有多个公共 IP 有什么需要?

最后,我将使用分配的 PublicIP 到 istio 入口网关。这就是为什么我只需要一个特定的公共 IP。

我应该使用哪个后端池?

我只需要一个对 Prod Env 具有高可用性的 AKS 集群,以防一个区域中的集群出现故障,它会启动第二个区域中的集群。

任何帮助将不胜感激。

【问题讨论】:

  • 您使用的是什么版本的 Terraform 和提供程序?
  • @AndyShinn 提供者是“azurerm v1.42.0”和 Terraform v0.12.19
  • 还有问题吗?它解决了你的问题吗?如果是,请接受。如果没有,请给出答复。

标签: azure terraform azure-aks azure-load-balancer


【解决方案1】:

据我所知,当您创建 AKS 并创建一个静态公共 IP 以通过 Terraform 分配给其出站时,您只需要创建一个公共 IP 和 AKS 集群,不需要使用 data 源和null_resource。所以你的代码可以改成这样:

#### Creating a Public static IP ####
resource "azurerm_public_ip" "lb-public-ip1" {
  name                = "${var.public_ip_name}"
  location            = "${var.location}"
  resource_group_name = "${var.resource_group_name}"
  allocation_method   = "Static"
  ip_version          = "IPv4"
  sku                 = "standard"
  #domain_name_label   =
  tags = {
    Environment = "${var.environment}"
    owner       = "${var.resource_owner}"
    created-by  = "${var.policy_created_by}"
  }
}


#### Creating AKS Cluster ####
resource "azurerm_kubernetes_cluster" "k8s" {
    name                = "${var.cluster_name}"
    location            = "${var.location}"
    resource_group_name = "${var.resource_group_name}"
    dns_prefix          = "${var.dns_prefix}"
    kubernetes_version  = "1.14.8"
    linux_profile {
        admin_username = "ubuntu"

        ssh_key {
            key_data = "${var.key_data}"
        }
    }

    default_node_pool {
        availability_zones    = ["1","2"]
        enable_auto_scaling   = true 
        enable_node_public_ip = false 
        max_count             = "8" 
        min_count             = "2" 
        name                  = "default" 
        node_count            = "${var.node_count}"  
        os_disk_size_gb       = "${var.os_disk_size}" 
        type                  = "VirtualMachineScaleSets" 
        vm_size               = "Standard_DS2_v2"
       }

    role_based_access_control {
          enabled = true
    }
    service_principal {
        client_id      = "${var.client_id}"
        client_secret  = "${var.client_secret}"
    }
    addon_profile {
        kube_dashboard {
              enabled = true
        }
        oms_agent {
        enabled                    = "${var.oms_agent_activation}"
        log_analytics_workspace_id = "${var.log_analytics_workspace_id}"
        }
    }
    network_profile {
        network_plugin    = "kubenet"
        load_balancer_sku = "Standard"
        load_balancer_profile {
            outbound_ip_address_ids = [ "${azurerm_public_ip.lb-public-ip1.id}" ]

        }
    }
    tags = {
        Environment = "${var.environment}"
        Name        = "${var.cluster_name}"
        owner       = "${var.resource_owner}"
        created-by  = "${var.policy_created_by}"
    }
    depends_on       = [azurerm_public_ip.lb-public-ip1]
}

会有两个后端池:aksOutboundBackendPool 和 kubernetes,以及一个出站规则:aksOutboundRule。没有 lb 规则和探测。应该是其他原因造成的。

【讨论】:

  • 谢谢。是的,我最后做了同样的事情,尽管我可以看到 azure 在负载均衡器下创建了一个公共 IP。所以我在 FrontendIPConfiguration 下看到了两个 IP,一个是我创建的静态 IP,另一个是自动创建的 IP,我看不出 Azure 在分配一个 IP 时应该自动创建 IP 的任何原因。是的,正如您所说,该规则是后来由 Istio 创建的。
  • @Matrix 如果我理解正确,那么此默认 IP 用于出站连接,否则您将无法从节点访问 Internet。这是因为 AKS 不为每个节点提供外部 IP(例如 DigitalOcean,每个 droplet 都有公共 IP),所以所有 aksOutboundBackendPool 节点连接都使用 aksOutboundRule 进行 NAT,该默认 IP 用作前端。如果您从任何节点执行例如# curl ifconfig.io,您可以对其进行测试,您会看到您的 IP 是默认 IP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2018-08-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多