You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCP中Terraform配置MIG自定义指标扩缩容的指标范围问题

GCP MIG自动扩缩容:自定义指标聚合范围配置问题

问题背景

通过Terraform创建GCP托管实例组(MIG)并基于自定义指标实现自动扩缩容时,自动扩缩容信号的「Metric export scope」默认设置为「time series per instance」,需要将其改为「Single time series per group」,但未找到实现方法。

当前效果:
当前效果

期望效果:
期望效果

当前Terraform代码

main.tf

resource "google_compute_instance_template" "mig-template" {
  name           = "${lower(var.environment)}-${var.service_name}-launch-template${var.name_suffix}"
  machine_type   = var.machine_type 
  can_ip_forward = false
  metadata_startup_script = var.startup_script 
  tags           = ["nomad"]

  disk {
    source_image = data.google_compute_image.debian_buster.id
    auto_delete = true
    disk_size_gb = var.disk_size_gb
    device_name = "xvda"
  }

  network_interface {
    network = data.google_compute_network.my-network.id
    subnetwork  = data.google_compute_subnetwork.my-subnetwork.id
  }

  service_account {
    email  = google_service_account.nomad_service_account.email
    scopes = ["cloud-platform"]
  }

  labels = merge(var.default_tags,
      {
        a_type   = var.type
        environment = var.environment
        autoscale   = "true"
      }
  )
}

# 创建自定义CPU指标
resource "google_monitoring_metric_descriptor" "cpu_metrics" {
  description     = "Nomad实例未分配CPU"
  display_name    = "nomad_client_unallocated_cpu"
  type            = "custom.googleapis.com/${var.telegraf_namespace}/nomad_client/unallocated_cpu"
  metric_kind     = "GAUGE"
  value_type      = "DOUBLE"
  unit            = "MHz"
  metadata {
    sample_period = "60s"
    ingest_delay  = "30s"
  }
}

# 创建自定义内存指标
resource "google_monitoring_metric_descriptor" "memory_metrics" {
  description     = "Nomad实例未分配内存"
  display_name    = "nomad_client_unallocated_memory"
  type            = "custom.googleapis.com/${var.telegraf_namespace}/nomad_client/unallocated_memory"
  metric_kind     = "GAUGE"
  value_type      = "DOUBLE"
  unit            = "MBy"
  metadata {
    sample_period = "60s"
    ingest_delay  = "30s"
  }
}

resource "google_compute_region_instance_group_manager" "group_manager" {
  name = "${lower(var.environment)}-${var.service_name}-instance-group${var.name_suffix}"

  base_instance_name         = var.instance_base_name
  region                     = var.region
  distribution_policy_zones  = var.distribution-policy-zones 

  version {
    instance_template = google_compute_instance_template.mig-template.id
  } 
}

resource "google_compute_region_autoscaler" "auto_scaler" {
  depends_on = [google_compute_region_instance_group_manager.group_manager]
  name   = "${lower(var.environment)}-${var.service_name}-autoscaler${var.name_suffix}"
  region   = var.region
  target = google_compute_region_instance_group_manager.group_manager.id

  autoscaling_policy {
    max_replicas    = var.max_replicas
    min_replicas    = var.min_replicas
    cooldown_period = 600

  metric {
    name = google_monitoring_metric_descriptor.cpu_metrics.type
    target = "2500"
    type = "GAUGE" 
    }
  metric {
    name = google_monitoring_metric_descriptor.memory_metrics.type
    target = "1000"
    type = "GAUGE" 
    }
  }
}

模块调用代码

module "nomad_client_europe-central2" {
    source                    = "./modules/nomad_client"
    template_subnetwork       = "private-subnet-1"
    machine_type              = "e2-medium"
    compute_image             = "debian-buster-base-1677584808"
    startup_script            = file("./mig_user_data/bootstrap.sh")
    distribution-policy-zones = ["europe-central2-a", "europe-central2-b","europe-central2-c"]
    min_replicas              = 2
    max_replicas              = 4
    telegraf_namespace        = "Telegraf_NomadClientMIG"
    name_suffix               = "-abcd"
}

解决方案

要将自定义指标的聚合范围改为「Single time series per group」,需要在google_compute_region_autoscaler的metric块中添加聚合配置,指定如何将实例级的时间序列聚合为组级的单一时间序列。

修改后的google_compute_region_autoscaler资源代码如下:

resource "google_compute_region_autoscaler" "auto_scaler" {
  depends_on = [google_compute_region_instance_group_manager.group_manager]
  name   = "${lower(var.environment)}-${var.service_name}-autoscaler${var.name_suffix}"
  region   = var.region
  target = google_compute_region_instance_group_manager.group_manager.id

  autoscaling_policy {
    max_replicas    = var.max_replicas
    min_replicas    = var.min_replicas
    cooldown_period = 600

    metric {
      name = google_monitoring_metric_descriptor.cpu_metrics.type
      target = "2500"
      type = "GAUGE"

      # 配置聚合策略,生成组级单一时间序列
      aggregation {
        alignment_period    = "60s" # 与指标采样周期匹配
        per_series_aligner  = "ALIGN_MEAN" # 单实例指标对齐方式
        cross_series_reducer = "REDUCE_MEAN" # 跨实例聚合方式,可选REDUCE_SUM/REDUCE_MAX等
        group_by_fields     = ["resource.label.instance_group_name"] # 按实例组名称分组
      }
    }

    metric {
      name = google_monitoring_metric_descriptor.memory_metrics.type
      target = "1000"
      type = "GAUGE"

      # 同样配置内存指标的聚合策略
      aggregation {
        alignment_period    = "60s"
        per_series_aligner  = "ALIGN_MEAN"
        cross_series_reducer = "REDUCE_MEAN"
        group_by_fields     = ["resource.label.instance_group_name"]
      }
    }
  }
}

配置说明

  • cross_series_reducer:指定跨所有实例时间序列的聚合方式,根据业务需求选择REDUCE_MEAN(均值)、REDUCE_SUM(总和)或REDUCE_MAX(最大值)等。
  • group_by_fields:设置resource.label.instance_group_name确保GCP按MIG分组聚合指标,生成单一时间序列。
  • alignment_period和per_series_aligner:与自定义指标的sample_period保持一致,确保每个实例的指标数据先对齐时间窗口再聚合。

此外,需确保实例上报自定义指标时,GCP能自动关联实例所属的MIG标签(通常只要实例属于该MIG,GCP会自动添加instance_group_name资源标签)。

内容的提问来源于stack exchange,提问作者Yash Hirulkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:55:19