Editar o tipo de máquina de uma instância de VM


Se a VM não tiver um SSD local e não fizer parte de um grupo de instâncias gerenciadas (MIG, na sigla em inglês), será possível alterar otipo de máquina da VM após pará-la.

Se o tipo de máquina atual não for adequado para as cargas de trabalho executadas na VM, altere o tipo de máquina dessa VM. É possível fazer isso para ajustar o número de vCPUs e memória à medida que a carga de trabalho muda. Por exemplo, é possível iniciar uma VM com uma máquina menor durante a instalação, o desenvolvimento e o teste, e alterar a VM para usar um tipo de máquina maior quando você estiver pronto para cargas de trabalho de produção.

Para VMs que não têm um SSD local e não fazem parte de um MIG, é possível alterar o tipo de máquina sem afetar os seguintes recursos:

  • Chaves SSH da VM
  • As configurações da VM, como metadados
  • Os dados de disco permanente da VM, incluindo aplicativos instalados e dados do aplicativo

Se precisar alterar o tipo de máquina de VMs em um MIG, consulte Aplicar automaticamente as atualizações de configuração de VM em um MIG.

Antes de começar

  • Entenda como interromper uma VM.
  • Entenda os tipos de máquina.
  • Configure a autenticação, caso ainda não tenha feito isso. A autenticação é o processo de verificação da sua identidade para acesso a serviços e APIs do Google Cloud. Para executar códigos ou amostras de um ambiente de desenvolvimento local, autentique-se no Compute Engine da seguinte maneira.

    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.

    Java

    Para usar os exemplos Java desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

    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.

    Confira mais informações em Set up authentication for a local development environment.

    Python

    Para usar os exemplos Python desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

    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.

    Confira mais informações em Set up authentication for a local development environment.

    REST

    Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.

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

      gcloud init

    Para mais informações, consulte Autenticar para usar REST na documentação de autenticação do Google Cloud.

Limitações

Implicações no faturamento

Cada tipo de máquina é faturado com uma taxa diferente, por isso entenda as implicações de preços da alteração dos tipos de máquina. Por exemplo, um tipo de máquina e2-standard-2 custa mais do que um tipo de máquina e2-micro.

Alterar um tipo de máquina também pode afetar os descontos por uso prolongado para essa VM. Os descontos por uso prolongado são calculados separadamente para categorias diferentes na mesma região. Se você alterar os tipos de máquina para que o novo tipo de máquina esteja em uma categoria diferente, o ambiente de execução subsequente da instância de máquina virtual será computado para o desconto de uso prolongado da nova categoria.

Por exemplo, suponha que você tenha uma VM com o tipo de máquina n2-standard-2 em execução por meio mês. Você decide alterar o tipo de máquina para m1-ultramem-40. Depois que você fizer essa alteração, o Compute Engine começará a contar o ambiente de execução da instância de máquina virtual para o desconto por uso prolongado da vCPU e da categoria de memória.

Na sua fatura, você veria um desconto de uso prolongado aplicado ao tipo de máquina n2-standard-2 de antes de você fazer a alteração do tipo de máquina e um desconto de uso prolongado separado para m1-ultramem-40, se sua instância permanecer em execução em m1-ultramem-40 por pelo menos 25% do restante do mês.

Práticas recomendadas

Veja algumas práticas recomendadas para ajudar você a alterar o tipo de máquina da VM.

  • Faça backups regulares dos dados do disco permanente usando snapshots. Crie um snapshot dos dados de discos permanentes antes de alterar o tipo de máquina. Se você quiser ter certeza de que o novo tipo de máquina é capaz de aceitar os dados na VM existente, é possível capturar um snapshot do disco permanente e usá-lo para iniciar uma segunda VM com o novo tipo de máquina para confirmar se a VM foi iniciada com sucesso.

  • Adicione mais discos permanentes ao arquivo /etc/fstab. Se você tiver outros discos permanentes anexados à sua VM, verifique se eles foram adicionados ao arquivo /etc/fstab para que sejam montados automaticamente quando a VM for reinicializada.

  • Crie uma reserva antes de alterar o tipo de máquina. Para evitar erros relacionados à disponibilidade de recursos, crie Reservas do Compute Engine para os novos tipos de máquina quando estão disponíveis para reservá-los em uma zona. As reservas ajudam a garantir que os recursos estejam disponíveis quando você precisa deles.

Para criar uma reserva, siga estas etapas:

  1. Crie uma reserva (ou identifique reservas existentes) com propriedades idênticas às VMs planejadas. A contagem de VMs da reserva precisa ser igual ou maior do que o número de VMs que você quer mudar. Se quiser evitar que outras VMs consumam essa reserva, use a opção specificReservationRequired.

  2. Verifique se as VMs planejadas poderão consumir a reserva:

    1. Verifique se as VMs desejadas têm a afinidade de reserva correta.
    2. Imediatamente antes de alterar as VMs, verifique se a reserva tem capacidade suficiente.

Alterar um tipo de máquina

Só é possível alterar o tipo de máquina de uma instância interrompida. Uma VM é considerada interrompida somente quando a VM está no estado TERMINATED. Não é possível alterar o tipo de máquina de uma instância em execução.

Se você estiver atualizando seu tipo de máquina para a última geração, consulte Mover sua VM para uma série de máquinas de terceira geração antes de prosseguir.

