Назад | Перейти на главную страницу

Создавайте ночные виртуальные машины Google Cloud с помощью снимков

Я создал Google Cloud Compute Engine и каждую ночь выполнял резервное копирование (снимок). У меня есть вторая виртуальная машина в том же проекте, которая является клоном первой. Можно ли каждый раз обновлять второй экземпляр ВМ с помощью только что созданного снимка первого? Итак, у меня есть резервный сервер, которому в худшем случае 24 часа?

Скорее всего вам придется создать новый экземпляр из снимка, проверить работоспособность нового экземпляра и удалить второй экземпляр виртуальной машины. В gcloud sdk есть флаг для этого -

gcloud compute instances create с участием --source-snapshot=SNAPSHOT флаг.

Я не уверен насчет вашего случая, но кажется, что новый выпуск Образы машин GCP может быть хорошей альтернативой для рассмотрения. Он предоставляет функции, недоступные в моментальных снимках дисков, такие как резервное копирование нескольких дисков, клонирование и репликация экземпляров. Ты можешь создать экземпляр из машины изображение со всеми свойствами экземпляра, конфигурацией и данными без изменений.

Если кто-то сталкивается с той же проблемой, я написал облачную функцию и запланировал ее каждый день. Шаги следующие:

  1. Получить последний снимок
  2. Удалить старую ВМ
  3. Создать новую ВМ
  4. Поместите вновь созданный IP-адрес виртуальной машины в Cloudflare LoadBalancer

Это код для этого:

    const Compute = require("@google-cloud/compute");
    const axios = require("axios");

    const compute = new Compute({
      projectId: "myProjectID",
      keyFilename: "./gcloud_key.json"
    });

    exports.updateFailOverVM = async (pubSubEvent, context) => {
      try {
        const snapshots = await compute.getSnapshots({
          orderBy: "creationTimestamp desc"
        });
        const snapshot = snapshots[0][0];
        console.log(`Going to use Snapshot: ${snapshot.name}`);
        const sourceSnapshot = `https://www.googleapis.com/compute/v1/projects/myProjectID/global/snapshots/${snapshot.name}`;

        const zone = compute.zone("MySelectedZone");
        const vm = zone.vm("MyVMName");

        // Delete old FailOver
        console.log("start deleting old VM");
        const [deleteOperation] = await vm.delete();

        deleteOperation.on("complete", async function(metadata) {
          console.log("finished deleting old VM");

          // Create new VM
          console.log("start creating new VM");
          const [newVM, createOperation] = await vm.create({
            http: false,
            https: true,
            machineType: "n1-standard-1",
            disks: [
              {
                initializeParams: {
                  sourceSnapshot
                },
                sizeGb: 50,
                type:
                  "projects/MyProjectID/zones/mySelectedZone/diskTypes/pd-standard",
                boot: true
              }
            ]
          });
          createOperation.on("complete", async function(metadata) {
            const [newVMMeta] = await vm.getMetadata();
            const newIP = newVMMeta.networkInterfaces[0].accessConfigs[0].natIP;
            console.log("finished creating new VM");

            // Route Cloudflare to new IP
            console.log("Put new IP to Cloudflare");
            await axios({
              method: "patch",
              url:
                "https://api.cloudflare.com/client/v4/user/load_balancers/pools/MyPoolID",
              data: {
                origins: [
                  {
                    name: "MyPoolName",
                    address: newIP,
                    enabled: true,
                    weight: 1
                  }
                ]
              },
              headers: {
                "X-Auth-Email": "MyCloudflareEmail",
                "X-Auth-Key": "MyCloudflareAuthKey"
              }
            });
            console.log("Finished putting IP to Cloudflare");
          });
        });
      } catch (err) {
        console.error(err);
      }
    };