将存储池中的磁盘添加到虚拟机


您可以在 Hyperdisk 存储池中创建磁盘,然后将磁盘挂接到虚拟机实例,或者,您也可以在创建虚拟机时在存储池中创建磁盘。

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Go

      如需在本地开发环境中使用本页面上的 Go 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      如需了解详情,请参阅 Set up authentication for a local development environment

      Java

      如需在本地开发环境中使用本页面上的 Java 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      如需了解详情,请参阅 Set up authentication for a local development environment

      Node.js

      如需在本地开发环境中使用本页面上的 Node.js 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      如需了解详情,请参阅 Set up authentication for a local development environment

      REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需的角色和权限

如需获得在存储池中创建 Hyperdisk Balanced 或 Hyperdisk Throughput 磁盘所需的权限,请让管理员向您授予项目的以下 IAM 角色:

  • Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1)
  • 若要连接到能够以服务账号的身份运行的虚拟机实例:Service Account User (v1)(roles/iam.serviceAccountUser 角色)

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色包含在存储池中创建 Hyperdisk Balanced 或 Hyperdisk Throughput 磁盘所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

在存储池中创建 Hyperdisk Balanced 或 Hyperdisk Throughput 磁盘需要以下权限:

  • 在存储池中创建磁盘并将磁盘挂接到虚拟机实例:
    • 针对项目的 compute.disks.create 权限
    • 针对虚拟机的 compute.instances.attachDisk 权限
    • 针对您要挂接到虚拟机的卷的 compute.disks.use
    • 针对您要在其中创建磁盘的存储池的 compute.storagePools.use 权限
  • 为了格式化和装载挂接的卷:针对虚拟机的 compute.instances.setMetadata

您也可以使用自定义角色或其他预定义角色来获取这些权限。

如需了解创建实例所需的权限,请参阅所需的权限

限制

查看在 Hyperdisk 存储池中创建磁盘的以下限制:

  • 您只能在 Hyperdisk Balanced 存储池中创建 Hyperdisk Balanced 磁盘,并且只能在 Hyperdisk Throughput 存储池中创建 Hyperdisk Throughput 磁盘。
  • 只能在存储池中创建位于同一项目和同一可用区的新磁盘。
  • 如需在存储池中创建启动磁盘,您必须使用 Hyperdisk Balanced 存储池。
  • 不允许将磁盘移入或移出存储池。如需将磁盘移入或移出存储池,您必须通过快照重新创建磁盘。如需了解详情,请参阅更改磁盘类型
  • 您最多可以在一个存储池中创建 1,000 个磁盘。
  • 存储池不支持区域级磁盘

预配选项

根据 Hyperdisk 存储池的预配类型,您可以选择如何预配您在存储池中创建的每个磁盘的容量和性能。

预配磁盘容量

如果您创建了高级容量存储池,则可以使用精简预配。您可以在存储池中创建累计大小超过池预配容量的磁盘。存储池的已用容量由使用中的数据总量定义,而不是由您预配的磁盘可用空间量定义。您可以预配总容量为高级容量存储池预配容量的 500% 的磁盘。

如果您要在标准容量存储池中创建磁盘,则需要在存储池中创建磁盘,直到存储池中所有磁盘的总大小达到存储池的预配容量为止。具有标准容量的存储池中的磁盘的行为与非池磁盘类似,在您创建磁盘时会消耗容量。

预配性能

如果您创建了高级性能存储池,则可以使用精简预配。您可以在存储池中创建累计 IOPS 和吞吐量超过池预配性能的磁盘。存储池的已用性能由磁盘使用的总性能定义,而不是由为每个磁盘预配的性能量定义。您可以预配总性能为高级性能存储池预配性能的 500% 的磁盘。

如果您在标准性能存储池中创建磁盘,则为磁盘预配的 IOPS 或吞吐量必须小于 Hyperdisk 存储池中的可用 IOPS 或吞吐量。可用 IOPS 或吞吐量是存储池的预配容量减去存储池中创建的所有磁盘的已用容量。

