0

Практическая работа. Использование файлов спецификаций

26.04.2022

На этой практической работе вы создадите, обновите и удалите группу виртуальных машин (ВМ).Вы уже убедились, что создать даже одну ВМ через yc непросто: нужно установить много разных параметров. Создание группы ВМ требует ещё больше параметров. Чтобы не указывать их все в командной строке, конфигурацию описывают в файле, который используют при создании группы. Такой файл называется спецификацией. Использование спецификаций — это первый шаг в освоении подхода Infrastructure as Code (IaC), который мы будем применять на следующих уроках.Спецификации пишутся в разных форматах. Для группы ВМ используется язык YAML. Если вы не знакомы с ним — ничего страшного. В документации есть шаблоны спецификаций, и на первых порах вам достаточно будет лишь немного изменять эти шаблоны. Ниже мы разберём, как составлять спецификации.

Часть 1. Создание Instance Group

  1. Для разворачивания группы ВМ потребуется сеть. Если сети ещё нет, создайте ее. В дальнейшем вам понадобится только её идентификатор.
  2. По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта. Если сервисного аккаунта нет, то тоже создайте его.
  3. Для создания группы необходимо подготовить её спецификацию. Создайте в любом текстовом редакторе файл с расширением yaml, например specification.yaml.

Обратите внимание: в формате YAML важны отступы слева. Даже если текст правильный, но отступы не соблюдены, при выполнении спецификации возникнут ошибки.

  1. Сначала внесите информацию о группе. Пусть группа называется my-group. Укажите сервисный аккаунт, от имени которого будете работать (см. шаг 2).

Идентификаторы ресурсов уникальны. Копируя команды из текста урока, не забывайте подставлять свои идентификаторы.

name: my-group
service_account_id: ajeu495h1s9tn1rorulb 
  1. Наша группа будет содержать три одинаковые ВМ. Машины создадим из публичного образа Ubuntu 18.04 LTS (возьмём не последнюю версию, чтобы потренироваться обновлять ВМ). Укажите идентификатор образа. Посмотрите его с помощью команды:
yc compute image list --folder-id standard-images 
  1. Опишите в спецификации ВМ. Это раздел instance_template.

Пусть каждая машина использует платформу Intel Broadwell (посмотрите поддерживаемые платформы в документации Yandex Compute Cloud),  имеет 2 Гб оперативной памяти и два ядра.

instance_template:
    platform_id: standard-v1
    resources_spec:
        memory: 2g
        cores: 2 

Добавьте описание загрузочного диска. Он будет использоваться на чтение и запись (режим READ_WRITE). Укажите идентификатор образа, который получили на шаге 5. Выделите сетевой HDD объёмом 32 Гб.

    boot_disk_spec:
        mode: READ_WRITE
        disk_spec:
            image_id: fd8fosbegvnhj5haiuoq 
            type_id: network-hdd
            size: 32g 
  1. Теперь опишите сеть: идентификатор сети из каталога по умолчанию (см. шаг 1). Задайте публичный IP-адрес, чтобы к ВМ можно было обращаться извне.
    network_interface_specs:
        - network_id: enpnr4onfs6ihtoao32u
          primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 }} 
  1. В политике планирования укажите, что машина не прерываемая.
    scheduling_policy:
        preemptible: false 
  1. В политике развертывания укажите, что в каждый момент времени может быть неработоспособной только одна машина, не больше. Запретите увеличивать число ВМ, т. е. создавать больше трех машин одновременно. Мы чуть подробнее разберём эти настройки, когда будем обновлять ВМ в группе.
deploy_policy:
    max_unavailable: 1
    max_expansion: 0 
  1. Мы создаем группу фиксированного размера из трёх ВМ. Укажите это в политике масштабирования:
scale_policy:
    fixed_scale:
        size: 3 
  1. Наконец, в политике распределения машин по зонам укажите, что будет использоваться зона ru-central1-a. Мы делаем это для простоты. Лучше распределять ВМ группы по зонам доступности: это позволит пережить краткие сбои или выход зоны из строя.
allocation_policy:
    zones:
        - zone_id: ru-central1-a 
  1. Для балансировщика нагрузки укажите целевую группу: к ней будет выполняться привязка балансировщика (это мы рассмотрим чуть ниже).
