Как смонтировать папку с файлами в kubernetes

Я запускаю образ докера, в котором есть определенные файлы конфигурации. Мне нужно сохранить/смонтировать ту же папку на диск, так как позже будут добавлены новые файлы. Когда я использую стандартное монтирование тома в kubernetes, он монтирует пустой каталог без исходных файлов конфигурации. Как мне убедиться, что мои исходные файлы копируются на том при монтировании?

        - mountPath: /tmp
          name: my-vol
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: my-vol
        persistentVolumeClaim:
          claimName: wso2-disk2```

person Pranav    schedule 20.02.2020    source источник
comment
Похоже, вы ищете ConfigMap. Обычно вы не пытаетесь смонтировать папку, как вы описываете; помимо прочего, сложно обеспечить его существование с одним и тем же содержимым на всех узлах кластера.   -  person David Maze    schedule 20.02.2020
comment
Это вопрос операционной системы/утилиты, а не вопрос программирования. Вопросы о Docker и Kubernetes должны быть связаны с программированием, а не с конфигурацией.   -  person Rob    schedule 20.02.2020
comment
@DavidMaze Будет ли работать карта конфигурации, если в моем каталоге конфигурации есть комбинация файлов разных типов?   -  person Pranav    schedule 12.03.2020


Ответы (3)


Предлагаемый способ предоставления конфигураций вашему модулю — создать configmap для ваших конфигураций и подключить его к вашему модулю с помощью томов. Это руководство ( https://kubernetes.io/docs/concepts/storage/volumes/#configmap) описывает, как это сделать.

Другие способы — создать persistent volume и persistent volume claim в вашем кластере и скопировать файл конфигурации по этому пути. Смонтируйте постоянный том в вашем модуле.

Вы также можете скопировать свою конфигурацию на один из узлов в вашем кластере и смонтировать этот путь с помощью hostPath, но для этого требуется, чтобы ваш модуль также работал на том же узле, поскольку он пытается найти путь в этом узле. (Не рекомендуемый подход)

person anmol agrawal    schedule 20.02.2020

Возможным решением может быть использование хранилища узла, смонтированного на контейнерах (самый простой способ), или использование решения DFS, такого как NFS, GlusterFS и т. д.

Еще один рекомендуемый способ добиться того, что вам нужно, — использовать постоянные тома для совместного использования одних и тех же файлов между вашими контейнерами.

Предполагая, что у вас есть кластер kubernetes с только одним узлом, и вы хотите поделиться путем /mtn/data вашего узла со своими модулями (Источник):

Создайте PersistentVolume:

HostPath PersistentVolume использует файл или каталог на узле для эмуляции сетевого хранилища.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

Создайте PersistentVolumeClaim:

Поды используют PersistentVolumeClaims для запроса физического хранилища.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

Посмотрите на PersistentVolumeClaim:

kubectl get pvc task-pv-claim

Вывод показывает, что PersistentVolumeClaim привязан к вашему PersistentVolume, task-pv-volume.

NAME            STATUS    VOLUME           CAPACITY   ACCESSMODES   STORAGECLASS   AGE
task-pv-claim   Bound     task-pv-volume   10Gi       RWO           manual         30s

Создайте развертывание с двумя репликами, например:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
            claimName: task-pv-claim
      containers:
        - name: task-pv-container
          image: nginx
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/mnt/data"
              name: task-pv-storage

Теперь вы можете проверить внутри обоих контейнеров, что путь /mnt/data имеет одинаковые файлы.

Если у вас есть кластер с более чем 1 узлом, я рекомендую вам подумать о других типах постоянные тома или с помощью DFS.

Ссылки: Настроить постоянный тома постоянные тома Типы томов

person Mark Watney    schedule 20.02.2020
comment
Это не решает мою проблему. Моя проблема в том, что мне нужно смонтировать каталог, в котором уже есть файлы (на изображении). Но вместо этого kubernetes монтирует пустой том. - person Pranav; 12.03.2020

Создайте карту конфигурации папки, которую вы хотите смонтировать. Далее создается карта конфигурации, состоящая из всех файлов в вашей папке:

kubectl create configmap your-config --from-file=your-folder/

Затем смонтируйте это на том, и у вас будут исходные файлы в вашей папке. И обратите внимание, что вам нужно будет смонтировать его в subpath, так как вы не хотите, чтобы он перезаписывал все в каталоге.

person Zstack    schedule 30.09.2020
comment
Можете ли вы смонтировать папку с любыми файлами? Я пробовал, и учитываются только файлы конфигурации, например *.yaml и *.properties. - person felix at housecat; 05.03.2021
comment
Да, вы можете, я бы сделал это, создав папку в контейнере модуля с таким же именем, как и тот, который я хотел бы смонтировать. Затем создайте карту конфигурации всех файлов в папке (точно так же, как я прокомментировал выше) и смонтируйте ее в папку, которую я создал в модуле (используйте подпуть к папке монтирования). На самом деле я обычно так и делаю. - person Zstack; 05.03.2021
comment
Действительно, спасибо @Zstack, я только что запускал kubectl describe configmaps configuration и отображались только файлы yaml, а не другие файлы с расширениями, такими как .zip или .jar, но при подключении тома к подпути отображались все файлы. - person felix at housecat; 07.03.2021