Релиз nxs-anomaly: отечественная альтернатива Grafana OnCall для управления дежурствами, маршрутизации оповещений и эскалации инцидентов. Доступен на GitHub
Все статьи

Дублирование облачной инфраструктуры: зачем это нужно и как подготовиться к миграции

Как подготовить облачную инфраструктуру к возможной миграции и снизить риски зависимости от провайдера

Время чтения
16 минут
Раздел
Статьи
Дублирование облачной инфраструктуры: зачем это нужно и как подготовиться к миграции

В нестабильные времена бизнес сталкивается с целым рядом рисков — от политических санкций до стихийных бедствий. Это напрямую влияет и на работу ИТ-отрасли: например, об импортозамещении в сфере информационных технологий сегодня задумываются все, кто заботится о будущем своих продуктов.

ИТ-команды всё больше полагаются на облачную инфраструктуру для решения своих задач, поэтому её безопасность и доступность становятся приоритетными.

Даже с учётом событий последних лет остаётся достаточно много компаний, которые продолжают держать свою инфраструктуру в зарубежных облаках. Однако такая зависимость сопряжена с потенциальными проблемами и неопределённостью.

Что произойдёт, если доступ к текущему облачному провайдеру внезапно прервётся? Что делать, если потребуется быстро перейти к другому облачному провайдеру из-за правительственных санкций или других геополитических факторов?

С другой стороны, каждый кризис — это время возможностей. Как не упустить момент, когда можно захватить свою долю зарубежного рынка, имея всё необходимое для этого: зарубежные счета, востребованный на этом рынке продукт и другие ресурсы?

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

Зачем нужно дублирование облачной инфраструктуры

Поскольку диапазон возможностей ИТ-команды напрямую зависит от бюджета, который выделяется бизнесом, сначала рассмотрим этот вопрос с точки зрения руководителей компаний.

Далее речь пойдёт о бизнесах, которые пользуются услугами зарубежных облаков для размещения инфраструктуры.

Финансовые риски

Один из наиболее значительных рисков, связанных с отсутствием возможности быстро дублировать свою инфраструктуру в случае возникновения проблем с основной, — длительный простой. Это означает, что ваш продукт не продаётся и не используется на неопределённо долгой дистанции.

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

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

Репутационные риски

Репутационные потери также являются серьёзной проблемой. Текущие клиенты могут потерять доверие к продукту или услуге, что приведёт к оттоку лояльной части пользователей. Новые потенциальные клиенты могут пройти мимо, восприняв компанию как ненадёжную.

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

Риск долгого простоя

Время — это деньги. Если подобная ситуация произойдёт, на восстановление инфраструктуры и переход в другое облако может потребоваться много времени.

Например:

  • изучение альтернативных облачных провайдеров, сравнение стоимости их услуг и надёжности, оценка соответствия их местным нормам защиты данных. Этим вопросам необходимо уделить должное внимание, поскольку ещё одного шанса у бизнеса может и не быть;
  • поиск новых членов команды с опытом работы в выбранном облаке. Конечно, можно обучить текущих сотрудников, но необходимые компетенции нужны уже сейчас;
  • адаптация продукта под особенности нового облака;
  • потенциальный поиск полностью новой команды и её погружение в проект. Все мы люди и хотим стабильного дохода, поэтому текущие сотрудники, видя вокруг себя панику, отсутствие «плана Б» и туманное будущее компании, наверняка захотят найти себе более надёжное место.

Поэтому стоит трезво оценить «избыточные траты сейчас» и «необходимые траты потом».

Дублирование инфраструктуры для компаний с локальным облаком

Если ваша инфраструктура размещена в местном облаке, это ещё не означает, что данный подход вам не нужен.

Если продукт находится на этапе роста или зрелости и чувствует себя более чем уверенно, подготовленная инфраструктура может позволить быстро занять место на новом рынке и расширить зону влияния, опередив конкурентов. Этот пункт относится ко всем компаниям — независимо от того, находится их инфраструктура в зарубежном или локальном облаке.

Кроме того, в кризис может произойти что угодно. Местный облачный провайдер может не пережить кризис, отказаться от части услуг, критически необходимых вашему продукту, или повысить цены настолько, что они перестанут вас устраивать. В этом случае необходимо будет куда-то мигрировать. И здесь пригодятся заранее подготовленные наработки.