load_balancer_spec:
    target_group_spec:
        name: my-target-group 
  1. Нашей спецификации уже достаточно, чтобы создать группу ВМ. Но на эти машины не будет установлено никакое ПО, только операционная система из публичного образа. Если не менять конфигурацию, то после создания ВМ вам придётся вручную устанавливать ПО.

Чтобы сэкономить время и сократить число ошибок, давайте максимально автоматизируем создание ВМ, включая установку ПО. Для этого добавим в конфигурацию машины секцию, где будут вызываться команды установки программ. В этой же секции можно описать создание пользователей, но мы этого делать не будем, так как заходить на ВМ не планируем.Установим на машины веб-сервер nginx и на веб-странице index.nginx-debian.html, которая создается по умолчанию и выводит приветственное сообщение «Welcome to nginx», заменим слово nginx идентификатором активной ВМ и версией ОС. Поскольку мы подключим балансировщик нагрузки, идентификатор активной ВМ будет различаться для разных пользователей. Это и позволит нам убедиться в том, что балансировщик работает.Для установки ПО используйте cloud-init — пакет, выполняющий команды на ВМ при первом запуске. Вы узнали о нём из курса о ВМ. Команды опишите в файле конфигурации cloud-config. Примеры команд смотрите в документации cloud-init.Содержимое cloud-config описывается в instance_template в секции metadata:

    metadata:
      user-data: |-
        #cloud-config
          package_update: true
          runcmd:
            - [apt-get, install, -y, nginx ]
            - [/bin/bash, -c, 'source /etc/lsb-release; sed -i "s/Welcome to nginx/It is $(hostname) on $DISTRIB_DESCRIPTION/" /var/www/html/index.nginx-debian.html'] 
  1. Спецификация готова. Вот ее полный текст. Помните, что в формате YAML важно соблюдать отступы слева.
name: my-group
service_account_id: ajeu495h1s9tn1rorulb
 
instance_template:
    platform_id: standard-v1
    resources_spec:
        memory: 2g
        cores: 2
    boot_disk_spec:
        mode: READ_WRITE
        disk_spec:
            image_id: fd8fosbegvnhj5haiuoq 
            type_id: network-hdd
            size: 32g
    network_interface_specs:
        - network_id: enpnr4onfs6ihtoao32u
          primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 }}
    scheduling_policy:
        preemptible: false
    metadata:
      user-data: |-
        #cloud-config
          package_update: true
          runcmd:
            - [ apt-get, install, -y, nginx ]
            - [/bin/bash, -c, 'source /etc/lsb-release; sed -i "s/Welcome to nginx/It is $(hostname) on $DISTRIB_DESCRIPTION/" /var/www/html/index.nginx-debian.html']
 
deploy_policy:
    max_unavailable: 1
    max_expansion: 0
scale_policy:
    fixed_scale:
        size: 3
allocation_policy:
    zones:
        - zone_id: ru-central1-a
 
load_balancer_spec:
    target_group_spec:
        name: my-target-group 
  1. Теперь создайте группу ВМ по подготовленной спецификации. Уточните синтаксис команды сами:
yc compute instance-group --help 

Проверить синтаксис команды

yc compute instance-group create --file specification.yaml  

Выполнение команды может занять около 10 минут. Кстати, для тренировки вы можете вызвать эту команду в асинхронном режиме, а затем проверить ее статус и дождаться её завершения.

  1. Убедитесь, что группа создана, в веб-консоли или выведя список групп с помощью yc.
yc compute instance-group list 

В списке вы должны увидеть свою группу машин my-group:

+----------------------+------------+------+
|          ID          |    NAME    | SIZE |
+----------------------+------------+------+
| amc65sbgfqeqf00m02sc | my-group   |    3 |
+----------------------+------------+------+ 

Часть 2. Балансировщик

  1. Создайте балансировщик my-load-balancer. Посмотрите, какие параметры должны быть у соответствующей команды:
yc load-balancer network-load-balancer create --help 

В выводе справки обратите внимание, что при создании балансировщика можно сразу создать и обработчик входящего трафика (--listener).Формат параметра --listener достаточно хитрый: в нём можно указать сразу несколько подпараметров через запятую:

--listener name=my-listener,external-ip-version=ipv4,port=80 

Помимо имени обработчика, здесь указывается версия IP-протокола и порт, на котором балансировщик будет принимать трафик.Проверить синтаксис команды

