Еще в Средневековье (то есть на прошлой неделе) львиная доля логики 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 г.