Вопрос или проблема
У меня есть приложение, которое требует три конфигурационных файла, которые должны находиться в одной директории. Однако три конфигурационных файла поступают из двух секретов и одного конфигурационного мапа.
Все попытки до сих пор приводили или к ошибке от K8s из-за того, что разные тома имеют одинаковый mountPath
(разные subPath
), или к созданию директорий в файловом пути, где я хотел получить файл.
Идеальным результатом было бы получение контейнера с:
/app/config/database.json <-- Файл из секрета 1
/app/config/message_broker.json <-- Файл из секрета 2
/app/config/app_config.json <-- Файл из конфигурационного мапа
Это возможно, или это просто ограничение K8s?
Ответ или решение
Да, в Kubernetes возможно смонтировать несколько элементов из разных секретов и конфигурационных карт в одну и ту же директорию, однако для этого необходимо использовать subPath
для каждого монтируемого элемента. Ваша задача заключается в правильной настройке конфигурации пода, чтобы избежать ошибок и получить желаемую структуру каталогов.
Для достижения этой цели, вы можете определить несколько томов (volumes) – для каждого секрета и конфигурационной карты, а затем использовать subPath
для указания конкретного файла, который будет монтироваться в целевую директорию.
Вот пример манифеста пода, который иллюстрирует данный подход:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app-container
image: your-image
volumeMounts:
# Монтируем файл database.json из секрета
- name: secret1
mountPath: /app/config/database.json
subPath: database.json
# Монтируем файл message_broker.json из другого секрета
- name: secret2
mountPath: /app/config/message_broker.json
subPath: message_broker.json
# Монтируем файл app_config.json из конфигурационной карты
- name: config-map-volume
mountPath: /app/config/app_config.json
subPath: app_config.json
volumes:
- name: secret1
secret:
secretName: secret1-name
- name: secret2
secret:
secretName: secret2-name
- name: config-map-volume
configMap:
name: config-map-name
В данном примере:
secret1
монтируется с файломdatabase.json
по указанномуmountPath
.secret2
монтируется с файломmessage_broker.json
по аналогичному пути.- Конфигурационная карта монтируется с файлом
app_config.json
.
Каждый из этих томов использует subPath
, что позволяет избежать конфликта между монтированием в одну и ту же директорию.
После применения этого манифеста, вы получите желаемую структуру файлов в директории /app/config/
:
/app/config/database.json <--- Файл из секрета 1
/app/config/message_broker.json <--- Файл из секрета 2
/app/config/app_config.json <--- Файл из конфигурационной карты
Таким образом, ваш вопрос о возможности замещения нескольких элементов в одной и той же директории решен, и вы сможете использовать конфигурационные файлы без дополнительных ограничений.