如何通过编程判断GCP实例在指定时段的扩缩容及vCPU变更
如何编程检测GCP计算实例的扩缩容及MIG实例vCPU变更
一、检测指定时间段内的实例扩缩容
不管实例属于GKE集群、托管实例组(MIG)还是独立实例,核心是通过Cloud Audit Logs或Compute Engine操作日志追踪实例生命周期事件,或组的resize操作:
1. 通用检测方案(适用所有实例类型)
通过Cloud Audit Logs过滤实例创建/销毁事件,指定时间范围即可统计扩缩容情况:
- 目标事件:
google.compute.instances.create(实例创建)、google.compute.instances.delete(实例销毁) - 用对应语言的Cloud Logging客户端库实现,以Python为例:
from google.cloud import logging_v2 import datetime client = logging_v2.LoggingServiceV2Client() project_id = "你的项目ID" # 定义时间范围(示例:过去30天) start_time = datetime.datetime.now() - datetime.timedelta(days=30) end_time = datetime.datetime.now() # 构建日志查询语句 query = ( f'resource.type="gce_instance" ' f'AND (protoPayload.methodName="google.compute.instances.create" OR protoPayload.methodName="google.compute.instances.delete") ' f'AND timestamp>="{start_time.isoformat()}Z" AND timestamp<="{end_time.isoformat()}Z"' ) # 执行日志查询 results = client.list_log_entries(resource_names=[f"projects/{project_id}"], filter_=query) # 统计扩缩容数量 create_count = 0 delete_count = 0 for entry in results: if entry.proto_payload.method_name == "google.compute.instances.create": create_count += 1 else: delete_count += 1 print(f"过去30天:创建实例{create_count}台,销毁实例{delete_count}台")
- 若要区分实例所属组(如MIG/GKE节点池),可从日志条目
protoPayload.resourceName或labels字段提取关联的MID/节点池ID。
2. MIG专属扩缩容检测
MIG的扩缩容会触发专属google.compute.instanceGroupManagers.resize事件,直接过滤该事件即可获取精准的resize记录:
- 日志查询语句调整为:
resource.type="gce_instance_group_manager" AND protoPayload.methodName="google.compute.instanceGroupManagers.resize" AND timestamp>="[起始时间]Z" AND timestamp<="[结束时间]Z" - 日志条目中会包含MIG名称、目标实例数量、操作时间等关键信息。
3. GKE节点池扩缩容检测
GKE节点池的扩缩容对应container.nodePools.resize事件,日志查询语句:
resource.type="gke_node_pool" AND protoPayload.methodName="container.nodePools.resize" AND timestamp>="[起始时间]Z" AND timestamp<="[结束时间]Z"
二、检测MIG实例vCPU增加2核的变更
vCPU数量由实例的机器类型决定(如n1-standard-2对应2核,n1-standard-4对应4核),因此核心是追踪机器类型的变更:
1. 通过Cloud Audit Logs追踪机器类型变更
过滤google.compute.instances.setMachineType事件,该事件会记录实例从旧机器类型切换到新机器类型的操作:
from google.cloud import logging_v2, compute_v1 import datetime client = logging_v2.LoggingServiceV2Client() compute_client = compute_v1.MachineTypesClient() project_id = "你的项目ID" start_time = datetime.datetime.now() - datetime.timedelta(days=30) end_time = datetime.datetime.now() query = ( f'resource.type="gce_instance" ' f'AND protoPayload.methodName="google.compute.instances.setMachineType" ' f'AND timestamp>="{start_time.isoformat()}Z" AND timestamp<="{end_time.isoformat()}Z"' ) results = client.list_log_entries(resource_names=[f"projects/{project_id}"], filter_=query) # 解析vCPU变化 def get_vcpus(machine_type, zone): mt = compute_client.get(project=project_id, zone=zone, machine_type=machine_type) return mt.guest_cpus for entry in results: zone = entry.resource.labels.zone old_mt = entry.proto_payload.request.machineType.split("/")[-1] new_mt = entry.proto_payload.response.machineType.split("/")[-1] old_vcpus = get_vcpus(old_mt, zone) new_vcpus = get_vcpus(new_mt, zone) if new_vcpus - old_vcpus == 2: print(f"实例{entry.resource.labels.instance_id}的vCPU从{old_vcpus}核增加到{new_vcpus}核")
2. 检测MIG实例模板更新
如果MIG通过更新实例模板批量修改机器类型,会触发google.compute.instanceGroupManagers.updateInstanceTemplate或google.compute.instanceTemplates.update事件。通过这些日志可追踪模板的机器类型变更,再结合MIG滚动更新记录,确认实例是否批量应用了新配置。
3. 批量对比实例当前与历史配置
若未开启审计日志(不推荐),可定期抓取MIG下所有实例的机器类型,与之前存储的快照对比:
from google.cloud import compute_v1 client = compute_v1.InstanceGroupManagersClient() instance_client = compute_v1.InstancesClient() project_id = "你的项目ID" mig_name = "你的MIG名称" zone = "你的可用区" # 获取MIG下所有实例 mig = client.get(project=project_id, zone=zone, instance_group_manager=mig_name) instance_urls = mig.instance_group.instances # 逐个获取实例vCPU并对比历史快照 for instance_url in instance_urls: instance_id = instance_url.split("/")[-1] instance = instance_client.get(project=project_id, zone=zone, instance=instance_id) current_vcpus = instance.machine_type.guest_cpus # 此处替换为从存储中读取的历史vCPU数值 old_vcpus = 2 if current_vcpus - old_vcpus == 2: print(f"实例{instance_id}的vCPU已增加2核")
内容的提问来源于stack exchange,提问作者Daniel Vanum
相关产品推荐
相关产品推荐