Что меняется для ИТ-команды

Теперь рассмотрим те же ситуации с точки зрения ИТ-команды.

Изменение процессов

Скорее всего, зона ответственности сотрудников существенно расширится. При отсутствии чётко отлаженного disaster recovery-плана всем придётся быстро адаптироваться и делать что-то «сверх» своих компетенций и/или рабочего времени.

Отсутствие необходимых знаний

При работе с новым облаком может возникнуть проблема нехватки знаний — особенно если руководство откажется от привлечения внешних экспертов.

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

Ручное развёртывание инфраструктуры

Ручное поднятие и настройка инфраструктуры сопровождаются целым рядом проблем.

Процесс настройки может быть сложным и требовать знания нюансов работы конкретного облака. Если специалиста с нужными компетенциями нет в штате компании, на изучение документации на должном уровне потребуется много времени. При этом может оказаться, что документация облака просто не раскрывает необходимые вопросы.

Если инфраструктура плохо документирована, а изначально её настраивали Петя и Вася, которые уволились три года назад, потребуется дополнительное время, чтобы разобраться в системе и корректно воспроизвести её в новом облаке.

Наконец, нельзя забывать о человеческом факторе. В условиях стресса, переработок и давления со стороны руководства вероятность допустить ошибку возрастает.

Адаптация приложений

Некоторые сервисы, доступные в зарубежном облаке, могут не иметь аналогов в локальном облаке. В этом случае потребуется изменить приложения или найти подходящие альтернативы.

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

Интеграция с существующими системами

Существующие системы и приложения могут оказаться несовместимыми или недоступными для приложений в новой облачной инфраструктуре.

Для решения этой проблемы потребуется время, а само решение может оказаться «костыльным» со всеми вытекающими последствиями.

Потеря данных

Неполное резервное копирование или его полное отсутствие и хранение бэкапов только в текущем облаке — комбинация «непростительных» ошибок.

Она может привести к потере критически важных данных, которая способна дорого стоить бизнесу или даже оказаться разрушительной. Кроме того, потеря данных может повлиять на репутацию компании и подорвать доверие клиентов.

Изменение CI/CD-процессов

При смене облачного провайдера придётся менять и CI/CD-процессы. Это снова означает временные затраты и необходимость использовать дополнительные решения.

Как подготовиться к возможной смене облака

Проблемы и возможные последствия определены. Теперь рассмотрим, что можно сделать заранее, чтобы избежать большинства из них и чувствовать себя увереннее.

1. Выбрать подходящее альтернативное облако

При выборе альтернативного облачного провайдера необходимо обратить внимание на следующие параметры:

  • наличие нескольких зон доступности;
  • наличие необходимых managed-сервисов, их версии и особенности. Например, в Google Cloud у Memorystore for Redis отказоустойчивость реализована в виде реплик — с опцией чтения или без неё — и автоматического failover. В Yandex Cloud high availability реализуется в виде системы Redis Sentinel или Redis Cluster;
  • наличие сервисов безопасности — Anti-DDoS и т. п.;
  • наличие необходимых дистрибутивов ОС;
  • наличие Terraform-провайдеров;
  • наличие развёрнутой документации со ссылками на официальную документацию используемых сервисов;
  • варианты тарифов поддержки;
  • надёжность. Здесь можно учитывать мнение коллег («сарафанку», профильные сайты и форумы), а также обращать внимание на страницу с клиентами и партнёрами облака;
  • соответствие местным нормам защиты данных. Если речь идёт о РФ — соответствие 152-ФЗ, ГОСТ Р;
  • стоимость услуг, варианты оплаты, наличие дисконтов и скидок.

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

2. Описать инфраструктуру как код

Подход Infrastructure as Code (IaC) имеет ряд существенных преимуществ.

Во-первых, можно быстро и автоматически создать инфраструктуру в новом облаке, протестировать её и при необходимости так же быстро и автоматически внести изменения или временно удалить ресурсы, чтобы избежать переплат.

Во-вторых, процесс развёртывания становится одинаковым и повторяемым для любого компонента инфраструктуры. Создаёте ли вы сеть или виртуальную машину — порядок действий и команды не меняются.

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

Стандартизация позволяет членам команды работать с инфраструктурой быстрее и эффективнее. В сочетании с версионированием это помогает избежать последствий ухода из компании отдельных специалистов, которые ранее обладали уникальными знаниями об инфраструктуре.

