0

practicum

Практическая работа. Сбой виртуальной машины

26.04.2022

Давайте посмотрим, как принципы построения отказоустойчивых систем реализованы в Yandex.Cloud. В следующих четырех практических работах вы проверите четыре основных сценария отказов:

  • сбой виртуальной машины,
  • сбой всей зоны доступности,
  • обновление приложения
  • сбой приложения.

Вы имитируете эти отказы и понаблюдаете, как Yandex.Cloud обеспечивает доступность приложения и восстанавливает инфраструктуру после сбоев.Начнем с самого простого сценария — сбоя виртуальной машины.

  1. Создайте группу из трех виртуальных машин в трех зонах доступности под балансировщиком нагрузки. Используйте образ с ОС Ubuntu 18.04 (потом мы обновим его на более свежую версию ОС).

Используйте спецификацию specification.yaml из практической работы по yc, но адаптируйте ее для того, чтобы на ней можно было проверить разные сценарии сбоев.Во-первых, будут задействованы все три зоны доступности, поэтому нужно немного исправить allocation_policy:

allocation_policy:
    zones:
        - zone_id: ru-central1-a
        - zone_id: ru-central1-b
        - zone_id: ru-central1-c 

а также прописать подсети для каждой зоны (не забывайте подставлять идентификаторы ваших подсетей):

    network_interface_specs:
        - network_id: enpnr4onfs6ihtoao32u
          subnet_ids: 
            - b0c4h992tbuodl5hudpu
            - e2l1fgq2fbhnp6b929t7
            - e9bcvlanhbum9ggdvkh2 
          primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 }} 

Во-вторых, в секции cloud-config укажите пользователя, которого нужно создать для входа в виртуальные машины по SSH (это понадобится позднее, на одной из следующих практических работ):

        users:
          - name: my-user
            groups: sudo
            lock_passwd: true
            sudo: 'ALL=(ALL) NOPASSWD:ALL'
            ssh-authorized-keys:
              - ssh-rsa AAAAB3Nza... 

Обновленный файл спецификации specification.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
          subnet_ids: 
            - b0c4h992tbuodl5hudpu
            - e2l1fgq2fbhnp6b929t7
            - e9bcvlanhbum9ggdvkh2 
          primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 }}
    scheduling_policy:
        preemptible: false
    metadata:
      user-data: |-
        #cloud-config
        users:
          - name: my-user
            groups: sudo
            lock_passwd: true
            sudo: 'ALL=(ALL) NOPASSWD:ALL'
            ssh-authorized-keys:
              - ssh-rsa AAAAB3Nza...
        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
        - zone_id: ru-central1-b
        - zone_id: ru-central1-c
 
load_balancer_spec:
    target_group_spec:
        name: my-target-group 

Создайте группу по новой спецификации:

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

Если ранее вы удаляли балансировщик нагрузки, создайте его снова и привяжите к целевой группе:

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 --target-group target-group-id=b7rh0bhm9f82dglb2p9r,healthcheck-name=test-health-check,healthcheck-interval=2s,healthcheck-timeout=1s,healthcheck-unhealthythreshold=2,healthcheck-healthythreshold=2,healthcheck-http-port=80 

В веб-консоли убедитесь, что ресурсы созданы. Проверьте вывод по внешнему IP-адресу балансировщика — должна отображаться приветственная страница с идентификатором одной из виртуальных машин группы.

  1. Начните отслеживать состояние виртуальных машин группы и целевой группы балансировщика:
while true; do yc compute instance-group --id cl1m5ksvljnq5frekghi list-instances; yc load-balancer network-load-balancer --id b7rveh6ss5lch8vq8ri0 target-states --target-group-id b7rh0bhm9f82dglb2p9r; sleep 5; done 

Информация выводится в виде таблиц:

Информация выводится в виде таблиц:
 
