Как использовать Skaffold с томами Kubernetes?

У меня есть приложение на Python, сборка которого занимает около 15-20 минут. Вот как более-менее выглядит мой Dockerfile

FROM ubuntu:18.04
...
COPY . /usr/local/app
RUN pip install -r /usr/local/app/requirements.txt
...
CMD ...

Теперь, если я использую skaffold, любое изменение кода вызывает перестройку, и он будет выполнять переустановку всех требований (начиная с шага КОПИРОВАНИЯ все остальное будет перекомпоновано) независимо от того, были ли они уже установлены. iIn docker-compose эту проблему можно решить с помощью томов. В кубернетах, если использовать тома следующим образом:

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- image: test:test
name: test-container
volumeMounts:
- mountPath: /usr/local/venv # this is the directory of the 
# virtualenv of python
    name: test-volume
volumes:
- name: test-volume
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

будет ли эта сборка дополнительных требований решена с помощью skaffold?


person Rajdeep Mukherjee    schedule 28.08.2019    source источник


Ответы (3)


Я не могу говорить конкретно о skaffold, но сборку образа контейнера можно улучшить. Если доступно кэширование слоев, переустанавливайте зависимости только при изменении requirements.txt. Это задокументировано в передовых методах «ДОБАВИТЬ или КОПИРОВАТЬ».

FROM ubuntu:18.04
...
COPY requirements.txt /usr/local/app/
RUN pip install -r /usr/local/app/requirements.txt
COPY . /usr/local/app
...
CMD ...

Вам может потребоваться запускать обновления несколько раз, если версии модуля определены слабо и говорят, что вам нужна новая версия патча. Я обнаружил, что требования должны быть конкретными, чтобы версии не попадали под ваше приложение без вашего знания / тестирования.

Kaniko строит в кластере

Чтобы сборки kaniko использовали кеш в кластере, где по умолчанию нет постоянного хранилища, для kaniko требуется либо смонтированный постоянный том (--cache-dir), либо репозиторий образа контейнера (--cache-repo) с доступными слоями.

person Matt    schedule 29.08.2019

Если ваша цель - ускорить процесс разработки: вместо того, чтобы запускать совершенно новый процесс развертывания каждый раз, когда вы меняете строку кода, вы можете переключиться на процесс разработки на основе синхронизации, чтобы развернуть его один раз, а затем обновить файлы в запущенных контейнерах. при редактировании кода.

