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
相关产品推荐
相关产品推荐

