kubernetes поделиться непустым томом - PullRequest
0 голосов
/ 24 января 2020

В моем приложении с docker -compose у меня есть 2 контейнера, 1 nginx и 1 python сценарий crontab, которые обновляют некоторые файлы в папке nginx / html. С помощью docker -compose, когда я объявляю

volumes:
    - shared-volume:/usr/share/nginx/html/assets/xxx:ro

, исходные файлы изображений nginx копируются на общий том.

Теперь я пытаюсь переместить приложение в k8s, но когда я использую общий том, я вижу, что исходные файлы в nginx / html отсутствуют.

Итак, вопрос в том, возможно ли скопировать исходные файлы из моих nginx изображений на общий том? Как?

____________________________ РЕДАКТИРОВАТЬ ______________________________________

Для пояснения, я новичок в k8s. С ВМ мы обычно запускаем скрипт, который обновляет папку nginx assets. С docker -compose я использую что-то вроде этого:

version: '3.7'
services:
  site-web:
    build: .
    image: "site-home:1.0.0"
    ports:
    - "80:80"
    volumes:
    - v_site-home:/usr/share/nginx/html/assets/:ro
  site-cron:
    build: ./cronScript
    image: "site-home-cron:1.0.0"
    volumes:
    - v_site-home:/app/my-assets
volumes:
  v_site-home:
    name: v_site-home

Теперь я начинаю писать развертывание (с постоянным томом? Потому что, как я понимаю, даже если существует постоянный том, набор с сохранением состояния в этом случае бесполезен) конвертировать docker -композицию в k8s. На самом деле мы не можем использовать какое-либо публичное c облако для политики безопасности (данные должны быть в нашей стране, и сейчас такой компании не существует). Поэтому идея состоит в том, чтобы запустить vanilla k8s на нескольких голых серверах и начать миграцию с очень простого приложения, такого как это. Я попытался с 2 docker, реплика: 1 и пустой том в одном модуле. В этом случае я вижу, что изначально в папке приложения nginx пусто, и мне нужно дождаться обновления crontab, чтобы увидеть мои результаты. Итак, это первая проблема.

Теперь я читаю ваш ответ и, очевидно, у меня есть другие сомнения. Лучше разделить стручок, так 1 стручок для контейнера? Развертывание с постоянным объемом это путь? В этом случае у меня старая проблема, как посмотреть исходные файлы nginx assets? Большое спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 25 января 2020

В Kubernetes нет функции Docker, которая копирует содержимое в тома при первом запуске контейнера.

Два простых ответа на это:

  1. Создайте пользовательское Nginx изображение, которое содержит ресурсы c. Вы можете использовать конструкцию Dockerfile COPY --from=other/image:tag, чтобы скопировать их из контейнера приложения в прокси-контейнер.

  2. Хранить активы где-то вне пространства контейнера. Если вы развертываете это на AWS, вы можете опубликовать sh их на S3, и даже напрямую обслуживать их из общедоступной c S3 корзины. Или, если у вас есть что-то вроде монтирования NFS, доступного для вашего кластера, пусть ваш общий процесс сборки скопирует туда ресурсы stati c.

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

В Kubernetes у вас есть дополнительная проблема, которая обычно возникает Вы хотите отдельно масштабировать прокси-серверы HTTP и серверные приложения, что означает их размещение в разных развертываниях. Когда у вас есть три копии вашего приложения, какое из них предоставляет «stati c активы»? Вам нужно использовать что-то вроде постоянного тома для общего доступа к содержимому, но большинство постоянных типов томов, к которым легко получить доступ, не поддерживают несколько подключений.

1 голос
/ 24 января 2020

Обычно для этого требуется initContainer, который запускает cp. это не очень хорошее решение, но оно выполняет свою работу.

...