Базель - Построить, протолкнуть, развернуть Docker-контейнеры в Kubernetes в пределах Monorepo - PullRequest
3 голосов
/ 09 ноября 2019

У меня есть monorepo с некоторыми службами backend ( Node.js ) и frontend ( Angular ). В настоящее время процесс развертывания выглядит следующим образом:

  1. Проверьте, пройдены ли тесты
  2. Создание образов Docker для моих служб
  3. Передача образов Docker в реестр контейнеров
  4. Применение изменений к кластеру Kubernetes ( GKE ) с помощью kubectl

Я стремлюсь автоматизировать все эти шаги с помощью Bazel и Cloud Build . Но я действительно изо всех сил пытаюсь начать работу с Bazel:

Чтобы заставить его работать, мне, вероятно, потребуется добавить файл WORKSPACE с моими внешними зависимостями и несколько файлов BUILD для моих собственных пакетов / сервисов? Мне нужна помощь с фактической реализацией:

  1. Как собрать мои Dockerfiles с Bazel?
  2. Как вставить эти изображения в реестр (предпочтительно GCR)?
  3. Как автоматически применить изменения к Google Kubernetes Engine?
  4. Как интегрировать этот инструментарий с Google Cloud Build?

Подробнее опроект

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

Структура

├── kubernetes
├── packages
│   ├── enums
│   ├── utils
└── services
    ├── gateway

Общая информация

  • Gateway служба зависит от enums и utils
  • Все написано в Typescript
  • Каждая служба / пакет представляет собой Node-модуль
  • В папке gateway есть Dockerfile, которую я хочу построить
  • Конфигурация Kubernetes находится в папке kubernetes.
  • Обратите внимание, чтоЯ не хочу публиковать npm пакетов!

1 Ответ

3 голосов
/ 14 ноября 2019