如果不满足上一段落中的任何条件,则在存储池中创建磁盘的请求将失败,并且不会创建该磁盘。

示例

假设您有一个预配 IOPS 为 100,000 的 Hyperdisk Balanced 存储池。

使用标准性能预配:

  • 在存储池中创建 Hyperdisk Balanced 磁盘时,最多可预配 100,000 个汇总 IOPS。
  • 您需要为 100,000 IOPS 的 Hyperdisk Balanced 存储池预配性能付费。
  • 与在存储池外部创建的磁盘一样,标准性能存储池中的 Hyperdisk Balanced 磁盘会自动预配,并具有最高 3,000 基准 IOPS 和 140 MiB/s 基准吞吐量。此基准性能不会计入存储池的预配性能。只有当您向存储池添加的磁盘预配性能高于基准时,该磁盘才会计入存储池的预配性能,例如:

    • 预配了 3,000 IOPS 的磁盘使用了 0 个存储池 IOPS,并且该存储池仍有 100,000 个预配 IOPS 可供其他磁盘使用。
    • 预配了 13,000 IOPS 的磁盘使用了 10,000 个存储池 IOPS,并且该存储池还有 90,000 个预配 IOPS 可分配给存储池中的其他磁盘。

使用高级性能预配:

  • 在存储池中创建磁盘时,最多可预配 500,000 IOPS 的汇总 Hyperdisk 性能。
  • 您需要支付存储池预配的 100,000 IOPS 的费用。
  • 如果您在具有 5,000 IOPS 的存储池中创建单个磁盘 (Disk1),则不会使用存储池预配 IOPS 中的任何 IOPS。不过,您现在可以为在存储池中创建的新磁盘预配的 IOPS 数量为 495,000。
  • 如果 Disk1 开始读写数据,并且在给定一分钟内使用了 5,000 IOPS 的最大值,则会从存储池预配 IOPS 中消耗 5,000 IOPS。您在同一存储池中创建的任何其他磁盘都可以在同一分钟内使用总计不超过 95,000 IOPS,而不会发生争用。

在存储池中创建磁盘

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 REST 在存储池中创建磁盘。

控制台

使用 Google Cloud 控制台,您可以通过存储池页面或磁盘页面在存储池中创建新磁盘。

存储池页面上,执行以下操作:

  1. 在 Google Cloud 控制台中,转到存储池页面。

    转到“存储池”页面

  2. 点击要在其中创建磁盘的存储池的名称。

  3. 管理存储池页面上,点击 +创建新磁盘

  4. 添加新磁盘面板中,输入磁盘的名称

  5. 指定或更改您不想使用默认值的任何值。

  6. 指定完磁盘属性后,点击保存

  7. 管理存储池页面上,您应该会看到存储池磁盘部分列出了新磁盘。

创建磁盘页面上,执行以下操作:

  1. 在 Google Cloud 控制台中,转到磁盘 > 创建磁盘页面。

    转到“创建磁盘”页面

  2. 输入磁盘的名称

  3. 选择包含要在其中创建磁盘的存储池的可用区。

  4. 对于磁盘类型,选择与 Hyperdisk 存储池匹配的磁盘类型,即 Hyperdisk Throughput 或 Hyperdisk Balanced。

  5. 根据需要修改大小预配 IOPS预配吞吐量字段中的值。

  6. 存储池部分,选择启用存储池,然后选择要在其中创建磁盘的存储池的名称。列表中仅显示所选可用区中存在的存储池。

  7. 指定完磁盘信息后,点击创建

gcloud

如需在存储池中创建一个或多个磁盘,请使用 gcloud compute disks create 命令

gcloud compute disks create DISK_NAME \
    --zone=ZONE \
    --storage-pool=STORAGE_POOL_NAME \
    --size=SIZE \
    --type=DISK_TYPE \
    --provisioned-iops=PROVISIONED_IOPS \
    --provisioned-throughput=PROVISIONED_THROUGHPUT

