עריכת סוג המכונה של מכונת חישוב

אם למכונה הווירטואלית (VM) שלכם לא מצורף דיסק SSD מקומי והיא לא חלק מקבוצת מופעי מכונה מנוהלים (MIG), אתם יכולים לשנות את סוג המכונה של המכונה אחרי העצירה שלה.

אם סוג המכונה הקיים לא מתאים לעומסי העבודה שמופעלים במכונה הווירטואלית, צריך לשנות את סוג המכונה של המכונה הווירטואלית. לדוגמה, אפשר להפעיל מכונה וירטואלית עם סוג מכונה קטן יותר במהלך ההגדרה, הפיתוח והבדיקה, ולשנות את המכונה הווירטואלית לשימוש בסוג מכונה גדול יותר כשמוכנים לעומסי עבודה של ייצור.

אפשר להשתמש בהליך הזה במקרים הבאים:

  • כדי לעבור לסוג מכונה דומה אבל עם מספר שונה של vCPU או זיכרון באותה סדרת מכונות, למשל:
    • אפשר לשנות את n2-highcpu-4 ל-n2-standard-4.
    • אפשר לשנות את c3d-standard-30 ל-c3d-highmem-30.
  • כדי לשנות את סוג המכונה כך שישתמש בסדרת מכונות אחרת. האפשרות הזו נתמכת רק בסדרות מכונות מהדור הראשון והשני, למעט סדרות המכונות T2A ו-A2. לדוגמה:
    • אפשר לשנות את n2-standard-4 ל-c2-standard-8.
    • אפשר לשנות את n1-highmem-4 ל-n2d-standard-16.

אם רוצים לשנות את סוג המכונה של מכונה וירטואלית שמשתמשת בסדרת מכונות מהדור הראשון או השני (N1,‏ N2,‏ M1 וכו') לסוג מכונה של סדרת מכונות מהדור השלישי או מאוחר יותר (M3,‏ C3,‏ N4 וכו'), צריך לפעול לפי ההליך שמתואר במאמר העברת עומס העבודה למופע מחשוב חדש.

אפשר לשנות את סוג המכונה בלי להשפיע על המשאבים הבאים:

  • מפתחות ה-SSH של המכונה הווירטואלית
  • ההגדרות של מכונות וירטואליות, כמו המטא-נתונים של מכונות וירטואליות
  • הנתונים בדיסק קשיח קבוע או ב-Hyperdisk שמצורפים, כולל אפליקציות מותקנות ונתוני אפליקציות

כדי לשנות את סוג המכונה של מכונות וירטואליות ב-MIG, אפשר לעיין במאמר בנושא החלת עדכוני הגדרות של מכונות וירטואליות ב-MIG באופן אוטומטי.

לפני שמתחילים

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות לשינוי סוג המכונה של מכונה וירטואלית, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

התפקידים המוגדרים מראש האלה מכילים את ההרשאות שנדרשות לשינוי סוג המכונה של מכונה וירטואלית. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי לשנות את סוג המכונה של מכונה וירטואלית, נדרשות ההרשאות הבאות:

  • compute.instances.setMachineType on VM
  • compute.instances.start on VM
  • compute.instances.stop on VM

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

מגבלות

השלכות על החיוב

כל סוג מכונה מחויב בתעריף שונה, לכן חשוב להבין את ההשלכות של שינוי סוגי המכונות על התמחור. לדוגמה, סוג מכונה e2-standard-2 עולה יותר מסוג מכונה e2-micro.

שינוי סוג המכונה עשוי להשפיע גם על ההנחות על שימוש מתמשך במכונה הווירטואלית. הנחות על שימוש מתמשך מחושבות בנפרד לקטגוריות שונות באותו אזור. אם משנים את סוג המכונה כך שהסוג החדש נמצא בקטגוריה אחרת, זמן הריצה הבא של מכונת ה-VM ייספר במסגרת ההנחה על שימוש קבוע של הקטגוריה החדשה.

לדוגמה, נניח שיש לכם מכונה וירטואלית עם n2-standard-2 סוג מכונה שפועלת במשך חצי חודש. אחר כך מחליטים לשנות את סוג המכונה ל-m1-ultramem-40. אחרי שמבצעים את השינוי הזה, מערכת Compute Engine מתחילה לספור את זמן הפעולה של המכונה הווירטואלית לצורך חישוב ההנחה על שימוש מתמשך בקטגוריית הזיכרון והמעבד הווירטואלי שעברו אופטימיזציה לזיכרון.

בחשבון שלכם תופיע הנחה על שימוש קבוע שחלה על סוג המכונה n2-standard-2 לפני ששיניתם את סוג המכונה, והנחה נפרדת על שימוש קבוע שחלה על m1-ultramem-40, אם מכונת ה-VM תמשיך לפעול ב-m1-ultramem-40 לפחות 25% משאר החודש.

מעבר לסוג מכונה קטן יותר

