- У нас есть один GCP проект в рамках которого необходимо реализовать отдельную инфраструктуру для
productionиqa(stagingиreview) окружений. - Необходимо разделить жизненые циклы инфраструктуры от кода самого сервиса.
- В рамках сервиса мы оперируем следующими окружениями:
production– название говорит само за себя.staging– окружение в котором проверяем релиз перед тем как разварачивать его вproductionокружении.review– динамическое окружение в котором разработчик может посмотреть результат своей работы не дожидаясь мерджа задачи вmaster.
- В рамках инфраструктуры мы оперируем следующими окружениями:
production– название говорит само за себя, используется дляproductionокружения сервиса.qa- окружение на котором предварительно проверятся изменения до применения их наproduction. Используется дляstagingиreviewокружений сервиса.
- Оба
productionиqaокружения используют отдельный GKE кластер и Cloud SQL, но с разными параметрами. Например количеством нод в кластере и наличием реплики у Cloud SQL.
Для управления инфраструктурой необходимо три окружения. Важно понимать что это не теже самые, которыми разработчики оперируют для своего сервиса:
production- Long Lived. Название говорит само за себя. Используется дляproductionокружения сервиса. Необходим GKE кластер и Cloud SQL с репликой.staging- Long Lived (необходимо понимать что произойдет сproductionокружением) Может быть поломан/недоступен. Используется дляstaging(используется реальный Cloud SQL) иreview(используем Docker контейнер для MySQL) окружения сервиса. Послеterraform applyнеобходимо каким-либо образом перевылить сервис в том же состоянии в котором он последний раз выливался наstagingокружение и ветки для которых было созданоreviewокружение. В рамках кластера в этом окружении сервисы деплоятся в отдельные Namespace.review- Short Lived. Необходимо что бы при желании можно было посмотреть на результат до мержа в веткуstaging.
Поскольку у нас один GCP проект, каждое из окружений выносим в отдельный VPC.
Для production и staging окружения используются Environment Branches. Порядок работы c репозиторием примерно следующий:
- При необходимости внести какие-либо изменения сначала откалываем новую ветку от
staging. - Делаем задачу.
- Открываем MR в ветку
staging. - Когда ветка задачи попадет в
stagingбудет сгенерирован tfplan и после по кнопке можно его применить. - Если со
stagingвсе ок - открываем MR на мерж веткиstagingвmaster.
master : ----*-----------* (production)
/ /
/ /
staging : -*–––--------* (staging)
\ /
\ /
feature : *---* (review/feature)
Таким образом напрямую в master пушить какие-либо изменения запрещено.
В случае если необходимо внести какие-либо изменения для конкретного окружения - необходимо делать git merge руками используя стратегию ours.
В зависимости от ветки в которую спушили изменения используем отдельные Workspace и соответсвенно отдельные tfstat. В качестве бекенда используем GCS (есть возможность лочить).
project– глобальные настройки проекта вроде IAM политик. Применятся только при пуше вmaster.production– аналогично при пуше вmaster.staging– при пуше вstaging.- review-xxx – создается динамически при необходимости развернуть review окружение для задачи. После удаляется.
Пока цели вынести модули в отдельный проект нет, но всесте с тем это позволит структурировать код. Храним все в одной репе.
global/
project/ # Global GCP project settings (global workspace)
main.tf
modules/
gcp/
services/ # GCP enabled API services
iam/ # IAM policy
vpc/ # VPC Network
gke/ # Kubernetes
sql/ # Cloud SQL
services/
comments/
main.tf # Environment (production & qa workspace)
module "gke" ...
module "sql" ...