+----------------------+---------------------------+----------------+-------------+------------------------+----------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |         STATUS         | STATUS MESSAGE |
+----------------------+---------------------------+----------------+-------------+------------------------+----------------+
| ef34nv4tp3ha8gl6p3df | cl1m5ksvljnq5frekghi-uzex | 84.201.148.207 | 10.128.0.42 | RUNNING_ACTUAL [1m54s] |                |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [13m]   |                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [6h]    |                |
+----------------------+---------------------------+----------------+-------------+------------------------+----------------+
 
+----------------------+-------------+---------+
|      SUBNET ID       |   ADDRESS   | STATUS  |
+----------------------+-------------+---------+
| b0c4h992tbuodl5hudpu | 10.128.0.37 | HEALTHY |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY |
+----------------------+-------------+---------+ 
  1. Сбой виртуальной машины может произойти из-за падения физического хоста, на котором она запущена. Иногда виртуальную машину могут удалить случайно, по ошибке. Чтобы имитировать сбой, удалим одну из виртуальных машин в группе через веб-консоль. Если бы это была единственная машина, на которую поступает трафик, система стала бы недоступна. Но у нас система развернута на нескольких виртуальных машинах, поэтому трафик будет перенаправлен на две оставшиеся. Через несколько секунд будет обнаружена проблема, и виртуальная машина будет выведена из-под балансировки. Об этом говорит статус UNHEALTHY.
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |        STATUS        | STATUS MESSAGE |
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
| ef330no5frc5de91v77n | cl1m5ksvljnq5frekghi-uzex | 84.201.147.33  | 10.128.0.6  | RUNNING_ACTUAL [15m] |                |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [32m] |                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [6h]  |                |
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
 
+----------------------+-------------+-----------+
|      SUBNET ID       |   ADDRESS   |  STATUS   |
+----------------------+-------------+-----------+
| b0c4h992tbuodl5hudpu | 10.128.0.37 | HEALTHY   |
| b0c4h992tbuodl5hudpu | 10.128.0.6  | UNHEALTHY |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY   |
+----------------------+-------------+-----------+ 
  1. Далее подсеть перейдет в статус DRAINING — ресурс удаляется, и с него снимается трафик. Балансировщик перестает передавать трафик этому ресурсу.
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |        STATUS        | STATUS MESSAGE |
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
| ef330no5frc5de91v77n | cl1m5ksvljnq5frekghi-uzex | 84.201.147.33  | 10.128.0.6  | CLOSING_TRAFFIC [0s] |                |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [33m] |                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [6h]  |                |
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
 
+----------------------+-------------+----------+
|      SUBNET ID       |   ADDRESS   |  STATUS  |
+----------------------+-------------+----------+
| b0c4h992tbuodl5hudpu | 10.128.0.37 | HEALTHY  |
| b0c4h992tbuodl5hudpu | 10.128.0.6  | DRAINING |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY  |
+----------------------+-------------+----------+
 
 
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |        STATUS        | STATUS MESSAGE |
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
| ef330no5frc5de91v77n | cl1m5ksvljnq5frekghi-uzex | 84.201.147.33  | 10.128.0.6  | CLOSING_TRAFFIC [9s] |                |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [33m] |                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [6h]  |                |
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
 
+----------------------+-------------+----------+
|      SUBNET ID       |   ADDRESS   |  STATUS  |
+----------------------+-------------+----------+
| b0c4h992tbuodl5hudpu | 10.128.0.37 | INACTIVE |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY  |
+----------------------+-------------+----------+ 
  1. После этого Instance Group начнет пересоздавать удалённую виртуальную машину. Процесс восстановления может занять некоторое время. Понаблюдаем за ним.

Сначала новая виртуальная машина появится в группе в статусе CREATING_INSTANCE.