Нам нужен портативный Docker-контейнер, который содержит наше приложение Angular вместе с его сервером и каким бы образом компьютера он ни требовал, который мы можем отобразить на любом облачном провайдере. Мы собираемся создать весь конвейер, который будет инкрементным. «Правила докера» - это быстро. По сути, он предоставляет инструментальные средства, добавляя новые слои Docker, так что изменения, которые вы вносите в приложение, являются единственными вещами, которые отправляются по проводной связи на облачный хост. Кроме того, поскольку образы Docker помечены с помощью SHA, мы повторно развернем только измененные образы. Для управления производственным развертыванием мы будем использовать Kubernetes, для которого также существуют правила Bazel. Построить образ Docker из Dockerfile с использованием Bazel, насколько мне известно, невозможно, поскольку он не разрешен из-за негерметичного характера Dockerfile. (Источник: https://blog.bazel.build/2015/07/28/docker_build.html)

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

  1. Мы должны перевести Bazel в режим наблюдения, а Deploy replace говорит кластеру Kubernetes обновить развернутую версию приложения. A.

    Команда: ibazel run: deploy.replace

  2. В случае каких-либо изменений исходного кода сделайте это в угловом формате.

  3. Базель постепенно перестраивает только те части графика сборки, которые зависят от измененного файла. В данном случае это включаетизмененный модуль ng_module, приложение Angular, включающее этот модуль, и Docker nodejs_image, в котором находится сервер. Если вы хотите обновить развертывание, то после завершения сборки он помещает новый контейнер Docker в реестр контейнеров Google, и экземпляр Kubernetes Engine начинает его обслуживать. Базель понимает график сборки, он только перестраивает то, что изменилось.

Вот несколько советов на уровне фрагментов, которые действительно могут помочь.

ФАЙЛ WORKSPACE:

Создание файла рабочего пространства Bazel, WORKSPACEФайл сообщает Bazel, что этот каталог является «рабочим пространством», которое похоже на корневой каталог проекта. Вещи, которые должны быть сделаны в Bazel Workspace, перечислены ниже. • Имя рабочей области должно совпадать с пакетом npm, в котором мы публикуем, так что этот импорт также имеет смысл при обращении к опубликованному пакету. • Упомяните все правила в рабочей области Bazel, используя «http_archive». Поскольку мы используем angular и node, правила должны быть упомянуты для rxjs, angular, angular_material, io_bazel_rules_sass, angular-version, build_bazel_rules_typescript, build_bazel_rules_nodejs. • Далее мы должны загрузить зависимости, используя «load». sass_repositories, ts_setup_workspace, angular_material_setup_workspace, ng_setup_workspace, • Загрузите также базовые образы докера, в нашем случае это «@ io_bazel_rules_docker // nodejs: image.bzl», • Не забудьте упомянуть хранилище веб-тестов (репозитарии веб-тестов (хранилище веб-тестов)True, firefox = True,)

Файл "BUILD.bazel".

• Загрузите загруженные модули ng_module, модуль проекта и т. Д. • Установите значение по умолчаниювидимость с использованием «default_visibility» • если у вас есть какие-либо тесты Jasmine, используйте ts_config и упомяните зависимости внутри него. • ng_module (здесь должны быть упомянуты активы, источники и Depndeencies). • Если у вас есть какие-либо сценарии отложенной загрузки, укажите это как часть пакета. • Укажите корневые каталоги в web_package. • В заключение упомяните данные и страницу приветствия / страницу по умолчанию.

Пример фрагмента:

load("@angular//:index.bzl", "ng_module")
ng_module(
    name = "src",
    srcs = glob(["*.ts"]),
    tsconfig = ":tsconfig.json",
    deps = ["//src/hello-world"],
)
load("@build_bazel_rules_nodejs//:future.bzl", "rollup_bundle")
rollup_bundle(
  name = "bundle",
  deps = [":src"]
  entry_point = "angular_bazel_example/src/main.js"
)

Сборка комплекта с помощью команды ниже.

bazel build :bundle

Трубопровод: через Дженкинс

Создание трубопровода через Дженкинс и запуск трубопровода существуют этапы. Каждая стадия выполняет отдельные задачи, но в нашем случае мы используем стадию для публикации изображения, используя BaZel Run.

pipeline {
  agent any
  stages {
    stage('Publish image') {
      steps {
        sh 'bazel run //src/server:push'
      }
    }
  }
}

Примечание:

bazel run :dev.apply
  1. DevПрименить маps to kubectl apply, который создаст или заменит существующую конфигурацию. (Для получения дополнительной информации см. документацию kubectl.) Это применяет разрешенный шаблон, который включает повторную публикацию изображений. Это действие должно стать рабочей лошадкой для разработки с быстрой итерацией (перестройка / повторная публикация / повторное развертывание).

  2. Если вы хотите извлекать контейнеры, используя файл рабочей области, используйте тег ниже

    container_pull (name = "debian_base", digest = "sha256: **", registry = "gcr.io", хранилище = "google-appengine / debian9",)

Если используется GKE, необходимо установить gcloud sdk, и, поскольку мы используем GKE (Google Contianer Enginer), его можно аутентифицировать, используя следующий метод.

gcloud container clusters get-credentials <CLUSTER NAME>

Объект Deploymnet следует упомянуть вследующий формат:

load ("@ io_bazel_rules_k8s // k8s: object.bzl", "k8s_object")

k8s_object(
  name = "dev",
  kind = "deployment",
  template = ":deployment.yaml",
  images = {
    "gcr.io/rules_k8s/server:dev": "//server:image"
  },
)

Sources :
•    https://docs.bazel.build/versions/0.19.1/be/workspace.htmlhttps://github.com/thelgevold/angular-bazel-examplehttps://medium.com/@Jakeherringbone/deploying-an-angular-app-to-kubernetes-using-bazel-preview-91432b8690b5https://github.com/bazelbuild/rules_dockerhttps://github.com/GoogleCloudPlatform/gke-bazel-demohttps://github.com/bazelbuild/rules_k8s#updatehttps://codefresh.io/howtos/local-k8s-draft-skaffold-garden/https://github.com/bazelbuild/rules_k8s
...