替换以下内容:

  • DISK_NAME:磁盘的唯一名称。您可以提供由空间指定的磁盘名称列表,以创建具有相同属性的多个磁盘。
  • ZONE:在其中创建存储池的可用区。采用区域-可用区格式指定此值,例如 us-central1-a
  • STORAGE_POOL_NAME:要在其中创建磁盘的存储池的名称。
  • SIZE(可选):新磁盘的预配容量。该值必须是一个整数,后跟大小单位(GB 表示吉比字节,或 TB 表示太比字节)。如果未指定大小,则使用 100 GB 作为默认值。
  • DISK_TYPE:要创建的磁盘类型。 此值必须与 Hyperdisk 存储池的类型相匹配,即 hyperdisk-balancedhyperdisk-throughput
  • PROVISIONED_IOPS(可选):要为磁盘预配的 IOPS。此标志只能用于 Hyperdisk Balanced 磁盘。
  • PROVISIONED_THROUGHPUT(可选):要为磁盘预配的吞吐量,以兆比字节 (MB)/秒为单位。

REST

如需在存储池中创建一个或多个磁盘,请使用 disks.insert 方法构建 POST。应包含 namesizeGbtypestoragePoolprovisionedIopsprovisionedThroughput 属性。如需创建一个空白且未格式化的非启动磁盘,请不要为此磁盘指定来源映像或来源快照。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks

{
    "name": "DISK_NAME",
    "description": "DESCRIPTION",
    "type": "https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/diskTypes/DISK_TYPE",
    "sizeGb": "DISK_SIZE",
    "storagePool": "STORAGE_POOL_NAME",
    "provisionedIops": "IOPS_LIMIT",
    "provisionedThroughput": "THROUGHPUT_LIMIT",
}

替换以下内容:

  • PROJECT_ID:项目 ID
  • ZONE:存储池所在的可用区,例如 us-central1-a。这是将在其中创建磁盘的可用区。
  • DISK_NAME:磁盘的唯一名称。
  • DESCRIPTION(可选):描述磁盘的文本字符串。
  • DISK_TYPE:磁盘类型,必须与存储池类型一致。请使用 hyperdisk-throughputhyperdisk-balanced
  • DISK_SIZE:可选:新磁盘的大小。 该值必须是一个整数,后跟大小单位(GB 表示吉比字节,或 TB 表示太比字节)。如果未指定大小,则使用 100 GB 作为默认值。
  • STORAGE_POOL_NAME:要在其中创建磁盘的存储池的名称。
  • IOPS_LIMIT(可选):要为磁盘预配的 IOPS。此标志只能用于 Hyperdisk Balanced 磁盘。
  • THROUGHPUT_LIMIT(可选):要为磁盘预配的吞吐量,以兆比字节 (MB)/秒为单位。

Go


// createDiskInStoragePool creates a new Hyperdisk in the specified storage pool.
func createDiskInStoragePool(w io.Writer, projectId, zone, diskName, storagePoolName, diskType string) error {
	// Example usage:
	//   projectID := "your_project_id"
	//   zone := "europe-central2-b"
	//   diskName := "your_disk_name"
	//   storagePoolName := "https://www.googleapis.com/compute/v1/projects/your_project_id/zones/europe-central2-b/storagePools/your_storage_pool"
	//   diskType := "zones/europe-central2-b/diskTypes/hyperdisk-balanced"

	ctx := context.Background()
	client, err := compute.NewDisksRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewDisksRESTClient: %v", err)
	}
	defer client.Close()

	// Create the disk resource
	disk := &computepb.Disk{
		Name:                  proto.String(diskName),
		Type:                  proto.String(diskType),
		SizeGb:                proto.Int64(50),
		Zone:                  proto.String(zone),
		StoragePool:           proto.String(storagePoolName),
		ProvisionedIops:       proto.Int64(10000),
		ProvisionedThroughput: proto.Int64(1024),
	}

	// Create the insert disk request
	req := &computepb.InsertDiskRequest{
		Project:      projectId,
		Zone:         zone,
		DiskResource: disk,
	}

	// Send the insert disk request
	op, err := client.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("Insert disk request failed: %v", err)
	}

	// Wait for the insert disk operation to complete
	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Disk created in storage pool: %v\n", disk.Name)
	return nil
}

