#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, и поэтому я мог, наконец, передавать файлы между моим модулем и моей машиной.