【问题标题】:How to create network tags for GKE nodes in Terraform如何在 Terraform 中为 GKE 节点创建网络标签
【发布时间】:2022-06-14 17:39:15
【问题描述】:

我们随后利用 Terraform 中的 GCP 网络和 GKE 模块来创建 VPC 和 GKE 集群。现在我们想创建一个防火墙规则,目标是 GKE 节点。我们不想更新自动创建的现有防火墙规则,因为 GCP 用来命名它们的格式将来可能会发生变化,因为我们的逻辑可能会失败。这就是为什么需要创建单独的防火墙规则以及指向 GKE 节点的单独网络标记的原因。模块信息

VPC

module "vpc" {
  source       = "terraform-google-modules/network/google"
  #version      = "~> 2.5"
  project_id   = var.project_id
  network_name = "${var.project_name}-${var.env_name}-vpc"
  subnets = [
    {
      subnet_name   = "${var.project_name}-${var.env_name}-subnet"
      subnet_ip     = "${var.subnetwork_cidr}"
      subnet_region = var.region
    }
  ]
  secondary_ranges = {
    "${var.project_name}-${var.env_name}-subnet" = [
      {
        range_name    = "${var.project_name}-gke-pod-ip-range"
        ip_cidr_range = "${var.ip_range_pods_cidr}"
      },
      {
        range_name    = "${var.project_name}-gke-service-ip-range"
        ip_cidr_range = "${var.ip_range_services_cidr}"
      }
    ]
  }
}

GKE_CLUSTER

module "gke" {
  source                 = "terraform-google-modules/kubernetes-engine/google//modules/beta-private-cluster"
  project_id             = var.project_id
  name                   = "${var.project_name}-gke-${var.env_name}-cluster"
  regional               = true
  region                 = var.region
  zones                  = ["${var.region}-a", "${var.region}-b", "${var.region}-c"]
  network                = module.vpc.network_name
  subnetwork             = module.vpc.subnets_names[0]
  ip_range_pods          = "${var.project_name}-gke-pod-ip-range"
  ip_range_services      = "${var.project_name}-gke-service-ip-range"
  http_load_balancing        = false
  network_policy             = false
  horizontal_pod_autoscaling = true
  filestore_csi_driver       = false
  enable_private_endpoint    = false
  enable_private_nodes       = true
  master_ipv4_cidr_block     = "${var.control_plane_cidr}"
  istio                      = false
  cloudrun                   = false
  dns_cache                  = false
  node_pools = [
    {
      name                      = "${var.project_name}-gke-node-pool"
      machine_type              = "${var.machine_type}"
      node_locations            = "${var.region}-a,${var.region}-b,${var.region}-c"
      min_count                 = "${var.node_pools_min_count}"
      max_count                 = "${var.node_pools_max_count}"
      disk_size_gb              = "${var.node_pools_disk_size_gb}"
    #   local_ssd_count           = 0
    #   spot                      = false
    #   local_ssd_ephemeral_count = 0
    #   disk_type                 = "pd-standard"
    #   image_type                = "COS_CONTAINERD"
    #   enable_gcfs               = false
      auto_repair               = true
      auto_upgrade              = true
    #   service_account           = "project-service-account@<PROJECT ID>.iam.gserviceaccount.com"
      preemptible               = false
    #   initial_node_count        = 80
    }
  ]

  # node_pools_tags = {
  #   all = []

  #   default-node-pool = ["default-node-pool",]
  # }
}

防火墙

module "firewall_rules" {
  source       = "terraform-google-modules/network/google//modules/firewall-rules"
  project_id   = var.project_id
  network_name = module.vpc.network_name

  rules = [{
    name                    = "allow-istio-ingress"
    description             = null
    direction               = "INGRESS"
    priority                = null
    ranges                  = ["${var.control_plane_cidr}"]
    source_tags             = null
    source_service_accounts = null
    target_tags             = null
    target_service_accounts = null
    allow = [{
      protocol = "tcp"
      ports    = ["15017"]
    }]
    deny = []
    log_config = {
      metadata = "INCLUDE_ALL_METADATA"
    }
  }]

  depends_on = [module.gke]
}

虽然 GKE 模块有 tags 属性来显式定义标签,但我们仍然需要帮助来正确实例化它,然后在防火墙模块中获取相同的标签值。

【问题讨论】:

  • GKE 模块的标签来自哪里? firewallgke 模块是否共享状态文件?它们是否位于同一个根模块中?
  • 是的,两个模块都在同一个 main.tf 文件中,共享同一个根文件夹。预定义的标签由 GKE 自动创建,名称格式在此线程 stackoverflow.com/q/72545315/9548311 中定义
  • 您是否为gke 模块定义了任何输出?
  • gke 模块没有输出

标签: google-cloud-platform terraform terraform-provider-gcp gke-networking


【解决方案1】:

我为我之前发布的问题找到了一个可行的解决方案。请参考 GKE 模块 sn-p。这样,我们只需要修改下面的部分,就会创建一个显式的网络标签来指向该节点池中的所有节点。

module "gke" {
  .
  .
  node_pools = [
    {
      name = "gke-node-pool"
      .
      .
      .
    },
  ]

  node_pools_tags = {
    "gke-node-pool" = "gke-node-pool-network-tag"
  }
}

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 2020-12-01
    • 2023-03-03
    • 1970-01-01
    • 2020-08-22
    • 2020-12-07
    • 2019-01-20
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多