Java


import com.google.cloud.compute.v1.Disk;
import com.google.cloud.compute.v1.DisksClient;
import com.google.cloud.compute.v1.InsertDiskRequest;
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 CreateDiskInStoragePool {
  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 Google Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the zone in which you want to create the disk.
    String zone = "europe-central2-b";
    // Name of the disk you want to create.
    String diskName = "YOUR_DISK_NAME";
    // Link to the storagePool you want to use. Use format :
    // https://www.googleapis.com/compute/v1/projects/%s/zones/%s/storagePools/%s"
    String storagePoolName = "YOUR_STORAGE_POOL_LINK";
    // The type of disk you want to create. This value uses the following format:
    // "zones/{zone}/diskTypes/(hyperdisk-balanced|hyperdisk-throughput)".
    // For example: "zones/us-west3-b/diskTypes/hyperdisk-balanced"
    String diskType = String.format("zones/%s/diskTypes/hyperdisk-balanced", zone);
    // Size of the new disk in gigabytes.
    long diskSizeGb = 10;
    // Optional: the IOPS to provision for the disk.
    // You can use this flag only with Hyperdisk Balanced disks.
    long provisionedIops = 3000;
    // Optional: the throughput in mebibyte (MB) per second to provision for the disk.
    long provisionedThroughput = 140;

    createDiskInStoragePool(projectId, zone, diskName, storagePoolName, diskType,
            diskSizeGb, provisionedIops, provisionedThroughput);
  }

  // Creates a hyperdisk in the storage pool
  public static Disk createDiskInStoragePool(String projectId, String zone, String diskName,
                                             String storagePoolName, String diskType,
                                             long diskSizeGb, long iops, long throughput)
          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.
    try (DisksClient client = DisksClient.create()) {
      // Create a disk.
      Disk disk = Disk.newBuilder()
              .setZone(zone)
              .setName(diskName)
              .setType(diskType)
              .setSizeGb(diskSizeGb)
              .setStoragePool(storagePoolName)
              .setProvisionedIops(iops)
              .setProvisionedThroughput(throughput)
              .build();

      InsertDiskRequest request = InsertDiskRequest.newBuilder()
              .setProject(projectId)
              .setZone(zone)
              .setDiskResource(disk)
              .build();

      // Wait for the insert disk operation to complete.
      Operation operation = client.insertAsync(request).get(1, TimeUnit.MINUTES);

      if (operation.hasError()) {
        System.out.println("Disk creation failed!");
        throw new Error(operation.getError().toString());
      }

      // Wait for server update
      TimeUnit.SECONDS.sleep(10);

      Disk hyperdisk = client.get(projectId, zone, diskName);

      System.out.printf("Hyperdisk '%s' has been created successfully", hyperdisk.getName());

      return hyperdisk;
    }
  }
}

Node.js

// Import the Compute library
const computeLib = require('@google-cloud/compute');
const compute = computeLib.protos.google.cloud.compute.v1;

// Instantiate a diskClient
const disksClient = new computeLib.DisksClient();
// Instantiate a zoneOperationsClient
const zoneOperationsClient = new computeLib.ZoneOperationsClient();

/**
 * TODO(developer): Update these variables before running the sample.
 */
// Project ID or project number of the Google Cloud project you want to use.
const projectId = await disksClient.getProjectId();
// The zone where your VM and new disk are located.
const zone = 'us-central1-a';
// The name of the new disk
const diskName = 'disk-from-pool-name';
// The name of the storage pool
const storagePoolName = 'storage-pool-name';
// Link to the storagePool you want to use. Use format:
// https://www.googleapis.com/compute/v1/projects/{projectId}/zones/{zone}/storagePools/{storagePoolName}
const storagePool = `https://www.googleapis.com/compute/v1/projects/${projectId}/zones/${zone}/storagePools/${storagePoolName}`;
// The type of disk. This value uses the following format:
// "zones/{zone}/diskTypes/(hyperdisk-balanced|hyperdisk-extreme|hyperdisk-ml|hyperdisk-throughput)".
// For example: "zones/us-west3-b/diskTypes/hyperdisk-balanced"
const diskType = `zones/${zone}/diskTypes/hyperdisk-balanced`;
// Size of the new disk in gigabytes.
const diskSizeGb = 10;
// Optional: For Hyperdisk Balanced or Hyperdisk Extreme disks,
// this is the number of I/O operations per second (IOPS) that the disk can handle.
const provisionedIops = 3000;
// Optional: For Hyperdisk Balanced or Hyperdisk Throughput volumes,
// this is an integer that represents the throughput,
// measured in MiB per second, that the disk can handle.
const provisionedThroughput = 140;

