Еще в Средневековье (то есть на прошлой неделе) львиная доля логики Tilt основывалась на ограничении, что в каждом поде должен быть только один контейнер, о котором стоит позаботиться. Это был контейнер, из которого мы получали количество перезапусков, который мы отслеживали на наличие устаревшего кода и который мы обновляли на месте. Если вы запускали свой код в более чем одном контейнере на модуль, мы могли бы обновить Live Update¹ только первый контейнер, поскольку Tilt поддерживал только его. Любые изменения в других контейнерах приведут к полному docker build && kubectl apply
.
Но, как сказал Бард: Горацио, на небесах и на земле больше рабочих процессов, чем можно было бы мечтать в вашей первоначальной спецификации продукта. (Или что-то в этом роде.) Итак, у нас появилась новая функциональность: начиная с Tilt v0.10.0, вы можете использовать Live Update для любого количества контейнеров в поде! Эта функция не сильно изменилась на поверхности Tilt, но под капотом потребовалась куча реструктуризации и переписывания — нам пришлось изменить кучу внутренних предположений, чтобы учесть несколько мультипликаторов для каждого модуля. Это коснулось всего, от журналов ( kubectl get logs podabc -c mycontainer
) до проверки готовности ресурсов и мониторинга работоспособности, но мы думаем, что оно того стоило!
Вот пример репозитория, который вы можете попробовать, исходя из предпосылки, что вы, возможно, захотите повторить итерацию в своем приложении и в своем домашнем коляске одновременно. В этом Kubernetes YAML вы можете видеть, что у нас есть два разных контейнера, работающих в одном модуле:
apiVersion: apps/v1
kind: Deployment
...
spec:
...
spec:
containers:
- name: randword
image: randword
...
- name: log-ingester
image: log-ingester
Приложение называется randword
, и каждую секунду оно записывает случайное слово в файл. Сборщик журналов запускает тот же модуль, что и приложение, считывает файл журнала приложения с помощью общего тома и «принимает» журналы (здесь просто печатает их на стандартный вывод).
Tiltfile кажется простым, потому что, вероятно, это то, что вы ожидали написать с самого начала, вплоть до того момента, когда вы попробовали и получили ошибку: «Tilt поддерживает Live Updates только для первого созданного Tilt контейнера в модуле». Но теперь это работает!
k8s_yaml('deploy.yaml')
# instructions for how to a. build and b. quickly update the app image
docker_build('randword', '.', dockerfile='Dockerfile.app',
live_update=[
# detect changes to ./app, copy them to the
# running container, and restart the app
sync('./app', '/app'),
run('/restart.sh'),
])
# instructions for how to a. build and b. quickly update the sidecar image
docker_build('log-ingester', '.', dockerfile='Dockerfile.sidecar',
live_update=[
# detect changes to ./app, copy them to the
# running container, and restart the app
sync('./sidecar', '/'),
run('/restart.sh'),
])
Взлом вашего сайдкара теперь так же быстр, как взлом вашего приложения: внесите изменения в свой редактор и пуф, он работает в вашем кластере. Черт возьми, теперь вы можете настроить свое приложение и боковую панель одновременно и посмотреть, как они взаимодействуют! Это развитие, каким оно должно быть.
Что дальше?
Осведомленность о нескольких контейнерах в одном модуле настраивает нас на осведомленность о нескольких контейнерах в нескольких модулях — отсюда будет намного проще реализовать динамические обновления одного образа в нескольких модулях. Хотите запустить несколько реплик модуля в среде разработки? "Дайте нам знать"!
А пока опробуйте эту новую функциональность и наслаждайтесь ветерком в волосах, быстро обновляя все свои контейнеры. Как всегда, если у вас возникнут проблемы или у вас есть вариант использования, который вы хотите, чтобы мы поддержали, свяжитесь с нами.
1: Live Update — это способ Tilt обновить работающий контейнер на месте, позволяя вам обойти docker build
/ docker push
/ kubectl apply
. Подробнее о Live Update читайте здесь.
Первоначально опубликовано на https://blog.tilt.dev 27 августа 2019 г.