+----------------------+---------------------------+----------------+-------------+-------------------------+----------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |         STATUS          | STATUS MESSAGE |
+----------------------+---------------------------+----------------+-------------+-------------------------+----------------+
| ef330no5frc5de91v77n | cl1m5ksvljnq5frekghi-uzex | 84.201.147.33  | 10.128.0.6  | CREATING_INSTANCE [-1s] |                |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [33m]    |                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [6h]     |                |
+----------------------+---------------------------+----------------+-------------+-------------------------+----------------+
 
+----------------------+-------------+----------+
|      SUBNET ID       |   ADDRESS   |  STATUS  |
+----------------------+-------------+----------+
| b0c4h992tbuodl5hudpu | 10.128.0.37 | INACTIVE |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY  |
+----------------------+-------------+----------+
 
 
 
+----------------------+---------------------------+----------------+-------------+-------------------------+----------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |         STATUS          | STATUS MESSAGE |
+----------------------+---------------------------+----------------+-------------+-------------------------+----------------+
| ef374t9ghea78p471gal | cl1m5ksvljnq5frekghi-uzex |                |             | CREATING_INSTANCE [27s] |                |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [33m]    |                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [7h]     |                |
+----------------------+---------------------------+----------------+-------------+-------------------------+----------------+
 
+----------------------+-------------+---------+
|      SUBNET ID       |   ADDRESS   | STATUS  |
+----------------------+-------------+---------+
| b0c4h992tbuodl5hudpu | 10.128.0.37 | HEALTHY |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY |
+----------------------+-------------+---------+ 
  1. Далее виртуальная машина будет открыта для трафика (статус OPEN_TRAFFIC). Балансировщик начнет процесс включения машины в список доступных машин.
+----------------------+---------------------------+----------------+-------------+-----------------------+--------------------------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |        STATUS         |         STATUS MESSAGE         |
+----------------------+---------------------------+----------------+-------------+-----------------------+--------------------------------+
| ef374t9ghea78p471gal | cl1m5ksvljnq5frekghi-uzex | 84.252.135.153 | 10.128.0.32 | OPENING_TRAFFIC [-1s] | Adding target(s)               |
|                      |                           |                |             |                       | 10.128.0.32 to target group    |
|                      |                           |                |             |                       | b7rh0bhm9f82dglb2p9r           |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [34m]  |                                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [7h]   |                                |
+----------------------+---------------------------+----------------+-------------+-----------------------+--------------------------------+
 
+----------------------+-------------+---------+
|      SUBNET ID       |   ADDRESS   | STATUS  |
+----------------------+-------------+---------+
| b0c4h992tbuodl5hudpu | 10.128.0.37 | HEALTHY |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY |
+----------------------+-------------+---------+
 
 
+----------------------+---------------------------+----------------+-------------+----------------------+--------------------------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |        STATUS        |         STATUS MESSAGE         |
+----------------------+---------------------------+----------------+-------------+----------------------+--------------------------------+
| ef374t9ghea78p471gal | cl1m5ksvljnq5frekghi-uzex | 84.252.135.153 | 10.128.0.32 | OPENING_TRAFFIC [1s] | Adding target(s)               |
|                      |                           |                |             |                      | 10.128.0.32 to target group    |
|                      |                           |                |             |                      | b7rh0bhm9f82dglb2p9r           |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [34m] |                                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [7h]  |                                |
+----------------------+---------------------------+----------------+-------------+----------------------+--------------------------------+
 
+----------------------+-------------+---------+
|      SUBNET ID       |   ADDRESS   | STATUS  |
+----------------------+-------------+---------+
| b0c4h992tbuodl5hudpu | 10.128.0.32 | INITIAL |
| b0c4h992tbuodl5hudpu | 10.128.0.37 | HEALTHY |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY |
+----------------------+-------------+---------+
 
