Yandex Cloud
August 24, 2022

Создание прерываемой ВМ на базе Ubuntu 20.04

Перед тем как приступим к созданию ВМ необходимо установить на локальный компьютер несколько программ без которых будет невозможно продолжить работу.

Установку утилиты ус можно произвести используя мануал:
https://cloud.yandex.ru/docs/cli/operations/install-cli
Про аутентификацию можно почитать тут: https://cloud.yandex.ru/docs/cli/operations/authentication/user

Установить утилиту jq довольно просто. В Ubuntu/CentOS это можно сделать так:

apt -y install jq
yum -y install jq

Поехали!

Создадим сервисный аккаунт, который пригодится при создании ВМ. Он может быть необходим если есть надобность выполнять команды от имени сервисного аккаунта. После создания SA выдадим ему необходимые права. После создания SA создадим ВМ и прикрепим к нему наш SA.

export FOLDER_ID=$(yc config get folder-id)
yc iam service-account create --name cam-instance-sa 
export SA=$(yc iam service-account get cam-instance-sa --format json | jq -r '.id') 
yc resource folder add-access-binding $FOLDER_ID --role editor --subject serviceAccount:$SA

Посмотрим какие зоны доступности есть и выберем одну из них. При настройки сети важно учитывать в какой зоне доступности будет создана ВМ. Потому что подсеть в сети привязывается к зоне доступности. ВМ может быть создана только в одной из трёх зон. Их названия приведены ниже.

yc compute zone list
+---------------+--------+
|      ID       | STATUS |
+---------------+--------+
| ru-central1-a | UP     |
| ru-central1-b | UP     |
| ru-central1-c | UP     |
+---------------+--------+

Я выберу зону ru-central1-c.

export ZONE_ID=ru-central1-c

Создадим ВМ:

yc compute instance create \
--folder-id $FOLDER_ID \
--name srv-1 \
--description "Test machine" \
--hostname srv-1 \
--zone $ZONE_ID \
--platform standard-v2 \
--create-boot-disk image-family=ubuntu-2004-lts,size=30,type=network-ssd \
--image-folder-id standard-images \
--memory 2 \
--cores 2 \
--core-fraction 5 \
--preemptible \
--network-settings type=standard \
--network-interface subnet-name=subnet-c,nat-ip-version=ipv4 \
--ssh-key ~/.ssh/id_rsa.pub \
--metadata serial-port-enable=1 \
--service-account-id $SA \
--async

Будет создана ВМ с:
1. Именем srv-1;
2. Ubuntu 20.04;
3. 5% мощности CPU;
4. В зоне доступности ru-central1-c;
5. Прерываемая (флаг --preemptible);
6. На ВМ можно будет зайти с помощью ssh ключа.
7. Включенной серийной консолью.
8. subnet-c - название подсети, где будут созданы ip адреса для ВМ. При копировании скрипта необходимо изменить на своё значение.

Можно создать ещё одну ВМ. Изменим ей характеристики:

yc compute instance create \
--folder-id $FOLDER_ID \
--name srv-2 \
--description "Test machine_2" \
--hostname srv-2 \
--zone $ZONE_ID \
--platform standard-v3 \
--create-boot-disk image-family=ubuntu-2004-lts,size=30,type=network-hdd \
--image-folder-id standard-images \
--memory 2 \
--cores 2 \
--core-fraction 50 \
--preemptible \
--network-settings type=standard \
--network-interface subnet-name=subnet-c,address=10.130.0.197 \
--ssh-key ~/.ssh/id_rsa.pub \
--metadata serial-port-enable=1 \
--service-account-id $SA \
--async

Здесь мы поменяем платформу на более новую и изменим процент мощности CPU, потому что standard-v3 < 20% не использует. ВМ будет без внешнего адреса и с кастомным внутренним. Также, тип диска заменил на hdd.

Подключение к ВМ .

Подключимся для примера к одной из созданных ВМ.
После запуска команды на создание ВМ будет отображён идентификатор созданной машины. Примерно это будет выглядеть так:

description: Create instance
created_at: "2022-08-24T19:55:19.736838050Z"
created_by: aje25tpsqnkoaoccda0h
modified_at: "2022-08-24T19:55:19.736838050Z"
metadata:
  '@type': type.googleapis.com/yandex.cloud.compute.v1.CreateInstanceMetadata
  instance_id: ef3laci4am386thopt88

Посмотрим информацию по этому идентификатору. Нам необходимо будет узнать статус ВМ (запущена она или нет) и ip адрес, чтобы можно было бы подключиться.

yc compute instance get ef3laci4am386thopt88 --format=json | jq -r '.status'
yc compute instance get ef3laci4am386thopt88 --format=json | jq -r '.network_interfaces' | grep address

В выхлопе первой команды будет всего одно слово, показывающее текущий статус работы ВМ. У меня это RUNNING. Значит можно подключаться.
В выхлопе второй команды будет внешний адрес ВМ. К нему и подключимся по ssh. Но сначала на всякий случай проверим доступность 22 порта.

telnet 51.250.46.182 22
ssh -i ~/.ssh/id_rsa [email protected]

Если соединение с помощью telnet устанавливается, то всё в порядке. Можно подключаться.
Подключение происходит от стандартного пользователя yc-user. Необходимо будет ввести ключевое слово, которое устанавливалось на приватный ключ, если устанавливалось. И всё на ВМ зашли!

Можно получить права root:

sudo -i

Подключиться сразу под root не получится.

Посмотреть полную информацию о ВМ

yc compute instance get ef3laci4am386thopt88

Если необходимо определеить является ли данная ВМ прерываемой или нет, то в выводе этой команды должны быть строчки:

scheduling_policy:
  preemptible: true

Операции с инстансом (ВМ)

yc compute instance start ef3laci4am386thopt88
yc compute instance stop ef3laci4am386thopt88
yc compute instance restart ef3laci4am386thopt88

Для удаления ВМ можно воспользоваться командой:

yc compute instance delete srv-1
yc compute instance delete srv-2

Полезные ссылки:

Про прерываемые ВМ я ранее писал здесь: https://teletype.in/@cameda/5mevceiYnDV

Про гарантированную долю CPU тут:
https://teletype.in/@cameda/nuI4BN9yFlB

Про публичные образы: https://cloud.yandex.ru/docs/compute/concepts/image#public

Платформы:
https://cloud.yandex.ru/docs/compute/concepts/vm-platforms

Про сеть на ВМ:
https://cloud.yandex.ru/docs/compute/concepts/network

Метаданные:
https://cloud.yandex.ru/docs/compute/concepts/vm-metadata

Статусы ВМ:
https://cloud.yandex.ru/docs/compute/concepts/vm-statuses

Информация о Cloud init: https://cloud-init.io/

Про зону доступности тут: https://teletype.in/@cameda/S34zdiTcbUM
Сеть создавали тут: https://teletype.in/@cameda/ZbTkF70KWK9
Квоты в облаке: https://teletype.in/@cameda/yTu0k42dbw0