async function callCreateComputeHyperdiskFromPool() {
  // Create a disk
  const disk = new compute.Disk({
    sizeGb: diskSizeGb,
    name: diskName,
    type: diskType,
    zone,
    storagePool,
    provisionedIops,
    provisionedThroughput,
  });

  const [response] = await disksClient.insert({
    project: projectId,
    zone,
    diskResource: disk,
  });

  let operation = response.latestResponse;

  // Wait for the create disk operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await zoneOperationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  const hyperdisk = (
    await disksClient.get({
      project: projectId,
      zone,
      disk: diskName,
    })
  )[0];

  console.log(JSON.stringify(hyperdisk));
}

await callCreateComputeHyperdiskFromPool();

创建磁盘后,您可以将磁盘挂接到虚拟机

创建使用存储池中磁盘的虚拟机

创建虚拟机时,您可以配置启动磁盘,还可以选择创建自动挂接到虚拟机的其他数据(非启动)磁盘。以下部分介绍了如何在虚拟机创建过程中在存储池中创建每种类型的磁盘。

为存储池中的虚拟机创建启动磁盘

如需创建在存储池中使用启动磁盘的虚拟机,您必须先创建 Hyperdisk Balanced 存储池。然后,您可以使用支持 Hyperdisk Balanced 磁盘的机器类型创建虚拟机。机器类型、磁盘类型和存储池必须在您选择的可用区中可用。

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 点击创建实例

  3. 输入实例的名称。

  4. 将可用区设置为存储池所在的可用区。

  5. 选择支持 Hyperdisk Balanced 的机器类型,例如 H3。

  6. 启动磁盘部分,点击更改

  7. 启动磁盘面板中,将启动磁盘类型设置为 Hyperdisk Balanced。

  8. 配置磁盘的属性。

  9. 展开显示高级配置

  10. 存储池标题下,选择启用存储池

  11. 从列表中选择要在其中创建磁盘的存储池。

  12. 完成磁盘配置后,点击选择

  13. 完成虚拟机属性的配置。

  14. 点击创建

    控制台会在指定可用区中创建虚拟机,并在所选存储池中创建启动磁盘。

gcloud

你可以为存储池中的新虚拟机创建启动磁盘,方法是使用 gcloud compute instances create 命令并添加启动磁盘的 storage-pool 属性。

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --create-disk=boot=yes,type=hyperdisk-balanced,size=DISK_SIZE,provisioned-throughput=THROUGHPUT, \
    provisioned-iops=IOPS,image=projects/IMAGE_PROJECT/global/images/IMAGE, \
    storage-pool=STORAGE_POOL_NAME

替换以下内容:

  • VM_NAME:虚拟机的名称。
  • ZONE:要在其中创建虚拟机的区域和可用区,格式为 us-central1-a
  • MACHINE_TYPE:虚拟机的机器类型,例如 m3-ultramem-32
  • DISK_SIZE:启动磁盘的大小(以 GiB 为单位)
  • THROUGHPUT:要为磁盘预配的吞吐量
  • IOPS:要为磁盘预配的 IOPS
  • IMAGE_PROJECT:包含映像的项目
  • IMAGE:指定以下其中一项:
    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240213
    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此项会通过最新的未弃用的操作系统映像创建实例。例如,如果您指定 family/debian-12,则 Compute Engine 会通过 debian-12 映像系列中最新版本的操作系统映像创建虚拟机。如需详细了解如何使用映像系列,请参阅映像系列最佳实践
  • STORAGE_POOL_NAME:要在其中创建新磁盘的存储池的名称。