Наконец, процессы изменения инфраструктуры можно удобно встраивать в CI/CD-пайплайны: вместо сложных bash-скриптов достаточно применить новые конфигурации одной командой. 

Какие инструменты можно использовать

Традиционно существует два подхода к IaC: декларативный и императивный.

В качестве примеров рассмотрим Terraform и Ansible — два инструмента для управления инфраструктурой в виде кода, имеющие свои отличительные особенности:

1. Особенности Terraform:

  • предоставляет декларативный язык для определения инфраструктуры, который позволяет описать желаемое состояние инфраструктуры без необходимости задавать конкретные шаги для её настройки; 
  • поддерживает широкий диапазон провайдеров, включая AWS, Google Cloud, Microsoft Azure, Yandex Cloud, Selectel и другие, что позволяет использовать один и тот же язык для управления инфраструктурой в различных облачных окружениях;
  • поддерживает планирование изменений инфраструктуры, что позволяет убедиться в том, что изменения будут безопасными и не приведут к нежелательным результатам; 
  • предоставляет возможность использовать модули — логические абстракции поверх некоторого набора ресурсов, — что упрощает и стандартизирует процесс определения инфраструктуры.

2. Особенности Ansible:

  • использует императивный язык для описания задач: это означает, что вы задаёте конкретные шаги, которые Ansible должен выполнить для конфигурации инфраструктуры;
  • не требует установки дополнительного ПО на целевых серверах, так как использует SSH для удалённого управления;
  • имеет богатую библиотеку модулей, которые позволяют выполнять множество задач — от установки ПО до настройки конфигурации; 
  • предоставляет возможность создания ролей, что позволяет переиспользовать код для различных проектов и стандартизировать процесс управления инфраструктурой.

Для чего использовать Terraform, а для чего — Ansible

Terraform обычно используется для управления ресурсами облачных провайдеров: создания и изменения виртуальных машин, сетей, экземпляров managed-сервисов и т. п.

Ansible может использоваться для настройки и управления уже созданными серверами и приложениями на них.

Насколько это универсально

Terraform работает с API облака через провайдер, и описание ресурсов у различных провайдеров отличается. Но если описать компоненты инфраструктуры для текущего облака и выбрать альтернативное облако с необходимыми сервисами и Terraform-провайдером, корректировка конфигурационных файлов не составит труда.

Рассмотрим несколько примеров того, как отличаются модули на примере Google Cloud и Yandex Cloud:

1. High Availability Redis:

Google Cloud

terraform {
  backend "gcs" {
    bucket      = "my-project-tf-state"
    prefix      = "terraform/gcp/services/redis-ha/state"
    credentials = "my-project-cred.json"
  }

  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "= 4.58.0"
    }
  }
}

provider "google" {
  credentials = file(var.cred_path)
  project     = var.project
  region      = var.region
}

resource "google_redis_instance" "redis" {
  name               = var.redis_instance_name
  tier               = "STANDARD_HA"
  authorized_network = data.google_compute_network.redis-network.id

  auth_enabled   = "true"
  redis_version  = var.redis_version

  memory_size_gb = var.redis_memory_size

  replica_count           = 2
  location_id             = var.gke_cluster_zone_1
  alternative_location_id = var.gke_cluster_zone_2
}

Yandex Cloud

terraform {
  backend "s3" {
    endpoint                    = "storage.yandexcloud.net"
    bucket                      = "my-project-tf-state"
    region                      = "ru-central1"
    key                         = "redis.tfstate"
    shared_credentials_file     = "storage-cred"

    skip_region_validation      = true
    skip_credentials_validation = true
  }

  required_providers {
    yandex = {
      source  = "yandex-cloud/yandex"
      version = "= 0.88.0"
    }
  }
}

provider "yandex" {
  service_account_key_file = "key.json"
  cloud_id                 = var.cloud_id
  folder_id                = var.folder_id
  zone                     = var.default_zone
}

