Как сделать монтированный путь 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, но вы должны помнить, что это решение будет медленным при записи в сегменты.

Другие вопросы по тегам