REST

您可以为存储池中的新虚拟机创建启动磁盘,方法是为 instances.insert 方法构建 POST 请求,并添加启动磁盘的 storagePool 属性。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
   "name": "VM_NAME",
   "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
   "disks": [
      {
         "deviceName": "BOOT_DISK_DEVICE_NAME",
         "initializeParams": {
            "diskSizeGb": "DISK_SIZE",
            "diskType": "DISK_TYPE",
            "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
            "boot": true,
            "provisionedIops": "IOPS_LIMIT",
            "provisionedThroughput": "THROUGHPUT_LIMIT",
            "storagePool": "POOL_URL"
         }
      }
   ]
}

替换以下内容:

  • PROJECT_ID:项目 ID
  • ZONE:存储池所在的可用区,例如 us-central1-a。这是在其中创建虚拟机和启动磁盘的可用区。
  • VM_NAME:虚拟机的名称。
  • MACHINE_TYPE:虚拟机的机器类型,例如 m3-ultramem-32
  • BOOT_DISK_DEVICE_NAME:启动磁盘的设备名称
  • DISK_SIZE:启动磁盘的大小(以 GiB 为单位)
  • DISK_TYPE:磁盘类型,指定为 URI
  • IMAGE_PROJECT:包含映像的项目
  • IMAGE:指定以下其中一项:
    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240213
    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此项会通过最新的未弃用的操作系统映像创建实例。例如,如果您指定 family/debian-12,则 Compute Engine 会通过 debian-12 映像系列中最新版本的操作系统映像创建虚拟机。如需详细了解如何使用映像系列,请参阅映像系列最佳实践
  • IOPS_LIMIT:要为磁盘预配的 IOPS
  • THROUGHPUT_LIMIT:要为磁盘预配的吞吐量
  • POOL_URL:在其中创建新磁盘的存储池。您可以将此网址作为资源的部分或完整网址提供。例如,有效值如下:
    • https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/storagePools/STORAGE_POOL_NAME
    • projects/PROJECT_ID/zones/ZONE/storagePools/STORAGE_POOL_NAME
    • zones/ZONE/storagePools/STORAGE_POOL_NAME

创建虚拟机期间在存储池中创建额外磁盘

在创建虚拟机期间在存储池中创建磁盘时,机器类型、磁盘类型和存储池必须在您选择的可用区可用。

控制台

按照以下步骤使用控制台创建具有额外的非启动磁盘的新虚拟机:

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 点击创建实例

  3. 输入虚拟机的名称。

  4. 将可用区设置为存储池所在的可用区。

  5. 选择支持存储池使用的磁盘类型的机器类型。

  6. 展开高级选项部分。

  7. 展开磁盘

  8. 点击 添加新磁盘

  9. 添加新磁盘面板中,输入磁盘的信息。将磁盘类型设置为与存储池类型匹配。

  10. 存储空间池部分中,选择启用存储池

  11. 选择存储池字段中,选择要在其中创建磁盘的存储池。

  12. 完成磁盘配置后,点击保存

  13. 完成虚拟机属性的配置。

  14. 点击创建

    控制台会在指定可用区中创建虚拟机,并在所选存储池中创建非启动磁盘。

gcloud

您可以在存储池中创建新磁盘,方法是在创建虚拟机期间使用 gcloud compute instances create 命令并添加磁盘的 storage-pool 属性。

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --create-disk=auto-delete=yes,boot=yes,device-name=BOOT_DISK_DEVICE_NAME,image=IMAGE_NAME, \
    size=BOOT_DISK_SIZE,type=BOOT_DISK_TYPE
    --create-disk=auto-delete=yes,boot=no,device-name=DATA_DISK_DEVICE_NAME,size=DATA_DISK_SIZE, \
    type=DATA_DISK_TYPE,provisioned-iops=IOPS,provisioned-throughput=THROUGHPUT, \
    storage_pool=STORAGE_POOL_NAME