+----------------------+---------------------------+----------------+-------------+-----------------------+--------------------------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |        STATUS         |         STATUS MESSAGE         |
+----------------------+---------------------------+----------------+-------------+-----------------------+--------------------------------+
| ef374t9ghea78p471gal | cl1m5ksvljnq5frekghi-uzex | 84.252.135.153 | 10.128.0.32 | OPENING_TRAFFIC [18s] | Awaiting HEALTHY state for     |
|                      |                           |                |             |                       | target(s) 10.128.0.32. Elapsed |
|                      |                           |                |             |                       | time: 3s.                      |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [34m]  |                                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [7h]   |                                |
+----------------------+---------------------------+----------------+-------------+-----------------------+--------------------------------+
 
+----------------------+-------------+----------+
|      SUBNET ID       |   ADDRESS   |  STATUS  |
+----------------------+-------------+----------+
| b0c4h992tbuodl5hudpu | 10.128.0.32 | INITIAL  |
| b0c4h992tbuodl5hudpu | 10.128.0.37 | INACTIVE |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY  |
+----------------------+-------------+----------+
 
+----------------------+---------------------------+----------------+-------------+-------------------------+--------------------------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |         STATUS          |         STATUS MESSAGE         |
+----------------------+---------------------------+----------------+-------------+-------------------------+--------------------------------+
| ef374t9ghea78p471gal | cl1m5ksvljnq5frekghi-uzex | 84.252.135.153 | 10.128.0.32 | OPENING_TRAFFIC [1m32s] | [NLB unhealthy]; Awaiting      |
|                      |                           |                |             |                         | HEALTHY state for target(s)    |
|                      |                           |                |             |                         | 10.128.0.32. Elapsed time: 1m  |
|                      |                           |                |             |                         | 17s.                           |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [35m]    |                                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [7h]     |                                |
+----------------------+---------------------------+----------------+-------------+-------------------------+--------------------------------+
 
+----------------------+-------------+---------+
|      SUBNET ID       |   ADDRESS   | STATUS  |
+----------------------+-------------+---------+
| b0c4h992tbuodl5hudpu | 10.128.0.32 | HEALTHY |
| b0c4h992tbuodl5hudpu | 10.128.0.37 | HEALTHY |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY |
+----------------------+-------------+---------+ 
  1. И в завершение подсеть перейдет в статус HEALTHY, а машина — в статус RUNNING_ACTUAL, и трафик будет снова разделен между тремя машинами.
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
|     INSTANCE ID      |           NAME            |  EXTERNAL IP   | INTERNAL IP |        STATUS        | STATUS MESSAGE |
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
| ef374t9ghea78p471gal | cl1m5ksvljnq5frekghi-uzex | 84.252.135.153 | 10.128.0.32 | RUNNING_ACTUAL [-1s] |                |
| ef3nquhoicdq0ccl0tlq | cl1m5ksvljnq5frekghi-iduv | 84.201.171.248 | 10.128.0.9  | RUNNING_ACTUAL [35m] |                |
| ef3oio9su52imaod7rad | cl1m5ksvljnq5frekghi-ixac | 84.252.132.4   | 10.128.0.37 | RUNNING_ACTUAL [7h]  |                |
+----------------------+---------------------------+----------------+-------------+----------------------+----------------+
 
+----------------------+-------------+---------+
|      SUBNET ID       |   ADDRESS   | STATUS  |
+----------------------+-------------+---------+
| b0c4h992tbuodl5hudpu | 10.128.0.32 | HEALTHY |
| b0c4h992tbuodl5hudpu | 10.128.0.37 | HEALTHY |
| b0c4h992tbuodl5hudpu | 10.128.0.9  | HEALTHY |
+----------------------+-------------+---------+ 

Восстановление произошло автоматически без ручного вмешательства.Обратите внимание! Эту группу виртуальных машин мы будем использовать и в трех следующих практических работах, не удаляйте ее. Если вы будете делать большой перерыв между практическими работами, вы можете остановить группу (чтобы не расходовать средства на балансе), а затем запустить ее снова.

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

Подписка

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


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