Я использую кластер kubernetes с NFS NAStorage, и когда я монтирую тома, они получают каталог .snapshot, созданный в точке монтирования. Это вызывает проблемы, например, при использовании Helm Charts, так как они не ожидают неизвестный каталог «Только чтение» по определенным путям (например, chown ... <dir>
может привести к сбою, аварийно завершив работу контейнера).
При установке Graylog Helm Chart я заметил initContainer для сбоя модуля серого журнала из-за chown: ... Read-only file system
после запуска следующей строки chown
:
chown -R 1100:1100 /usr/share/graylog/data/
, где смонтирован следующий том:
...
volumeMounts:
- mountPath: /usr/share/graylog/data/journal
name: journal
...
Я попытался обойти это, изменив команду «тихо», чтобы она запускалась :
при сбое:
chown -fR 1100:1100 /usr/share/graylog/data/ || :
Это сделало initContainer успешным, но теперь вместо этого основной контейнер падает, на этот раз из-за простого присутствия каталога .snapshot.
...
kafka.common.KafkaException: Found directory /usr/share/graylog/data/journal/.snapshot, '.snapshot' is not in the form of topic-partition
If a directory does not contain Kafka topic data it should not exist in Kafka's log directory
...
Я также пытался изменить точку монтирования тома, переместив его на один уровень вверх, но это вызывает новые проблемы:
...
volumeMounts:
- mountPath: /usr/share/graylog/data
name: data-journal
...
com.github.joschi.jadconfig.ValidationException: Parent path /usr/share/graylog/data/journal for Node ID file at /usr/share/graylog/data/journal/node-id is not a directory
Я ожидал, что будет какой-то способ отключить создание каталога .snapshot, в идеале способ размонтировать / никогда не монтировать его в первую очередь. Это или любой способ заставить контейнер должным образом игнорировать каталог, чтобы он не мешал процессам в контейнере, так как само его присутствие может серьезно нарушить работу. Однако мне еще не удалось найти ничего подобного, и я не могу найти никого, кто имел подобную проблему (введение томных снимков томов в kubernetes, по меньшей мере, не облегчило поиск).
Редактировать 1
Я пытался (частично успешно, я получаю ошибку Parent path ... is not a directory
выше), чтобы реализовать subPath: journal
, таким образом, обходя каталог .snapshot (или я так полагаю), но это все еще означает потенциальное редактирование каждой диаграммы, которая используется в моем кластер. Надеюсь, найдется альтернатива на более высоком уровне.
volumeMounts:
- mountPath: /usr/share/graylog/data/journal
name: data-journal
subPath: journal
Редактировать 2
Я работаю с кластером без металла, с MetalLB и Nginx в качестве loadbalancer + ingress controller.
Решение для хранения данных предоставляется сторонним поставщиком, и из его решения для резервного копирования создается каталог .snapshot.
Мой воображаемый обходной путь
Поскольку это в основном будет проблемой при использовании Helm Charts или других развертываний, когда монтирование томов будет более или менее вне нашего контроля, я рассмотрю применение « kustomization », которое добавляет одну строку к каждому объему, добавив
...
subPath: mount
или что-то в этом роде. Сделав это, я должен отделить фактическую точку монтирования в томе и каталог, который фактически монтируется в контейнере, на один уровень, оставив каталог .snapshot скрытым в объекте абстрактного тома. Я опубликую свои выводы и потенциальную кастомизацию, которая может из этого выйти, если кто-то столкнется с подобной проблемой.
Если кто-то думает о более обтекаемом решении, оно все равно очень приветствуется - я уверен, что это можно улучшить.