yc load-balancer network-load-balancer create --region-id ru-central1 --name my-load-balancer --listener name=my-listener,external-ip-version=ipv4,port=80 

Затем подключите к балансировщику целевую группу (команда attach-target-group). Вам понадобится идентификатор группы. Чтобы узнать его, запросите с помощью yc список доступных целевых групп и выберите группу, которую вы указали в спецификации.Проверить синтаксис команды

yc load-balancer target-group list 

Целевая группа также подключается с помощью нескольких подпараметров, которые соответствуют настройкам в веб-консоли (их вы изучали на первом курсе). Для целевой группы укажите такие параметры:target-group-id — идентификатор группы,healthcheck-name, healthcheck-interval, healthcheck-timeout, healthcheck-unhealthythreshold, healthcheck-healthythreshold, healthcheck-http-port (см. документацию). Эти параметры аналогичны тем, что задаются в веб-интерфейсе при создании балансировщика. Вы их изучали в первом курсе.Укажите 80-й порт, на котором запущен nginx.Проверить синтаксис команды

yc load-balancer network-load-balancer attach-target-group b7r97ah2jn5rmo6k1dsk   --target-group target-group-id=b7r7cmdopr7bejtmj7dt,healthcheck-name=test-health-check,healthcheck-interval=2s,healthcheck-timeout=1s,healthcheck-unhealthythreshold=2,healthcheck-healthythreshold=2,healthcheck-http-port=80 

Можно не выполнять две команды (создание балансировщика и подключение целевой группы) по очереди, а одной командой create создать балансировщик с привязанной целевой группой.

  1. Убедитесь, что балансировщик создан, через веб-консоль или с помощью yc.

Часть 3. Доступ к машинам группы

  1. Проверьте состояние машин группы. Для этого запросите список машин и дождитесь статуса HEALTHY.
yc load-balancer network-load-balancer target-states b7rkqsnocbl7vgrbv6br --target-group-id b7r675m18nf06i36erd5 
  1. Теперь откройте в браузере адрес балансировщика. IP-адрес балансировщика вы можете узнать с помощью веб-консоли или yc.

На странице вы увидите приветственное сообщение и в нём идентификатор одной из машин.

Часть 4. Обновление Instance Group

  1. При создании на ВМ группы была установлена ОС Ubuntu 18.04 LTS. Теперь обновите её до Ubuntu 20.04 LTS. Ещё раз посмотрите список доступных образов (см. часть 1) и в файле спецификации измените image_id.
...
boot_disk_spec:
   mode: READ_WRITE
   disk_spec:
       image_id: fd87uq4tagjupcnm376a  
       type_id: network-hdd
       size: 32g
... 

Теперь запустите обновление группы с измененным файлом спецификации.Проверить синтаксис команды

yc compute instance-group update --name my-group --file specification.yaml 

Группа будет обновляться постепенно: когда одна машина из группы удаляется, ей на замену создаётся новая. Общее число машин в группе не увеличится. Именно такую политику обновления мы задали в файле спецификации (см. часть 1):

...
deploy_policy:
    max_unavailable: 1
    max_expansion: 0
... 

Есть и другой режим обновления: сначала в группу добавляется ВМ с новой конфигурацией, а затем отключается старая машина. Это повторяется, пока не обновятся все машины. Такому режиму соответствовала бы другая конфигурация:

...
deploy_policy:
    max_unavailable: 0
    max_expansion: 1
... 

Убедитесь, что машины обновились: на приветственной странице должна выводиться новая версия ОС.

Часть 5. Удаление машины из группы

22.На приветственной странице балансировщика посмотрите идентификатор активной машины и попробуйте удалить ее. Убедитесь, что приветственная страница остаётся доступна всё время: балансировщик переключит трафик на другую машину группы. А Yandex.Cloud тем временем пересоздаст удалённую машину.Проверить синтаксис команды

yc compute instance delete fhmraoik1u9ur4mj0u6q 

Часть 6. Удаление Instance Group

23.Теперь удалите группу и балансировщик командами yc.Проверить синтаксис команды

yc compute instance-group delete --name my-group
 
yc load-balancer network-load-balancer delete --name my-load-balancer
  

Кстати, ключевое слово --name можно и не писать: достаточно указать имя группы или балансировщика.Убедитесь, что группы и балансировщика больше нет, через веб-консоль или с помощью yc.

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380