Как сделать монтированный путь gcsfuse доступным другим контейнером на том же модуле
Наша цель - использовать gcsfuse для монтирования содержимого корзины Google по какому-либо пути и поделиться этим путем с остальной частью модуля. Поэтому я попытался запустить наш initContainer в качестве привилегированного режима, чтобы запустить gcsfuse для подключения корзины к нашему пути1 внутри этого initcontainer, Я могу видеть содержимое при выполнении ls -l, что $ path1
Однако, если я утверждаю этот путь1 как VolumnMounts и Volumn, другой контейнер не сможет увидеть содержимое этого пути1.
Если я не буду следовать примеру https://github.com/ageapps/k8s-storage-buckets/tree/master/gcsfuse-init чтобы скопировать в другую папку и смонтировать эту папку как VolumnMount
Но копирование не наше предпочтение, у нас есть лучший способ?
0 ответов
Я не запускаю его в Kubernetes, а просто использую контейнеры на виртуальной машине gcp. Чтобы увидеть крепления из контейнера gcsfuse, мне нужно было также запустить второй контейнер с--privileged --cap-add SYS_ADMIN
параметры.
Также при запуске моего контейнера предохранителей я поделился монтированием с хостом, добавив этот флаг
--device /dev/fuse -v /data:/data:shared
.
Надеюсь, это поможет вам, поскольку информации о запуске gcsfuse в контейнерах не так много.
Итак... после поиска различных решений в Интернете я считаю, что это лучший способ сделать это. Существует проблема с Github, чтобы позже реализовать крепления предохранителей PersistentVolume, но мы не знаем, когда это станет возможным.
В основном решение по ссылке описывает обходной путь, в котором мы используем события жизненного цикла kubernetes postStart и preStop для монтирования и размонтирования за нас.
Первый шаг - убедиться, что у вас установлен бинарный файл gcsfuse в нашем контейнере.
Чтобы сделать это, сначала создайте файл gcsfuse.repo.
[gcsfuse]
name=gcsfuse (packages.cloud.google.com)
baseurl=https://packages.cloud.google.com/yum/repos/gcsfuse-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
После этого в вашем файле докеров:
COPY gcsfuse.repo /etc/yum.repos.d/
RUN dnf -y install gcsfuse
RUN mkdir -p /etc/letsencrypt
Чтобы выполнить команду mount на кубернетах, нам нужно запустить под как --privileged и добавить возможность SYS_ADMIN
spec:
...
template:
...
spec:
...
containers:
- name: my-container
securityContext:
privileged: true
capabilities:
add:
- SYS_ADMIN
lifecycle:
postStart:
exec:
command: ["gcsfuse", "-o", "nonempty", "your-bucket-name", "/etc/letsencrypt"]
preStop:
exec:
command: ["fusermount", "-u", "/etc/letsencrypt"]
Чтобы установить аутентификацию, вам просто нужно убедиться, что ваш кластер GKE создан с областью действия OAuth https://www.googleapis.com/auth/devstorage.read_write, а все остальное будет обрабатываться автоматически.
Хранилище GCS будет подключено во всех экземплярах вашего модуля, как ReadWriteMany, общее хранилище через fuse, но вы должны помнить, что это решение будет медленным при записи в сегменты.