Выбрать главу

Контейнеры эмулируют пользовательское пространство ОС5. Для изоляции процессов, памяти, точек монтирования и сети запускается среда выполнения контейнеров, такая как Docker, CoreOS rkt или cri-o. Преимущество этого подхода в том, что любой контейнер, который выполняется в данной среде, может видеть только собственно пользовательское пространство, поэтому он изолирован от основного компьютера и других контейнеров. При этом он ведет себя одинаково в любой среде (например, на вашем компьютере, сервере проверки качества, боевом сервере и т. д.). Но есть и недостаток: все контейнеры, запущенные на одном сервере, одновременно пользуются ядром его ОС и его оборудованием, поэтому достичь того уровня изоляции и безопасности, который вы получаете в ВМ, намного сложнее6. Поскольку применяются общие ядро и оборудование, ваши контейнеры могут загружаться в считаные миллисекунды и практически не будут требовать дополнительных ресурсов процессора или памяти. Образы контейнеров можно описывать в виде кода, используя такие инструменты, как Docker и CoreOS rkt.

Например, ниже представлен шаблон Packer под названием web-server.json, создающий Amazon Machine Image (AMI) — образ ВМ, который можно запускать в AWS:

{

  "builders": [{

    "ami_name": "packer-example",

    "instance_type": "t2.micro",

    "region": "us-east-2",

    "type": "amazon-ebs",

    "source_ami": "ami-0c55b159cbfafe1f0",

    "ssh_username": "ubuntu"

  }],

  "provisioners": [{

    "type": "shell",

    "inline": [

      "sudo apt-get update",

      "sudo apt-get install -y php apache2",

      "sudo git clone https://github.com/brikis98/php-app.git /var/www/html/app"

    ],

    "environment_vars": [

      "DEBIAN_FRONTEND=noninteractive"

    ]

  }]

}

Шаблон Packer настраивает тот же веб-сервер Apache, который мы видели в файле setup-webserver.sh, и использует тот же код на bash7. Единственное отличие от предыдущего кода в том, что Packer не запускает веб-сервер Apache (с помощью коман­ды вроде sudoserviceapache2start). Дело в том, что шаблоны серверов обычно применяются для установки ПО в образах, а запуск этого ПО должен происходить во время выполнения образа (например, когда он будет развернут на сервере).

Вы можете создать AMI из этого шаблона, запустив команду packerbuildwebserver.json. Когда сборка завершится, полученный образ AMI можно будет установить на все ваши серверы в AWS и сконфигурировать Apache для запуска во время загрузки компьютера (пример этого см. в подразделе «Средства оркестрации» на с. 35). В результате все они будут запущены абсолютно одинаково.

Имейте в виду, что разные средства шаблонизации серверов имеют различное назначение. Packer обычно используется для создания образов, выполняемых непосредственно поверх боевых серверов, таких как AMI (доступных для работы в вашей промышленной учетной записи). Образы, созданные в Vagrant, обычно запускаются на компьютерах для разработки. Это, к примеру, может быть образ VirtualBox, который работает на вашем ноутбуке под управлением Mac или Windows. Docker обычно делает образы для отдельных приложений. Их можно запускать на промышленных или локальных компьютерах при условии, что вы сконфигурировали на них Docker Engine, используя какой-то другой инструмент. Например, с помощью Packer часто создают образы AMI, у которых внутри установлен Docker Engine; дальше эти образы развертываются на кластере серверов в вашей учетной записи AWS, и затем в этот кластер доставляются отдельные контейнеры Docker для выполнения ваших приложений.

Шаблонизация серверов — это ключевой аспект перехода на неизменяемую инфраструктуру. Идея навеяна функциональным программированием, которое предполагает наличие «неизменяемых переменных». То есть после инициализации переменной ее значение больше нельзя изменить. Если нужно что-то обновить, вы создаете новую переменную. Благодаря этому код становится намного более понятным.

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

Средства оркестрации

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

• Развертывать ВМ и контейнеры с целью эффективного использования ресурсов оборудования.

• Выкатывать обновления для своих многочисленных ВМ и контейнеров, используя такие стратегии, как скользящие, «сине-зеленые» и канареечные развертывания.