אם עוברים מסוג מכונה עם יותר משאבים לסוג מכונה עם פחות משאבים, למשל אם עוברים מסוג מכונה e2-standard-8 לסוג מכונה e2-standard-2, יכול להיות שתיתקלו בבעיות שקשורות למשאבי חומרה או במגבלות ביצועים, כי סוגי מכונות קטנים פחות חזקים מסוגי מכונות גדולים. חשוב לוודא שסוג המכונה החדש יכול לתמוך באפליקציות או בשירותים שפועלים במכונה הווירטואלית הנוכחית, או לעדכן את השירותים והאפליקציות כך שיפעלו בסוגי המכונות הקטנים יותר.

לפני שמשנים את סוג המכונה, כדאי לעיין בהמלצות להתאמת גודל. מידע על המלצות לגבי גודל ב-Compute Engine זמין במאמר החלת המלצות לגבי סוגי מכונות על מופעים של מכונות וירטואליות.

שיטות מומלצות

ריכזנו כאן כמה שיטות מומלצות שיעזרו לכם לשנות את סוג המכונה הווירטואלית בהצלחה.

  • יוצרים גיבויים קבועים של הנתונים בדיסק לאחסון מתמיד באמצעות קובצי snapshot. מומלץ לצלם תמונת מצב של הנתונים בדיסק לאחסון מתמיד לפני שמשנים את סוג המכונה. כדי לוודא שסוג המכונה החדש יכול לתמוך בנתונים במכונה הוירטואלית הקיימת, אפשר ליצור snapshot של דיסק מתמשך ולהשתמש בו כדי להפעיל מכונה וירטואלית שנייה עם סוג המכונה החדש, וכך לוודא שהמכונה הוירטואלית מופעלת בהצלחה.

  • הוספת דיסקים נוספים לקובץ /etc/fstab. אם יש לכם דיסקים נוספים שמצורפים למכונה הווירטואלית, הקפידו להוסיף אותם לקובץ /etc/fstab כדי שהם יותקנו באופן אוטומטי כשהמכונה הווירטואלית תופעל מחדש.

  • צריך ליצור הזמנה לפני שמשנים את סוג המכונה. כדי להימנע משגיאות שקשורות לזמינות של משאבים, כדאי ליצור שמירת מקום ב-Compute Engine לסוגי המכונות החדשים כשהם יהיו זמינים, כדי לשריין אותם באזור מסוים. הזמנות עוזרות לוודא שהמשאבים זמינים כשאתם צריכים אותם.

כדי ליצור הזמנה, מבצעים את השלבים הבאים:

  1. יוצרים הזמנה (או מזהים הזמנות קיימות) עם מאפיינים זהים לאלה של מכונות ה-VM המתוכננות. מספר מכונות ה-VM בהזמנה צריך להיות שווה למספר מכונות ה-VM שרוצים לשנות או גדול ממנו. אפשר גם להשתמש באפשרות specificReservationRequired כדי למנוע ממכונות וירטואליות אחרות להשתמש בהזמנה הזו.

  2. מוודאים שהמכונות הווירטואליות המתוכננות יוכלו להשתמש בהזמנה:

    1. מוודאים שלמכונות הווירטואליות יש את ההעדפה הנכונה להזמנה.
    2. לפני שמבצעים שינוי במכונות הווירטואליות, צריך לוודא שיש מספיק קיבולת בהזמנה.

שינוי סוג המכונה

אפשר לשנות את סוג המכונה רק במכונה וירטואלית שהופסקה. מכונה וירטואלית נחשבת למופסקת רק כשהיא במצב TERMINATED. אי אפשר לשנות את סוג המכונה של מכונה וירטואלית שפועלת.

אם אתם משדרגים את סוג המכונה לדור האחרון, כדאי לעיין במאמר בנושא הערכת אפשרויות להעברת מכונות וירטואליות לפני שתמשיכו.

המסוף

  1. נכנסים לדף VM instances במסוף Cloud de Confiance .

    כניסה לדף VM instances

  2. בעמודה Name (שם), לוחצים על השם של המכונה הווירטואלית שרוצים לשנות את סוג המכונה שלה.

  3. בדף VM instance details (פרטי מכונת ה-VM), מבצעים את השלבים הבאים:

    1. אם המכונה הווירטואלית פועלת, לוחצים על Stop כדי לעצור אותה. אם האפשרות עצירה לא מופיעה, לוחצים על עוד פעולות > עצירה.
    2. כדי לערוך את המכונה הווירטואלית, לוחצים על Edit (עריכה).
    3. בקטע Machine configuration, בוחרים את סוג המכונה שרוצים להשתמש בו או יוצרים סוג מכונה בהתאמה אישית.

    4. כדי לשמור את השינויים, לוחצים על שמירה.

    5. מפעילים מחדש את ה-VM.