替换以下内容:

  • VM_NAME:虚拟机的名称。
  • ZONE:要在其中创建虚拟机的区域和可用区,格式为 us-central1-a
  • MACHINE_TYPE:虚拟机的机器类型
  • BOOT_DISK_DEVICE_NAME:启动磁盘的设备名称
  • IMAGE_NAME:要在启动磁盘上安装的操作系统映像的名称,例如 debian-12-bookworm-v20240213
  • BOOT_DISK_SIZE:启动磁盘的大小(以 GiB 为单位)
  • BOOT_DISK_TYPE:磁盘类型
  • DATA_DISK_DEVICE_NAME:数据磁盘的磁盘设备名称
  • DATA_DISK_SIZE:启动磁盘大小,以 GiB 为单位
  • DATA_DISK_TYPE:数据磁盘类型(hyperdisk-balancedhyperdisk-throughput
  • IOPS:要为磁盘预配的 IOPS
  • THROUGHPUT:要为磁盘预配的吞吐量
  • STORAGE_POOL_NAME:要在其中创建磁盘的存储池的唯一名称。

REST

您可以在创建虚拟机期间在存储池中创建新磁盘,方法是为 instances.insert 方法构建 POST 请求并添加附加磁盘的 storagePool 属性。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
   "name": "VM_NAME",
   "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
   "disks": [
      {
        "initializeParams":{
            "sourceImage":"projects/IMAGE_PROJECT/global/images/IMAGE"
        },
        "boot":true
      },
      {
        "deviceName": "DEVICE_NAME",
        "boot":false,
        "initializeParams": {
           "diskSizeGb": "DISK_SIZE",
           "diskType": "DISK_TYPE",
           "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
           "provisionedIops": "IOPS_LIMIT",
           "provisionedThroughput": "THROUGHPUT_LIMIT",
           "storagePool": "POOL_URL"
        }
      }
   ]
}

替换以下内容:

  • PROJECT_ID:项目 ID
  • ZONE:存储池所在的可用区,例如 us-central1-a。这是在其中创建虚拟机和启动磁盘的可用区。
  • VM_NAME:虚拟机的名称。
  • MACHINE_TYPE:虚拟机的机器类型,例如 m3-ultramem-32
  • IMAGE_PROJECT:包含映像的项目
  • IMAGE:指定以下其中一项:
    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240213
    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此项会通过最新的未弃用的操作系统映像创建实例。例如,如果您指定 family/debian-12,则 Compute Engine 会通过 debian-12 映像系列中最新版本的操作系统映像创建虚拟机。如需详细了解如何使用映像系列,请参阅映像系列最佳实践
  • DEVICE_NAME:数据磁盘的设备名称
  • DISK_SIZE:数据磁盘的大小(以 GiB 为单位)
  • DISK_TYPE:磁盘类型,指定为 URI
  • IOPS_LIMIT:要为磁盘预配的 IOPS
  • THROUGHPUT_LIMIT:要为磁盘预配的吞吐量
  • POOL_URL:在其中创建新磁盘的存储池。您可以将此网址作为资源的部分或完整网址提供。例如,有效值如下:
    • https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/storagePools/STORAGE_POOL_NAME
    • projects/PROJECT_ID/zones/ZONE/storagePools/STORAGE_POOL_NAME
    • zones/ZONE/storagePools/STORAGE_POOL_NAME

在实例模板中使用存储池

用于创建托管式实例组 (MIG) 的实例模板可以包含存储池信息。使用实例模板创建的磁盘会放置在指定的存储池中。

控制台

  1. 在 Google Cloud 控制台中,打开实例模板页面。

    转到“实例模板”

  2. 点击创建实例模板

  3. 输入实例模板的名称。

  4. 对于位置,选择区域级,然后在区域字段中,选择存储池所在的区域。

  5. 选择支持 Hyperdisk Balanced 的机器类型,例如 C3。

  6. 启动磁盘部分,点击更改

  7. 启动磁盘面板中,将启动磁盘类型设置为 Hyperdisk Balanced。

  8. 配置磁盘的属性。

  9. 展开显示高级配置

  10. 存储池标题下,选择启用存储池

  11. 从列表中选择要在其中创建磁盘的存储池。

  12. 完成磁盘配置后,点击选择

  13. 完成虚拟机属性的配置。

  14. 点击创建

    该模板会在指定可用区中创建虚拟机,并在所选存储池中创建启动磁盘。

