Вопросы, касающиеся развертывания kubernetes - PullRequest
0 голосов
/ 25 апреля 2019

Мы хотим архивировать следующее:

  • Магазин Magento работает в Google Kubernetes
  • Развертывание через конфигурационный файл (например, stage.yaml, live.yaml) и т. Д.
  • PHP 7.2
  • MySQL 5.6 / MariaDB
  • Redis
  • Nginx: альпийский
  • * 1016 протокол HTTPS *
  • Постоянные заявки на объем для Magento и MySQL

Я изучаю kubernetes уже несколько недель, но я борюсь с некоторыми концепциями дизайна, и возникли некоторые основные вопросы.

Сначала я попробовал docker-compose, чем строил образы docker через Dockerfiles, наткнулся на helm и kubectl. И теперь я наткнулся на сборку контейнеров и развертывание. Теперь я знаю много разных вещей, но пример из реальной жизни или некоторые лучшие практические знания будут цениться Гугл отличный ... но похоже, что нет только одного пути.

1. Что касается стручков

Я понимаю, что капсулы должны быть легко заменены / уничтожены / воссозданы ...

лучше ли иметь такую ​​конфигурацию POD, как - контейнер nginx - php контейнер - MySQL контейнер - контейнер Redis edit: как я только что прочитал, pods совместно используют IP-адрес, так что не имеет смысла включать сюда mysql или redis, верно?

или лучше один стручок с - MySQL контейнер и один контейнер с контейнерами для - nginx - php

и еще один с - контейнер redis

2. Локальное монтирование постоянной заявки на том или удаленного рута, такого как / var / www / html, для работы.

Содержимое локального webroot происходит из git-репо.

3. Обработка типа: модуль против типа: развертывание

Я могу создать файл yaml для определения контейнеров внутри моего модуля (тип: pod). Но я также могу определить deploy.yaml (тип: развертывание).

Нужно ли ссылаться на мой pod.yaml внутри моего deploy.yaml, или развертывание включает в себя всю конфигурацию pod и заменяет pod.yaml?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

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

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

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

Также контейнеры в модуле могут разделять объемы между собой. Это также важно в некоторых случаях.

Постоянные тома Вы не можете смонтировать Git-репо в стручок. Ну, по крайней мере, это не то, что вы должны делать. Вы должны упаковать свой webroot в образ Docker и запустить его в Kubernetes. И это должен сделать Дженкинс, который может опираться на коммит.

Кроме того, вы можете поместить свои файлы на общий постоянный том, если вы хотите обмениваться файлами между репликами развертывания. Это также возможно, вы должны найти так называемые тома ReadWriteMany, такие как NFS или GlusterFS, которые могут совместно использоваться несколькими модулями.

1 голос
/ 26 апреля 2019

Развертывание через конфигурационный файл (например, stage.yaml, live.yaml) и т. Д.

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

Одна полезная часть Helm состоит в том, что существует стандартная библиотека графиков .Там, где вы говорите, что вам нужен MySQL, вы можете helm install stable/mysql и получить предварительно упакованную установку, не беспокоясь о конкретных деталях наборов с состоянием, постоянных томов, и т. Д.

Вы бы упаковаливсе, что вы предлагаете здесь, в одной диаграмме, которая будет иметь несколько (шаблонных) YAML-файлов для разных частей Kubernetes.

Обработка типа: модуль или тип: развертывание

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

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

Лучше ли иметь конфигурацию POD, например ...

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

Два основных правила здесь:

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

  2. Если количество реплик различно, они должны бытьв разных развертываниях.Вашему основному сервису может потребоваться 3 или 5 реплик, в зависимости от нагрузки;nginx просто направляет HTTP-сообщения и может нуждаться только в 1 или 3;базы данных не могут быть реплицированы и могут использовать только 1.

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

Содержимое webroot поступает из git-репо.

Самый простой способ - встроить его в образ, возможно, в изображение nginx.

Если он «большой» (размером в гигабайты), может оказаться более полезным просто разместить этот статический контент где-то за пределами Kubernetes.Все, что имеет статический хостинг файлов, будет работать нормально.

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


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

В зависимости от вашей среды, также рассмотрите возможность размещения баз данных за пределами Kubernetes.Их жизненный цикл очень отличается от контейнеров вашего приложения: вы никогда не хотите останавливать базу данных и действительно не хотите, чтобы управляемое хранилище базы данных было случайно удалено.Возможно, вам будет проще и безопаснее использовать настройку базы данных с нуля или использовать размещенную настройку базы данных.(Мой личный опыт в основном связан с AWS, и вы можете использовать RDS для экземпляра MySQL, Elasticache для Redis и S3 для статического хостинга файлов, описанного выше.)

...