Постоянный объем Kubernetes на локальной машине, общий доступ к данным

#kubernetes

Вопрос:

Я хотел бы запустить модуль на своем локальном компьютере. Внутри капсулы находится один контейнер с a .в нем файл jar. Этот файл jar может принимать файлы, затем обрабатывать их, а затем выводить. Я хотел бы создать постоянный объем и прикрепить его к модулю, чтобы контейнер мог получить доступ к файлам.

Мой Док-файл:

  FROM openjdk:11

 WORKDIR /usr/local/dat

 COPY . .

 ENTRYPOINT ["java", "-jar", "./tool/DAT.jar"]
 

(Пожалуйста, обратите внимание, что внутри контейнера используется папка /usr/local/dat)

Мой настойчивый объем.файл yml:

 apiVersion: v1
kind: PersistentVolume
metadata:
  name: dat-volume
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 150Mi
  storageClassName: hostpath
  hostPath:
    path: /home/zoltanvilaghy/WORK/ctp/shared
 

Мой файл PersistentVolumeClaim.yml:

 apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dat-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
  storageClassName: hostpath
  volumeName: dat-volume
 

Мой файл Pod.yml:

 apiVersion: v1
kind: Pod
metadata:
  name: dat-tool-pod
  labels:
    name: dat-tool-pod
spec:
  containers:
  - name: dat-tool
    image: dat_docker
    imagePullPolicy: Never
    args: ["-in", "/usr/local/dat/shared/input/Archive", "-out", "/usr/local/dat/shared/output/Archive2", "-da"]
    volumeMounts:
      - mountPath: /usr/local/dat/shared
        name: dat-volume
  restartPolicy: Never
  volumes:
    - name: dat-volume
      persistentVolumeClaim:
        claimName: dat-pvc
  
 

Если бы все работало хорошо, после присоединения PersistentVolume (и помещения папки архива в общую/входную папку), предоставив аргументы файлу jar, он смог бы обработать файлы и вывести их в общую/выходную папку.

Вместо этого я получаю сообщение об ошибке, в котором говорится, что папка не может быть найдена. К сожалению, после ошибки контейнер существует, поэтому я не могу заглянуть внутрь контейнера, чтобы проверить структуру файла. Кто-нибудь может помочь мне определить проблему?

Изменить: Вывод kubectl get sc, pvc, pv :

 NAME                                             PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE



                                                                                                    

storageclass.storage.k8s.io/hostpath (default)   docker.io/hostpath   Delete          Immediate           false                  20d

                                                                                                                                                                                                                                                                                                                                              

NAME                            STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE

                                                                                                                                   

persistentvolumeclaim/dat-pvc   Bound    dat-volume   150Mi      RWO            hostpath       4m52s

                                                                                                                                                                                                                                                                                                                                                                              

NAME                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE

                                                                                                      

persistentvolume/dat-volume   150Mi      RWO            Retain           Bound    default/dat-pvc   hostpath                4m55s
 

Комментарии:

1. Если целью процесса является чтение и запись локальных файлов, можете ли вы просто запустить процесс напрямую, используя локальную JVM? Как кластерная контейнерная система с несколькими хостами, Kubernetes, похоже, не очень подходит для этого.

2. Идея состояла бы в том, чтобы поместить это изображение docker в облако, и когда необходимая папка будет загружена, автоматически разверните контейнер, чтобы начать процесс. Для этого кубернетес кажется правильным выбором. И чтобы предоставить доступ к папке для контейнера, по-видимому, необходимы тома.

3. Как файлы «попадают в облако»? Типичным подходом здесь было бы, чтобы ваше приложение обрабатывало HTTP-запросы, а не пыталось действовать с локальными файлами.

4. Я буду писать метод контроллера, который берет папку .zip, извлекает папку внутри и сохраняет ее в PersistentVolume. Затем я бы использовал kubernetes для создания модуля с постоянным разрешением, который прикрепляется к тому, куда я поместил папку, обрабатывает файлы внутри и выводит результаты на том.

