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

GCP托管实例组自动扩缩容异常:设最小1实例却维持2实例

GCP托管实例组自动扩缩容异常:初始维持2个实例(未达阈值)

我在GCP中创建了带自动扩缩容功能的托管计算实例组,采用Telegraf自定义指标配置扩缩容,设置最小实例数1、最大实例数4。但实例组初始就创建2个实例并持续维持该数量,查看指标远未达到阈值,且实例组详情中「目标规模」显示为2(Terraform代码未设置目标规模,因使用自动扩缩容)。

关联Terraform代码

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,
      {
        apica_type   = var.apica_type
        environment = var.environment
        autoscale   = "true"
      }
  )
}

resource "google_monitoring_metric_descriptor" "cpu_metrics" {
  description     = "Allocated CPU for nomad instances"
  display_name    = "nomad_client_allocated_cpu"
  type            = "custom.googleapis.com/${var.telegraf_namespace}/nomad_client/allocated_cpu"
  metric_kind     = "GAUGE"
  value_type      = "DOUBLE"
  unit            = "MHz"
  metadata {
    sample_period = "60s"
    ingest_delay  = "30s"
  }
}

resource "google_monitoring_metric_descriptor" "memory_metrics" {
  description     = "Allocated CPU for nomad instances"
  display_name    = "nomad_client_allocated_memory"
  type            = "custom.googleapis.com/${var.telegraf_namespace}/nomad_client/allocated_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]
  provider = google-beta
  name   = "${lower(var.environment)}-${var.service_name}-autoscaler${var.name_suffix}"
  region   = var.region
  project  = var.project_id
  target = google_compute_region_instance_group_manager.group_manager.id

  autoscaling_policy {
    max_replicas    = 1
    min_replicas    = 4
    cooldown_period = 60
  
    scale_in_control {
      max_scaled_in_replicas {
        fixed = 1
      }
      time_window_sec = 60
    }

    metric {
      name = google_monitoring_metric_descriptor.cpu_metrics.type
      target = "2000"
      type = "GAUGE" 
      filter = "resource.type=\"global\"" 
    }
    metric {
      name = google_monitoring_metric_descriptor.memory_metrics.type
      target = "2000"
      type = "GAUGE" 
      filter = "resource.type=\"global\""
    }
  }
}

问题排查与修复方案

1. 自动扩缩容参数颠倒错误

google_compute_region_autoscaler的autoscaling_policy中,max_replicas和min_replicas的值写反了,正确配置应为min_replicas=1,max_replicas=4。参数颠倒后,GCP会将实例数维持在两者的交集值,若搭配多可用区分布,就会出现初始2个实例的情况。

2. 自定义指标过滤条件错误

自定义指标的filter设置为resource.type="global",但Telegraf采集的实例级指标对应的资源类型是gce_instance,错误的过滤条件会导致自动扩缩容无法获取有效指标,触发兜底逻辑。修正后的过滤条件应为:

filter = "resource.type=\"gce_instance\""

3. 实例组分布策略影响

若distribution_policy_zones配置了多个可用区,区域实例组管理器会默认在每个可用区至少部署1个实例。如果配置了2个可用区,即使min_replicas=1,也会自动创建2个实例满足跨区要求,可根据需求调整可用区数量。

修复后的关键代码片段

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

  autoscaling_policy {
    min_replicas    = 1
    max_replicas    = 4
    cooldown_period = 60
  
    scale_in_control {
      max_scaled_in_replicas {
        fixed = 1
      }
      time_window_sec = 60
    }

    metric {
      name = google_monitoring_metric_descriptor.cpu_metrics.type
      target = "2000"
      type = "GAUGE" 
      filter = "resource.type=\"gce_instance\"" 
    }
    metric {
      name = google_monitoring_metric_descriptor.memory_metrics.type
      target = "2000"
      type = "GAUGE" 
      filter = "resource.type=\"gce_instance\""
    }
  }
}

内容的提问来源于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 07:09:56