Permissões exigidas para a tarefa

Para executar esta tarefa, é preciso ter a permissão a seguir:

  • compute.instances.setMachineType na VM

Console

  1. No console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar instâncias de VM

  2. Na coluna Nome, clique no nome da instância para a qual você quer alterar o tipo de máquina.

  3. Na página Detalhes da instância, siga estas etapas:

    1. Se a VM estiver em execução, selecione Parar no menu na parte de cima da página.
    2. Para editar a VM, clique em Editar.
    3. Na seção Configuração da máquina, selecione o tipo de máquina que você quer usar ou crie um tipo de máquina personalizado.

    4. Para salvar as alterações, clique em Save.

    5. Reinicie a VM.

gcloud

  1. Interrompa a VM usando o comando gcloud compute instances stop:

    gcloud compute instances stop VM_NAME
    

    Substitua VM_NAME pela VM que contém o tipo de máquina a ser alterado.

  2. Altere o tipo de máquina usando o comando gcloud compute instances set-machine-type:

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

    Substitua NEW_MACHINE_TYPE pelo novo tipo de máquina para a VM. O tipo de máquina pode ser um dos seguintes:

  3. Interrompa a VM usando o comando gcloud compute instances start:

    gcloud compute instances start VM_NAME
    

    Substitua VM_NAME pelo nome da VM alterada.

Java

Java

Antes de testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido do Compute Engine: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Java do Compute Engine.

Para autenticar-se no Compute Engine, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


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

Antes de testar esta amostra, siga as instruções de configuração do Python no Guia de início rápido do Compute Engine: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Python do Compute Engine.

Para autenticar-se no Compute Engine, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

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. Pare a VM usando o método instances.stop:

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

    Substitua:

    • PROJECT_ID: o ID do projeto

    • ZONE: a zona que contém a VM

    • VM_NAME: a instância que contém o tipo de máquina a ser alterado.

  2. Altere o tipo de máquina usando o método instances.setMachineType:

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

    No corpo da solicitação, forneça o machineType atualizado:

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

    Substitua:

    • MACHINE_TYPE_ZONE: a zona que contém o tipo de máquina.

    • NEW_MACHINE_TYPE: o novo tipo de máquina para a instância.

      O tipo de máquina pode ser um dos seguintes:

  3. Pare a VM usando o método instances.start:

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

    Substitua:

    • PROJECT_ID: o ID do projeto
    • ZONE: a zona que contém a VM
    • VM_NAME: o nome da VM que você alterou.

Migrar para um tipo de máquina menor

Se você mudar de um tipo de máquina com mais recursos para um tipo de máquina com menos recursos, como mover de um tipo de máquina e2-standard-8 para um e2-standard-2, é possível ter problemas de recursos de hardware ou limitações de desempenho porque os tipos de máquinas menores são menos eficientes do que os tipos de máquinas maiores. Verifique se o novo tipo de máquina é compatível com os aplicativos ou serviços que estão sendo executados na instância ou se você atualizou os serviços e aplicativos para que eles sejam executados em tipos de máquinas menores.

Analise as recomendações de redimensionamento antes de alterar o tipo de máquina. Para informações sobre recomendações de dimensionamento do Compute Engine, consulte Como aplicar recomendações de tipo de máquina para instâncias de VM.

Mover a VM para uma série de máquinas de terceira geração

Quando os requisitos são atendidos, é possível modificar a VM para usar um tipo de máquina em uma série de máquinas de nova geração alterando o tipo de máquina, por exemplo, de m1-ultramem-160 para m3-ultramem-128.

Os tipos de máquina de terceira geração e os tipos de máquina Arm T2A podem não oferecer suporte aos mesmos recursos e interfaces do tipo de máquina atual. Antes de iniciar o processo de migração, revise os requisitos e as considerações em Preparar-se para migrar para uma nova VM.

Para alterar o tipo de máquina da instância de VM para um tipo de máquina de terceira geração, use uma das abordagens a seguir.

Criar uma nova instância de VM e mover a carga de trabalho

Neste procedimento, você cria uma nova instância de VM e move a carga de trabalho para a nova VM.

Para detalhes sobre como concluir esse procedimento, consulte Migrar a carga de trabalho de uma VM atual para uma nova VM.

Alterar o tipo de máquina para um tipo novo

Neste procedimento, você verifica se a instância de VM atual pode ser atualizada para usar o novo tipo de máquina e, em seguida, altera o tipo de máquina.

  1. Verifique se a instância de VM atual usa uma versão do sistema operacional compatível com o novo tipo de máquina. Se a versão não for compatível, siga as instruções em Mover a carga de trabalho de uma VM atual para uma nova.

  2. Se você quiser alterar o tipo de máquina da VM para um tipo T2A, siga as instruções em Mover sua carga de trabalho de uma VM existente para uma nova.

  3. Se a VM atual tiver um SSD local anexado, siga as instruções em Mover a carga de trabalho de uma VM atual para uma nova.

  4. Verifique se os aplicativos e programas são compatíveis com uma rede ou interface de armazenamento diferente, como gVNIC ou NVMe.

  5. Consulte as práticas recomendadas para alterar o tipo de máquina de uma VM.

  6. Siga o procedimento descrito em Alterar um tipo de máquina.

A seguir