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