Ответ №1:

Предположим, что все ваши sc/pvc/pv верны, вот как вы можете проверить:

 apiVersion: v1
kind: Pod
metadata:
  name: dat-tool-pod
  labels:
    name: dat-tool-pod
spec:
  containers:
  - name: dat-tool
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["ash","-c","sleep 7200"]
    volumeMounts:
    - mountPath: /usr/local/dat/shared
      name: dat-volume
  restartPolicy: Never
  volumes:
  - name: dat-volume
    persistentVolumeClaim:
      claimName: dat-pvc
 

После того, как модуль будет создан, вы можете kubectl exec -it dat-tool-pod -- ash и cd /usr/local/dat/shared . Здесь вы можете проверить каталог/файлы (вкл. разрешение) , чтобы понять, почему ваша программа жалуется на отсутствие каталога/файлов.

Комментарии:

1. Я попытался установить громкость непосредственно в определении модуля, но это тоже не сработало. После этого я попробовал использовать PersistentVolumes и PersistentVolumeClaims, потому что позже я буду работать в облаке, и afaik это более практично. Я попробовал ссылку, которую вы отправили, но, похоже, она мне не помогает. Можете ли вы сказать мне, почему код, который я связал в своем вопросе, неверен?

2. Ответ, предполагаемый при попытке подключения к пути хоста, не удался. error saying that the folder cannot be found — какая папка, если быть точным? Также можете ли вы обновить свой вопрос с выводом kubectl get sc,pvc,pv -n <namespace if not default>

3. На моем компьютере в /home/zoltanvilaghy/РАБОЧЕМ/ctp у меня есть /общая папка. Внутри этой папки у меня есть папка /input, и внутри нее я помещаю папку с именем Архив. Внутри этой папки /Архив у меня есть файлы, которые DAT.jar сможет обрабатывать и выводить данные в папку /общий доступ/вывод. Я вручную добавил папку входного архива на свой компьютер, и после установки я ожидал, что папка появится внутри контейнера. Ошибка возникает из-за DAT.jar файл, я могу увидеть его после проверки журналов контейнера: Input path (/usr/local/dat/shared/input/Archive) does not exist.

4. Очевидно, что это система с одним узлом (мини-куб?). Обновлен ответ на ваш комментарий.

5. В настоящее время это система с одним узлом, использующая рабочий стол Docker и расширение Kubernetes этой программы. Используя . файл yml, который вы указали выше, мне удалось по ssh войти в контейнер, и, хотя папка существует, папки, которые я поместил в том на моей хост-машине, не появились. Создание файла внутри контейнера также не появилось на моей хост-машине.

Ответ №2:

Для тех, кто еще испытывает эту проблему, вот что помогло мне найти решение:

https://github.com/docker/for-win/issues/7023

(И на самом деле ссылка внутри первого комментария в этом выпуске.)

Таким образом, моя установка была машиной с Windows 10, использующей WSL2 для запуска контейнеров docker и кластера kubernetes на моей машине. Независимо от того, куда я поместил папку, которой хотел поделиться со своим модулем, она не появилась внутри модуля. Поэтому, основываясь на приведенной выше ссылке, я создал свою папку в /mnt/wsl под названием /mnt/wsl/shared.

Потому что предположительно в этой папке /mnt/wsl DockerDesktop начнет искать папку, которой вы хотите поделиться. Я изменил свой постоянный объем.yml к следующему:

 apiVersion: v1
kind: PersistentVolume
metadata:
  name: dat-volume
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 150Mi
  storageClassName: hostpath
  hostPath:
    path: /run/desktop/mnt/host/wsl/shared
 

Я понимаю, что /run/desktop/mnt/host/wsl-это то же самое, что /mnt/wsl, и поэтому я мог, наконец, передавать файлы между моим модулем и моей машиной.