Назад | Перейти на главную страницу

как сделать путь, установленный gcsfuse, доступным для другого контейнера в том же модуле

Наша цель - использовать gcsfuse для монтирования содержимого корзины Google на некоторый путь и поделиться этим путем с остальной частью модуля. Итак, я попытался запустить наш initContainer в качестве привилегированного режима для запуска gcsfuse для монтирования корзины на наш путь1 внутри этого initcontainer, Я вижу содержимое, когда выполняю ls -l that $ path1

Однако, если я заявляю этот путь1 как VolumnMounts и Volumn, другой контейнер не может видеть содержимое по этому пути1

Если я не следую примеру https://github.com/ageapps/k8s-storage-buckets/tree/master/gcsfuse-init скопировать в другую папку и смонтировать эту папку как VolumnMount

Но копирование - не наше предпочтение, есть ли у нас лучший способ?

Итак ... после поиска различных решений в Интернете я считаю, что это лучший способ сделать этот, Eсть Проблема с 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 

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

Я не запускаю его в Kubernetes, а просто использую контейнеры на виртуальной машине gcp. Чтобы увидеть крепления из контейнера gcsfuse, мне нужно было также запустить второй контейнер с --privileged --cap-add SYS_ADMIN параметры.

Также при запуске моего контейнера предохранителей я поделился монтированием с хостом, добавив этот флаг --device /dev/fuse -v /data:/data:shared.

Надеюсь, это поможет вам, поскольку информации о запуске gcsfuse в контейнерах не так много.