Я только начал изучать концепции kubernetes. Я использую диаграмму управления для развертывания модуля. Застрял, чтобы решить проблему ниже. Любой любезно помогите мне разблокировать эту проблему.

У меня есть три контейнера, скажем, A, B и C. В контейнере A есть файл => "/root/dir1/sample.txt". В противном случае я могу подготовить этот файл в автономном режиме, но его необходимо смонтировать во всех трех контейнерах. В контейнере A и контейнере C запущена служба, которая будет обновлять этот файл. В контейнере B запущена служба, которая будет читать этот файл. поэтому мне нужно, чтобы этот файл был общим для всех трех контейнеров.

Подход 1: Используя том emptyDir, я попытался смонтировать этот файл, но в моем случае это не помогло. Потому что, когда я использую emptyDir, я теряю все файлы в dir1, которые поступают через образы контейнеров. Также я не хочу, чтобы другие файлы в каталоге dir1 были разделены между контейнерами. В дополнение к этому мне нужно смонтировать файл с той же структурой каталогов «/root/dir1/sample.txt» вместо создания пустого каталога, например, «/root/dir2» в качестве монтирования с общими данными и копирования sample.txt в dir2 как « /root/dir2/sample.txt". Причина теперь заключается в монтировании /root/dir2 во всех трех контейнерах (запись файла происходит в любом контейнере, что отражается в других контейнерах). Но это не помогло в моем случае, так как мне нужно смонтировать файл с той же структурой каталогов «/root/dir1/sample.txt».

Подход 2: Используя том configmap, я могу смонтировать файл «sample.txt» в каталоге dir1, как и ожидалось. Но он смонтирован как файловая система только для чтения, и контейнеры A и C не могут записать файл.

Таким образом, два вышеуказанных подхода не помогли моему делу. Было бы здорово, если бы кто-нибудь помог мне смонтировать файл непосредственно в контейнеры с доступом для записи в той же структуре каталогов и общим доступом для контейнеров. Или любой тип тома, доступный в kubernetes, поможет в моем случае (https://kubernetes.io /docs/concepts/storage/volumes/#cinder).

Заранее спасибо!

1
anonymous user 4 Фев 2022 в 17:28
Вы говорите, что можете подготовить файл в автономном режиме; можете ли вы COPY добавить его в свой Dockerfile и выполнить обычную последовательность сборки и развертывания, когда вам нужно его обновить? Поскольку Kubernetes по своей сути является кластерной средой, «совместное использование файлов» обычно не работает так хорошо.
 – 
David Maze
4 Фев 2022 в 18:14

2 ответа

Это сценарий чтения-записи-многих, и я знаю два способа сделать это.

Во-первых, вы можете использовать внешнее монтирование (например, сервер NFS), а затем смонтировать его в свой модуль. Если у вас нет собственного сервера NFS, вы можете использовать управляемую службу NFS, такую ​​как Cloud Firestore< /a> в Google или EFS в AWS (обратите внимание, что за это взимается плата)

Во-вторых, вы можете установить в кластер средство подготовки NFS, например этот который сгенерирует новый StorageClass, который вы можете использовать для создания PersistentVolume, который поддерживает чтение-запись-много, и вы можете поделиться им со своими модулями. Это, хотя и собственный вариант кластера, имеет свои собственные проблемы — если модуль подготовки дает сбой или его выселяют, модули, зависящие от монтирования NFS, будут зависать, а затем также аварийно завершать работу, поэтому YMMV.

0
Blender Fox 4 Фев 2022 в 18:17

Я думаю, что ваш лучший вариант - использовать emptyDir и initContainer, который монтирует его по другому пути и копирует в него исходные файлы. Это не редкий узор. Посмотрите его в действии в операторе кластера Rabbitmq.

Это будет выглядеть примерно так в стручке:

(...)
spec:
  volumes:
    - name: shared-dir
      emptyDir: {}
  initContainers:
    - name: prepare-dir
      image: YOUR_IMAGE
      command:
        - sh
        - '-c'
        - 'cp /root/dir1 /tmp/dir1'
      volumeMounts:
        - name: shared-dir
          mountPath: /tmp/dir1/
  containers:
    - name: container-a
      image: YOUR_IMAGE
      volumeMounts:
        - name: shared-dir
          mountPath: /root/dir1/
    - name: container-b
      image: YOUR_IMAGE
      volumeMounts:
        - name: shared-dir
          mountPath: /root/dir1/
(...)
0
chicocvenancio 4 Фев 2022 в 18:24