Skaffold поддерживает синхронизацию файлов для непосредственного обновления файлов внутри развернутых контейнеров, если вы измените их на своем локальном компьютере. Однако в документации указано, что «Синхронизация файлов - альфа» (https://skaffold.dev/docs/how-tos/filesync/), и я могу полностью согласиться с тем, чтобы работать с ним некоторое время назад: механизм синхронизации только однонаправленный (нет синхронизации из контейнера обратно в локальный) и довольно глючный, т.е. он часто дает сбой при переключении веток git, установке зависимостей и т. д., что может сильно раздражать.

Если вам нужна более стабильная альтернатива для разработки Kubernetes на основе синхронизации, с которой очень легко начать, взгляните на DevSpace: https://github.com/devspace-cloud/devspace

Я являюсь одним из сопровождающих DevSpace и начал этот проект, потому что Скаффолд был слишком медленным для нашей команды и тогда у него не было синхронизации файлов.

person LukasGentele    schedule 28.08.2019
comment
Да, действительно, tilt - еще один инструмент, с которым я столкнулся, который будет делать то же самое. В настоящее время я запускаю несколько тестов и POC, чтобы опробовать его docs.tilt.dev/live_update_tutorial.html - person Rajdeep Mukherjee; 29.08.2019
comment
Да, тилт тоже неплохой. Особенно, если вы хотите работать с minikube и т. Д. В локальном кластере. - person LukasGentele; 29.08.2019

ответ от @ Matt - отличная передовая практика (+1) - skaffold сам по себе не решит проблему с кешем нижележащего уровня. проблемы с аннулированием, которые приводят к необходимости переустанавливать требования во время каждой сборки.

Для повышения производительности вы можете кэшировать все python пакеты в volume, установленном в вашем модуле, например:

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- image: test:test
  name: test-container
volumeMounts:
- mountPath: /usr/local/venv
    name: test-volume
- mountPath: /root/.cache/pip
    name: pip-cache
volumes:
- name: test-volume
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4
- name: pip-cache
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

Таким образом, если кеш сборки когда-либо станет недействительным и вам придется переустановить requirements.txt, вы сэкономите время, загрузив их из кеша.

Если вы создаете с помощью kaniko, вы также можете кэшировать базовые изображения на постоянный диск с помощью kaniko-warmer, для пример:

...
volumeMounts:
...
- mountPath: /cache
    name: kaniko-warmer
volumes:
...
- name: kaniko-warmer
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

Запуск kaniko-warmer внутри модуля: docker run --rm -it -v /cache:/cache --entrypoint /kaniko/warmer gcr.io/kaniko-project/warmer --cache-dir=/cache --image=python:3.7-slim --image=nginx:1.17.3. Ваш skaffold.yaml может выглядеть примерно так:

apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
  - image: test:test
    kaniko:
      buildContext:
        localDir: {}
      cache:
        hostPath: /cache
  cluster:
    namespace: jx
    dockerConfig:
      secretName: jenkins-docker-cfg
  tagPolicy:
    envTemplate:
      template: '{{.DOCKER_REGISTRY}}/{{.IMAGE_NAME}}'
deploy:
  kubectl: {}
person masseyb    schedule 29.08.2019
comment
Если вы делаете сборки докеров в кластере, предполагая, что kaniko, то же самое можно сделать с помощью --cache < Параметры / a> и --cache-dir - person Matt; 30.08.2019
comment
Можно ли использовать --cache-dir для python пакетов? Не знал об этом, я использую kaniko-warmer для кеширования базовых изображений в --cache-dir (также поддерживаемом постоянным диском), придется проверить это. Спасибо. - person masseyb; 30.08.2019
comment
Извините, я неправильно сформулировал свой комментарий. Вы не используете cache-dir специально для пакетов python, но используя ту же mountPath настройку для каталога кэша kaniko, kaniko может кэшировать слои изображений контейнера. После настройки файла Dockerfile из моего ответа начальные слои requirements.txt и pip install могут быть извлечены из кеша локального диска, когда содержимое недоступно. не изменилось. - person Matt; 30.08.2019
comment
Фактически, с многоступенчатой ​​сборкой у вас может быть кешированный образ с кешем pip в нем. Тогда окончательное изображение может остаться чистым, просто скопировав нужные пути к файлам. - person Matt; 30.08.2019
comment
Ах, да, я использую kaniko / kaniko-warmer (jenkins x с tekton конвейерами) для своих сборок - обновил свой ответ. Не думал о многоступенчатой ​​сборке, но это хороший момент, например создайте образ только с зависимостями, следуя лучшим практикам, кешируйте изображение для их расширения с помощью kaniko-warmer, если вам нужно перестроить их, затем кешируйте зависимости (например, pip-cache). Выглядит вполне законно. - person masseyb; 30.08.2019
comment
Последняя версия (и) nexus поддерживает проксирование / кеширование apt репозиториев (а также многие другие вещи, например, npm, pypi, docker, ...). squid также может использоваться как прокси-сервер для сквозного кеширования. То же самое для реестра docker, чтобы избежать необходимости постоянно извлекать изображения из Интернета, согласно doc. - person masseyb; 30.08.2019
comment
@masseyb Я попробовал ваше решение с помощью kaniko, но skaffold dev выдает следующее сообщение: listing files: undefined artifact type: {DockerArtifact:<nil> BazelArtifact:<nil> JibMavenArtifact:<nil> JibGradleArtifact:<nil> KanikoArtifact:0xc00030bb90 CustomArtifact:<nil>} Не уверен, что происходит! - person Rajdeep Mukherjee; 06.09.2019