gcloud

您可以在实例模板中指定在存储池中创建启动磁盘,方法是使用 gcloud compute instance-templates create 命令并添加启动磁盘的 storage-pool 属性。

gcloud compute instance-templates create TEMPLATE_NAME \
    --instance-template-region=REGION \
    --machine-type=MACHINE_TYPE \
    --create-disk=boot=yes,type=hyperdisk-balanced,size=DISK_SIZE,provisioned-throughput=THROUGHPUT, \
    provisioned-iops=IOPS,image=projects/IMAGE_PROJECT/global/images/IMAGE, \
    storage-pool=STORAGE_POOL_NAME

替换以下内容:

  • TEMPLATE_NAME:实例模板的名称。
  • REGION:用于创建区域实例模板的区域。该区域必须包含存储池所在的可用区。
  • MACHINE_TYPE:创建虚拟机时使用的机器类型,例如 h3-standard-88
  • DISK_SIZE:磁盘的大小(以 GiB 为单位)。
  • THROUGHPUT:要为磁盘预配的吞吐量
  • IOPS:要为磁盘预配的 IOPS
  • IMAGE_PROJECT:包含映像的项目
  • IMAGE:指定以下其中一项:
    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240213
    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此项会通过最新的未弃用的操作系统映像创建实例。例如,如果您指定 family/debian-12,则 Compute Engine 会通过 debian-12 映像系列中最新版本的操作系统映像创建虚拟机。如需详细了解如何使用映像系列,请参阅映像系列最佳实践
  • STORAGE_POOL_NAME:要在其中创建新磁盘的存储池的名称。

REST

您可以为存储池中的新虚拟机创建启动磁盘,方法是为 instances.insert 方法构建 POST 请求,并添加启动磁盘的 storagePool 属性。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates
{
   "name": "VM_NAME",
   "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
   "disks": [
      {
         "deviceName": "BOOT_DISK_DEVICE_NAME",
         "initializeParams": {
            "diskSizeGb": "DISK_SIZE",
            "diskType": "DISK_TYPE",
            "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
            "boot": true,
            "provisionedIops": "IOPS_LIMIT",
            "provisionedThroughput": "THROUGHPUT_LIMIT",
            "storagePool": "POOL_URL"
         }
      }
   ]
}

替换以下内容:

  • PROJECT_ID:项目 ID
  • VM_NAME:虚拟机的名称。
  • ZONE:存储池所在的可用区,例如 us-central1-a。这是在其中创建虚拟机和启动磁盘的可用区。
  • MACHINE_TYPE:虚拟机的机器类型,例如 m3-ultramem-32
  • BOOT_DISK_DEVICE_NAME:启动磁盘的设备名称
  • DISK_SIZE:启动磁盘的大小(以 GiB 为单位)
  • DISK_TYPE:磁盘类型,指定为 URI
  • IMAGE_PROJECT:包含映像的项目
  • IMAGE:指定以下其中一项:
    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240213
    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此项会通过最新的未弃用的操作系统映像创建实例。例如,如果您指定 family/debian-12,则 Compute Engine 会通过 debian-12 映像系列中最新版本的操作系统映像创建实例。如需详细了解如何使用映像系列,请参阅映像系列最佳实践
  • IOPS_LIMIT:要为磁盘预配的 IOPS
  • THROUGHPUT_LIMIT:要为磁盘预配的吞吐量
  • POOL_URL:在其中创建新磁盘的存储池。您可以将此网址作为资源的部分或完整网址提供。例如,有效值如下:
    • https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/storagePools/STORAGE_POOL_NAME
    • projects/PROJECT_ID/zones/ZONE/storagePools/STORAGE_POOL_NAME
    • zones/ZONE/storagePools/STORAGE_POOL_NAME