Создание постоянного тома Kubernetes с подключенным каталогом

В моем /mnt/ установлено несколько жестких дисков (например, в /mnt/hdd1/, /mnt/hdd2/). Есть ли способ создать постоянный том K8s на /mnt, который мог бы видеть содержимое жестких дисков, подключенных в /mnt? Когда я создаю локальный постоянный том на /mnt, модули K8s видят каталоги hdd1 и hdd2, но они кажутся пустыми.

Вот что я тестировал:

Нежелательное решение 1:

Я могу создать локальный постоянный том на /mnt/hdd1, и тогда мой модуль K8s сможет видеть содержимое жесткого диска hdd1. Но, как я упоминал ранее, я хочу, чтобы мой модуль видел все жесткие диски, и я не хочу создавать постоянный том для каждого жесткого диска, особенно когда я монтирую новый жесткий диск в /mnt.

Нежелательное решение 2:

Я могу смонтировать локальный постоянный том на /mnt/ с параметром K8s mountPropagation: HostToContainer в файле yaml для моего развертывания. В этом случае мой модуль увидит содержимое жесткого диска, если я перемонтирую жесткий диск. Но это нежелательно, потому что, если модуль перезапустится, мне нужно снова перемонтировать жесткий диск, чтобы модуль увидел его содержимое! (Работает только при перемонтировании жесткого диска при работающем модуле)


person Ali_MM    schedule 18.11.2020    source источник
comment
Всем привет. В Kubernetes наземные стручки считаются крупным рогатым скотом. Мы стараемся спроектировать вещи так, чтобы под можно было произвольно перезапускать, и это не имеет большого значения. Глупый вопрос: рассматривали ли вы возможность игнорировать материал PersistentVolume и просто подключить hostPath к модулю kubernetes .io / документы / концепции / хранилище / тома / # путь к хосту   -  person Justin Tamblyn    schedule 19.11.2020
comment
Не лучше ли смонтировать оба жестких диска прямо в Pod? Локальный объем дает вам такую ​​возможность. Это не похоже на hostpath, где вы можете смонтировать только определенный каталог на хосте. Таким образом вы избегаете дополнительного уровня абстракции. Это довольно интересное открытие, но, к сожалению, я не могу сказать вам, какой механизм предотвращает появление содержимого подкаталогов hdd1 и hdd2 при подключении /mnt к Pod. Но если это сработает, может быть трудно найти удовлетворительное решение. Вы пробовали с hostpath? Такой же эффект?   -  person mario    schedule 19.11.2020
comment
А что касается перемонтирования, не могли бы вы рассказать об этом подробнее?   -  person mario    schedule 19.11.2020
comment
@JustinTamblyn спасибо за ответ. Мне изначально не нравился путь к хосту, потому что в моей текущей конфигурации у меня есть развертывания, а не модули, и, согласно ссылкам на K8s, у меня не может быть пути к хосту в определении развертывания. Я только что проверил и понял, что у меня действительно может быть hostpath в PersistentVolume! Итак, в основном я переименовал local в своем определении PersistentVolume в hostPath, и он работает, и теперь я могу видеть содержимое жестких дисков в модулях! Я также использую nodeSelector, чтобы убедиться, что мой модуль будет работать только на сервере, на котором установлены жесткие диски.   -  person Ali_MM    schedule 19.11.2020
comment
@mario, спасибо и тебе за ответ. Я монтировал каждый жесткий диск отдельно к модулю, пока не нашел решение в предыдущем сообщении. Дело в том, что у меня несколько жестких дисков, и я буду их монтировать и демонтировать все время, так что это не просто два жестких диска, которые нужно монтировать по отдельности. Что касается повторного монтирования, когда я выбрал параметр mountPropagation:HostToContainer, он будет распространять только недавно смонтированные жесткие диски на модуль, а жесткие диски, смонтированные до запуска модуля, выглядели пустыми.   -  person Ali_MM    schedule 20.11.2020
comment
@Ali_MM, не могли бы вы опубликовать решение с hostPath в качестве ответа? Он будет более отчетливо виден другим пользователям, особенно если вы отметите его как принятый, что ясно показывает, что проблема решена. Комментарии могут быть удалены через некоторое время, и всегда труднее заметить, что где-то в них есть реальное решение.   -  person mario    schedule 20.01.2021


Ответы (2)


Я смог разрешить модулю видеть все жесткие диски, смонтированные в каталоге, используя путь к хосту. PersistentVolume можно определить в режиме пути к хосту. Мое окончательное решение было:

  1. Наиболее важная часть решения: Определите PersistentVolume в режиме пути к хосту с помощью nodeAffinity, чтобы гарантировать, что он будет установлен только на узле с жесткими дисками:
apiVersion: v1
kind: PersistentVolume
metadata:
  name: all-harddrives-pv
spec:
  volumeMode: Filesystem
  storageClassName: all-harddrives-storage
  hostPath:
    path: /mnt      # Where all the hard drives are mounted
    type: Directory
  nodeAffinity:     # Use nodeAffinity to ensure it will only be mounted on the node with harddrives.
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - MyNodeName
  1. Определите PersistentVolumeClaim, привязанный к указанному выше PV:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: all-harddrives-pvc
spec:
  storageClassName: all-harddrives-storage
  1. Установите его на развертывание:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-deployment
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: my-deployment
    spec:
      containers:
        - name: mycontainername
          image: myimage
          volumeMounts:
            - mountPath: /mnt
              name: all-harddrives-pvc
      nodeSelector:
        kubernetes.io/hostname: MyNodeName
person Ali_MM    schedule 23.01.2021
comment
Похоже, что вы действительно хотите использовать локальный постоянный том. kubernetes.io/blog/2019/04 / 04 / Имейте в виду, что использовать любую из этих вещей в рабочей среде - плохая идея. Связывая свой модуль с одним узлом, вы в первую очередь теряете многие преимущества работы в Kubernetes. - person wbr; 15.04.2021
comment
Да, но когда у меня есть терабайты данных, которые необходимо выгрузить на несколько жестких дисков, подключенных к одному серверу, лучше всего привязать этот модуль к тому же серверу. - person Ali_MM; 15.04.2021

Этот подход, Local Persistence Volume Static Provisioner, лучше подходит для Способ работы Kubernetes.

Он поддерживает показатели, жизненный цикл хранилища (например, очистку), сродство узла / pv, расширяемый (например, динамическое эфемерное хранилище). Например, с eks-nvme-ssd-provisioner может быть запущенный демон для предоставления быстрого хранилища в качестве локального. Это идеально подходит для рабочих нагрузок, требующих эфемерного локального хранилища для кэша данных, быстрых вычислений, при этом нет необходимости вручную выполнять монтирование на узле ec2 перед запуском модулей.

Примеры использования yaml приведены здесь, sig-storage- local-static-provisioner / examples.

person gohm'c    schedule 23.01.2021