resource "yandex_mdb_redis_cluster" "redis" {
  name               = var.redis_instance_name
  environment        = "PRODUCTION"
  network_id         = data.yandex_vpc_network.redis.network_id

  config {
    password = random_password.redis_exporter.result
    version  = "6.2"
  }

  resources {
    resource_preset_id = var.instance_type
    disk_size          = var.disk_size
  }

  host {
    zone      = data.yandex_vpc_subnet.redis.zone1
    subnet_id = data.yandex_vpc_subnet.redis.subnet_id
  }

  host {
    zone      = data.yandex_vpc_subnet.redis.zone2
    subnet_id = data.yandex_vpc_subnet.redis.subnet_id
  }

  host {
    zone      = data.yandex_vpc_subnet.redis.zone3
    subnet_id = data.yandex_vpc_subnet.redis.subnet_id
  }
}

Далее в примерах блоки backend, required_providers и описание провайдера опустим, поскольку они меняться не будут. При этом необходимо внимательно указывать версию провайдера — от неё зависит описание сущностей.

2. Правило firewall:

Google Cloud

resource "google_compute_firewall" "openvpn-firewall" {
  name    = "openvpn-firewall-external"
  network = module.vpc_myvpc.network_self_link

  allow {
    protocol = "udp"
    ports    = ["1194"]
  }

  target_tags   = ["openvpn"]

  source_ranges = ["0.0.0.0/0"]
}

Yandex Cloud

resource "yandex_vpc_security_group" " openvpn-firewall " {
  name       = "openvpn-firewall-external"
  network_id = yandex_vpc_network.myvpc.id

  ingress {
    protocol       = "UDP"
    port           = 1194
    description    = "openvpn"
    v4_cidr_blocks = ["0.0.0.0/0"]
  }
}

3.Группа нод кластера Kubernetes:

Google Cloud

resource "google_container_node_pool" "pool" {
  name     = var.node_pool_name
  cluster  = module.private_gke.cluster_name

  initial_node_count = var.count_node_per_zone
  node_locations     = var.pool_node_zones

  autoscaling {
    min_node_count = var.min_node_count
    max_node_count = var.max_node_count
  }
  node_config {
    disk_size_gb = var.disk_size_gb
    disk_type    = var.disk_type
    machine_type = var.machine_type
  }

  upgrade_settings {
    max_surge       = 1
    max_unavailable = 0
  }

  management {
    auto_repair  = true
    auto_upgrade = false
  }
}

Yandex Cloud

resource "yandex_kubernetes_node_group" "group" {
  name        = var.node_pool_name
  cluster_id  = yandex_kubernetes_cluster.my_cluster.cluster_id

  allocation_policy {
    location {
      zone = "ru-central1-a"
    }
    location {
      zone = "ru-central1-b"
    }
    location {
      zone = "ru-central1-c"
    }
  }

  scale_policy {
    auto_scale {
      min     = var.min_node_count
      max     = var.max_node_count
      initial = var.initial_node_count

    }
  }

  instance_template {
    platform_id = "standard-v2"

    network_interface {
      nat                = true
      subnet_ids         = [id_1, id_2, id_3]
    }

    resources {
      memory = 8
      cores  = 2
    }

    boot_disk {
      size = var.disk_size_gb
      type = var.disk_type
    }

    scheduling_policy {
      preemptible = false
    }
  }

  deploy_policy {
    max_expansion   = 1
    max_unavailable = 0
  }

  maintenance_policy {
    auto_repair  = true
    auto_upgrade = false
  }
}

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

Также следует учитывать, что различаться будут только специфические для конкретного облака ресурсы. Например, модули для развёртывания приложения в кластер Kubernetes будут полностью одинаковыми.

Что касается Ansible, здесь можно говорить о полной универсальности, если ОС и дистрибутив полностью совпадают.

Можно ли использовать Terraform в РФ

HashiCorp присоединилась к санкциям и запретила доступ к своим продуктам пользователям из РФ.

Однако выход есть: у некоторых облаков — Yandex, VK, Croc — есть свои зеркала, откуда можно скачать дистрибутив инструмента и установить необходимые провайдеры.

3. Настроить сбор и хранение бэкапов в альтернативном хранилище

Этот пункт напрямую не относится к инфраструктуре, однако в контексте утраты доступа к текущему облаку не сказать о нём нельзя.

В подобной ситуации бэкапы, хранящиеся где-то вовне, станут ключевым ресурсом для восстановления утраченных данных.

Если текущие бэкапы снимаются средствами самого облака и хранятся там же, то для задействования дополнительного хранилища возникает вопрос выбора инструмента сбора, доставки и управления резервными копиями. К этому вопросу необходимо подойти со всей ответственностью.

