Где разместить кубернеты и докерфайлы

У нас есть несколько вариантов, как правильно управлять файлами delcaration и dockerfile Kubernetes. Разработка сервисов может рассматриваться как полностью раздельная, без каких-либо межсервисных коммуникаций.

  1. Установите отдельный репозиторий, который будет содержать все настройки k8s и docker, а также сценарии сборки / развертывания.
  2. Настройте отдельный репозиторий для объявлений k8s и оставьте файлы докеров в репозиториях соответствующих сервисов.
  3. Все объявления k8s и файлы докеров размещены рядом с кодом служб (то же репо с кодом)

Какой подход лучше и обеспечивает большую гибкость? У нас есть 2 сервиса, и скоро счетчик сервисов со сложными конфигурациями внутренней сети увеличится до 8, и 3-й вариант выглядит не очень хорошо.

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

1-й вариант выглядит хорошо, поскольку он обеспечивает полную ответственность и решает только задачу DevOps, но в будущем может привести к проблемам, когда команде потребуется развернуть весь кластер k8s. Но даже в этом случае это репо может быть вытащено и выполнено в отношении minikube.

Но ни один из этих вариантов мне не подходит. Я что-то пропустил?

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

David Maze 21.08.2018 16:38
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
1
403
3

Ответы 3

На мой взгляд, второй вариант является наиболее разумным - вы можете изменить Dockerfile при изменении кода репозитория, чтобы вы могли запустить конвейер CI одним нажатием. Здесь на CI вы также хотите строить контейнеры. Кроме того, Dockerfile - это ресурс, к которому вы часто хотите, чтобы команды DevOps и Dev имели доступ и часто работали над ними вместе.

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

Затем у вас также есть все файлы Kubernetes / Helm в другом (одном) репозитории, чтобы вы могли управлять ими и комбинировать их, когда это необходимо для разных микросервисов (если у вас более сложные развертывания). Здесь в CI вам просто нужен линтинг для диаграмм / файлов.

Чтобы было понятно, должны ли разработчики вносить такие изменения в файл докеров и готовить контейнеры или DevOps?

QuestionAndAnswer 21.08.2018 17:00

Первоначальная настройка - однозначно DevOps. Разработчики не знали, как настроить доступ к серверам, на которых размещены участники. После того, как он был настроен изначально, вам часто приходится редактировать их обеими командами, что делает их еще более удобными в репозитории с кодом. Для файлов Kubernetes / Helm в другом репо вы обычно не хотите предоставлять доступ разработчикам.

Neekoy 21.08.2018 17:03

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

David Maze 21.08.2018 17:16

@DavidMaze True - я изменил его формулировку так, чтобы это звучало не так, как будто это единственно правильный подход. Когда я думаю об этом, это действительно зависит от того, какие команды у вас есть / которые вы хотите иметь. Когда у меня будет немного времени, я отредактирую пост с плюсами и минусами для каждого, по крайней мере, на мой взгляд.

Neekoy 22.08.2018 00:08

Я думаю, что имеет больше смысла помещать Dockerfiles и его файлы развертывания (k8s YAML) в одно и то же репозиторий своей службы, это упрощает сборку и развертывание службы, поскольку инструмент CI / CD может просто извлекать новый код, создавать образ, а затем разверните. Вы также можете пойти по пути Helm и закрыть все файлы развертывания из репозиториев служб, и они могут быть все вместе в одной диаграмме управления. Путь Helm позволяет легко увидеть приложение в целом. Вам следует использовать Дистанционное присутствие, если вы не хотите запускать все службы на машине разработчика.

Я бы порекомендовал №3. Все компании, с которыми я работал до сих пор, так и остаются.

С точки зрения Kubernetes

Некоторые Собственные инструменты разработки Kubernetes, такие как DevSpace (https://github.com/covexo/devspace) и проект (https://github.com/Azure/draft) рекомендуют также помещать определения ресурсов Dockerfile и Kubernetes (или файлы диаграмм Helm) в репозиторий, содержащий код.

Из Перспектива DevOps

Используя №3, разработчики смогут лучше воспроизводить производственную среду для исправления ошибок, а инструменты CI / CD обычно настраиваются для работы с определениями, подобными инфраструктуре как коду, которые содержатся в том же репозитории, что и код.

Есть исключения, например Инструмент GitLab Auto DevOps CI / CD. Он очень разработан для работы с Kubernetes и работает с внешним чартом. Однако они делают это, потому что хотят упростить настройку конвейера CI / CD для Kubernetes и хотят абстрагироваться от базовой диаграммы Helm. Однако они также позволяют самостоятельно определять диаграмму Helm и подразумевают, что она находится в том же репозитории, что и код.

Из перспектива управления версиями

№3 благоприятен, потому что вы можете быть уверены, что всегда можете запускать повторяемые сборки при объединении кода и определений «инфраструктуры». Допустим, вы хотите вернуться в прошлое и использовать старую версию своего кода. Какую версию другого репозитория, не имеющего отношения к делу, вы бы использовали? Наличие всего в одном репо позволит вам проверить любую ревизию или ветку и всегда быть уверенным, что вы можете собрать и создать свой код.

Пример: вы изменили свой инструмент управления зависимостями и вам нужно запустить другую команду для установки зависимостей. Это изменение заставит вас соответствующим образом изменить свой Dockerfile. Имея оба вместе, code + k8s + Dockerfile, вы убедитесь, что вы по-прежнему можете создавать экземпляры более старых версий, использующих старый инструмент управления зависимостями.

Другие вопросы по теме