gcloud

  1. מפסיקים את ה-VM באמצעות הפקודה gcloud compute instances stop:

    gcloud compute instances stop VM_NAME
    

    מחליפים את VM_NAME במכונה הווירטואלית שמכילה את סוג המכונה שרוצים לשנות.

  2. משנים את סוג המכונה באמצעות הפקודה gcloud compute instances set-machine-type:

    gcloud compute instances set-machine-type VM_NAME \
        --machine-type NEW_MACHINE_TYPE
    

    מחליפים את NEW_MACHINE_TYPE בסוג המכונה החדש של המכונה הווירטואלית. סוג המכונה יכול להיות אחד מהערכים הבאים:

  3. מפעילים את ה-VM באמצעות הפקודה gcloud compute instances start:

    gcloud compute instances start VM_NAME
    

    מחליפים את VM_NAME בשם המכונה הווירטואלית ששיניתם.

Java

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Java API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.


import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.Instance.Status;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.InstancesSetMachineTypeRequest;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ChangeInstanceMachineType {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "your-project-id";
    // Name of the zone your instance belongs to.
    String zone = "zone-name";
    // Name of the VM you want to modify.
    String instanceName = "instance-name";
    // The new machine type you want to use for the VM.
    // For example: "e2-standard-8", "e2-custom-4-2048" or "m1-ultramem-40"
    // More about machine types: https://cloud.google.com/compute/docs/machine-resource
    String newMachineType = "e2-standard-8";
    changeMachineType(projectId, zone, instanceName, newMachineType);
  }

  // Changes the machine type of VM.
  // The VM needs to be in the 'TERMINATED' state for this operation to be successful.
  public static void changeMachineType(String projectId, String zone, String instanceName,
      String newMachineType)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `instancesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      Instance instance = instancesClient.get(projectId, zone, instanceName);
      if (!instance.getStatus().equals(Status.TERMINATED.name())) {
        throw new Error(String.format(
            "Only machines in TERMINATED state can have their machine type changed. "
                + "%s is in %s state.", instance.getName(), instance.getStatus()));
      }

      InstancesSetMachineTypeRequest machineTypeRequest =
          InstancesSetMachineTypeRequest.newBuilder()
              .setMachineType(String.format("projects/%s/zones/%s/machineTypes/%s",
                  projectId, zone, newMachineType))
              .build();

      Operation response = instancesClient
          .setMachineTypeAsync(projectId, zone, instanceName, machineTypeRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Machine type update failed! " + response);
        return;
      }
      System.out.println("Machine type update - operation status: " + response.getStatus());
    }
  }
}

Python

Python

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Python API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def change_machine_type(
    project_id: str, zone: str, instance_name: str, new_machine_type: str
) -> None:
    """
    Changes the machine type of VM. The VM needs to be in the 'TERMINATED' state for this operation to be successful.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone your instance belongs to.
        instance_name: name of the VM you want to modify.
        new_machine_type: the new machine type you want to use for the VM.
            For example: `e2-standard-8`, `e2-custom-4-2048` or `m1-ultramem-40`
            More about machine types: https://cloud.google.com/compute/docs/machine-resource
    """
    client = compute_v1.InstancesClient()
    instance = client.get(project=project_id, zone=zone, instance=instance_name)

    if instance.status != compute_v1.Instance.Status.TERMINATED.name:
        raise RuntimeError(
            f"Only machines in TERMINATED state can have their machine type changed. "
            f"{instance.name} is in {instance.status}({instance.status_message}) state."
        )

    machine_type = compute_v1.InstancesSetMachineTypeRequest()
    machine_type.machine_type = (
        f"projects/{project_id}/zones/{zone}/machineTypes/{new_machine_type}"
    )
    operation = client.set_machine_type(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instances_set_machine_type_request_resource=machine_type,
    )

    wait_for_extended_operation(operation, "changing machine type")

REST

  1. מפסיקים את ה-VM באמצעות השיטה instances.stop:

    POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט

    • ZONE: האזור שמכיל את המכונה הווירטואלית

    • VM_NAME: המכונה הווירטואלית שמכילה את סוג המכונה שרוצים לשנות

  2. משנים את סוג המכונה באמצעות השיטה instances.setMachineType:

    POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMachineType
    

    בגוף הבקשה, מציינים את machineType המעודכן:

    {
        machineType: "zones/MACHINE_TYPE_ZONE/machineTypes/NEW_MACHINE_TYPE"
    }
    

    מחליפים את מה שכתוב בשדות הבאים:

    • MACHINE_TYPE_ZONE: האזור שמכיל את סוג המכונה

    • NEW_MACHINE_TYPE: סוג המכונה החדש של המכונה הווירטואלית

      סוג המכונה יכול להיות אחד מהערכים הבאים:

  3. מפעילים את ה-VM באמצעות השיטה instances.start:

    POST https://compute.s3nsapis.fr/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט
    • ZONE: האזור שמכיל את המכונה הווירטואלית
    • VM_NAME: השם של המכונה הווירטואלית ששיניתם

המאמרים הבאים