В компании НИКСИС используется собственная разработка — nxs-backup. Новая версия продукта была представлена ранее, подробнее о ней рассказано здесь.

4. Перенести публичные Docker-образы в личный хаб

Если вы используете контейнеризацию и образы из публичных хранилищ, их стоит перенести в личный хаб и поддерживать актуальные версии.

Хранение публичных Docker-образов в личном хабе может быть критически важным в случае блокировки, удаления или утраты доступа к публичным хранилищам, таким как Docker Hub или Quay.io. Это может произойти, например, из-за изменения правил использования сервиса. Одним из инструментов, позволяющих хранить образы в личном хабе, является Harbor.

Harbor — инструмент с открытым исходным кодом для управления контейнерными образами и Helm-чартами. Он позволяет создавать и управлять личными репозиториями на основе ролевой модели доступа, сканировать образы на уязвимости и выполнять другие задачи.

5. Описать приложения как код

Если приложения запущены в Kubernetes, создайте для них Helm-чарты. Они облегчат и ускорят деплой в новый кластер, позволят быстро обновлять и откатывать приложения, что особенно полезно при тестировании работы приложений в новой инфраструктуре.

Для этих целей также был разработан собственный универсальный Helm-чарт. Подробнее о его использовании на проектах рассказано здесь.

Если Helm-чарты уже используются для деплоя сторонних сервисов, стоит позаботиться об их локальных дубликатах в собственных репозиториях. Мейнтейнеры могут удалить исходники либо доступ к ним может быть закрыт. Например, старые чарты Bitnami более недоступны, поскольку были удалены.

Если приложения просто запускаются в Docker, их можно описать в docker-compose-файлах.

6. Подготовить отдельную ветку CI/CD для альтернативного облака

Создайте отдельную ветку в Git-репозитории с CI/CD-пайплайном для альтернативного облака и поддерживайте её в актуальном состоянии.

Переход с одного облачного провайдера на другой влияет на конфигурацию инфраструктуры. Поэтому необходимо проанализировать настройки текущего CI/CD-пайплайна и внести необходимые корректировки.

Ниже приведены некоторые возможные изменения:

  • Docker-образы. Если текущий облачный провайдер предоставляет Docker-образы, которые используются в пайплайне, необходимо заменить их на Docker-образы, поддерживаемые новым провайдером, или на образы из личного хаба.
  • Настройки окружения. С большой долей вероятности в текущем пайплайне используются переменные окружения, которые зависят от текущего провайдера. Поэтому необходимо добавить дубликаты с соответствующими новыми значениями.

Необходимые изменения следует задокументировать в README.

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

Что получаем в результате

Подведём итоги и посмотрим, какие преимущества получает бизнес и его ИТ-команда в случае утраты доступа к текущей инфраструктуре.

Для бизнеса:

  • минимизация простоя, то есть финансовых издержек и репутационных потерь;
  • сохранение критически важных клиентских данных;
  • сокращение расходов на работу команды, обслуживающей инфраструктуру.

Дополнительным преимуществом становятся возможности для расширения зоны влияния на зарубежных рынках.

Для ИТ-команды:

  • минимизация человеческого фактора, то есть ошибок при ручных манипуляциях с новой инфраструктурой;
  • возможность быстрого отката или обновления;
  • единообразие в развёртывании компонентов инфраструктуры и приложений;
  • ускорение тестирования работоспособности продукта в новых средах;
  • упрощение дальнейшего управления инфраструктурой и её поддержки.

Цена подготовки:

У подхода заблаговременного дублирования инфраструктуры есть преимущества, однако за них приходится платить:

  • затратами на наращивание компетенций сотрудников;
  • затратами на поиск альтернативных решений, описание инфраструктуры и приложений как кода;
  • затратами на тестирование заготовок.

Для принятия решения компании необходимо поставить на одну чашу весов издержки на упреждающие меры, а на другую — риски от утраты контроля над текущими облачными ресурсами.

После этого можно определить, стоит ли готовиться к худшему или плыть по течению, надеясь на лучшее.

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

Оставьте заявку, чтобы обсудить проект

Ваши контакты
О вашем проекте

Нажав на кнопку, соглашаюсь на обработку персональных данных, Ознакомлен со всеми документами, размещенными на сайте

См. Политику обработки персональных данных
См. Пользовательское соглашение