Цель
У меня есть монопо-установка с растущим числом сервисов сервисов . При развертывании приложения я запускаю команду, и каждый сервис будет перестроен, а окончательные Docker образы будут опубликованы. Но с ростом количества сервисов время, необходимое для восстановления всех из них, становится все длиннее и длиннее, хотя изменения были внесены только в несколько из них.
Почему моя установка перестроила все Docker изображения хоть немного изменились? Моя цель - перестроить и опубликовать sh только те изображения, которые на самом деле изменились .
Подробности
Я использую Базель для создания Docker изображения, таким образом, в root моего проекта есть один файл BUILD
, который содержит цель, которую я запускаю, когда хочу развернуть. Это просто набор k8s_objects
, в который включены все службы:
load("@io_bazel_rules_k8s//k8s:objects.bzl", "k8s_objects")
k8s_objects(
name = "kubernetes_deployment",
objects = [
"//services/service1",
"//services/service2",
"//services/service3",
"//services/service4",
# ...
]
)
Аналогично, существует один файл BUILD
для каждого сервиса, который сначала создает библиотеку Typescript из всех исходных файлов, а затем создает Node.Js image и, наконец, передает изображение в объект Kubernetes:
load("@npm_bazel_typescript//:index.bzl", "ts_library")
ts_library(
name = "lib",
srcs = glob(
include = ["**/*.ts"],
exclude = ["**/*.spec.ts"]
),
deps = [
"//packages/package1",
"//packages/package2",
"//packages/package3",
],
)
load("@io_bazel_rules_docker//nodejs:image.bzl", "nodejs_image")
nodejs_image(
name = "image",
data = [":lib", "//:package.json"],
entry_point = ":index.ts",
)
load("@k8s_deploy//:defaults.bzl", "k8s_deploy")
k8s_object(
name = "service",
template = ":service.yaml",
kind = "deployment",
cluster = "my-cluster"
images = {
"gcr.io/project/service:latest": ":image"
},
)
Обратите внимание, что библиотека Typescript также зависит от некоторых пакетов, которые также должны учитываться при повторном развертывании!
Для развертывания я запускаю bazel run :kubernetes_deployment.apply
Первоначально я решил выбрать Bazel, потому что думал, что он будет обрабатывать только измененные сервисы. Но, очевидно, это не тот случай, или моя установка каким-то образом ошибочна.
Если вам нужно более детальное понимание проекта, вы можете проверить его здесь: https://github.com/flolude/cents-ideas