如何自动备份运行Container-Optimized OS的Google Cloud VM实例及磁盘?
适合Container-Optimized OS的GCE实例自动备份方案
我来分享几个完全适配Container-Optimized OS(COOS)限制的自动备份方案——毕竟COOS是只读系统,没法装额外系统包,所以所有方案都不用在实例上修改系统,完美解决你的需求:
方案1:用GCP原生快照调度策略(最省心)
这是我最推荐的方案,完全不用碰实例,靠GCP原生服务就能搞定磁盘的定期快照:
- 直接通过GCP控制台或者
gcloud命令给目标磁盘绑定快照调度规则,配置好备份频率(比如每日、每周)、快照保留时长、时区等参数。 - 示例命令:
gcloud compute disks add-snapshot-schedule YOUR_DISK_NAME \ --snapshot-schedule=YOUR_SCHEDULE_NAME \ --zone=YOUR_ZONE - 优点:零维护,GCP自动处理快照创建、旧快照清理,完全不用写代码或管理容器。
方案2:容器化快照工具(灵活可控)
既然COOS本身就是为跑容器设计的,咱可以把快照工具打包成容器来运行,避开系统只读的限制:
- 给你的GCE实例绑定一个拥有Compute Snapshot Creator权限的服务账号(至少能创建/删除快照、读取磁盘信息)。
- 用官方的
google/cloud-sdk镜像启动一个容器,COOS会自动把实例的服务账号权限传给容器,不用手动挂载密钥。 - 在容器里配置定时任务(比如用
supercronic轻量cron替代),执行快照脚本:
示例脚本(可放到容器的/usr/local/bin/backup.sh):#!/bin/bash DISK_NAME="YOUR_DISK_NAME" ZONE="YOUR_ZONE" RETAIN_DAYS=7 # 创建带时间戳的快照 SNAPSHOT_NAME="backup-${DISK_NAME}-$(date +%Y%m%d%H%M)" gcloud compute disks snapshot $DISK_NAME --name=$SNAPSHOT_NAME --zone=$ZONE # 删除7天前的旧快照 gcloud compute snapshots list --filter="name:backup-${DISK_NAME}- AND creationTimestamp<$(date -d "-$RETAIN_DAYS days" +%Y-%m-%d)" --format="value(name)" | xargs -r gcloud compute snapshots delete -q - 启动容器时挂载定时任务配置:
其中docker run -d --restart=always \ --name snapshot-service \ -v $(pwd)/snapshot-cron:/etc/cron.d/snapshot-cron \ -v $(pwd)/backup.sh:/usr/local/bin/backup.sh \ google/cloud-sdk \ supercronic /etc/cron.d/snapshot-cronsnapshot-cron内容可以是0 2 * * * root /usr/local/bin/backup.sh(每天凌晨2点执行)。
方案3:Cloud Scheduler + Cloud Functions(完全无侵入)
把备份逻辑完全放到云端服务,彻底和实例解耦:
- 创建一个Cloud Functions,用Python/Node.js等语言编写代码,调用Compute Engine API来创建磁盘快照、清理旧快照。
示例Python代码片段:from googleapiclient import discovery from datetime import datetime, timedelta import os def create_snapshot(event, context): compute = discovery.build('compute', 'v1') project = os.environ['GCP_PROJECT'] zone = os.environ['ZONE'] disk_name = os.environ['DISK_NAME'] retain_days = int(os.environ['RETAIN_DAYS']) # 创建新快照 snapshot_name = f"backup-{disk_name}-{datetime.now().strftime('%Y%m%d%H%M')}" compute.disks().snapshot( project=project, zone=zone, disk=disk_name, body={'name': snapshot_name} ).execute() # 删除旧快照 cutoff_date = (datetime.now() - timedelta(days=retain_days)).isoformat() + 'Z' snapshots = compute.snapshots().list( project=project, filter=f"name:backup-{disk_name}- AND creationTimestamp < '{cutoff_date}'" ).execute() for snapshot in snapshots.get('items', []): compute.snapshots().delete( project=project, snapshot=snapshot['name'] ).execute() - 给Cloud Functions的服务账号添加Compute Snapshot Creator和Compute Viewer权限。
- 创建Cloud Scheduler任务,定时触发这个Cloud Functions(比如每日凌晨2点调用HTTP触发器)。
内容的提问来源于stack exchange,提问作者runixo
相关产品推荐
相关产品推荐

