HostPath с миникубом - Кубернетес
UPDATE:
Я подключился к миникубеву, и я вижу, что мой каталог хоста установлен, но там нет файлов. Также, когда я создаю файл там, он не будет на моем хост-компьютере. Любая ссылка между ними
Я пытаюсь установить каталог хоста для разработки моего приложения с кубернетами.
Как рекомендовал документ, я использую minikube для запуска моего кластера kubernetes на моем компьютере. Целью является создание среды разработки с докеров и кубернетов для разработки моего приложения. Я хочу установить локальный каталог, чтобы мой докер прочитал приложение с кодом. Но это не работа. Любая помощь будет действительно оценена.
мое тестовое приложение (server.js):
var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello World!");
}
var www = http.createServer(handleRequest);
www.listen(8080);
my Dockerfile:
FROM node:latest
WORKDIR /code
ADD code/ /code
EXPOSE 8080
CMD server.js
my pod kubernetes configuration: (pod-configuration.yaml)
apiVersion: v1
kind: Pod
metadata:
name: apiserver
spec:
containers:
- name: node
image: myusername/nodetest:v1
ports:
- containerPort: 8080
volumeMounts:
- name: api-server-code-files
mountPath: /code
volumes:
- name: api-server-code-files
hostPath:
path: /home/<myuser>/Projects/nodetest/api-server/code
моя папка:
/home/<myuser>/Projects/nodetest/
- pod-configuration.yaml
- api-server/
- Dockerfile
- code/
- server.js
Когда я запускаю изображение докеров без хоста hostPath, это, конечно, работает, но проблема в том, что при каждом изменении я должен воссоздать свой образ, который действительно не является мощным для разработки, поэтому мне нужен хост hostPath.
Любая идея? почему я не успеваю монтировать мой локальный каталог?
Спасибо за помощь.
Ответы
Ответ 1
EDIT: Похоже, решение состоит в том, чтобы либо использовать привилегированный контейнер, либо вручную смонтировать домашнюю папку, чтобы позволить MiniKube VM читать от вашего hostPath - https://github.com/boot2docker/boot2docker#virtualbox-guest-additions. (Кредит Элиэлю для выяснения этого).
Абсолютно можно настроить хост-хост с помощью мини-куба, но есть много причуд, и для этой конкретной проблемы не очень хорошая поддержка.
Попробуйте удалить ADD code/ /code
из файла Docker. Инструкция Docker "ADD" копирует код с вашего хост-компьютера в ваш контейнер /code
. Вот почему восстановление изображения успешно обновляет ваш код.
Когда Kubernetes пытается установить контейнер /code
на путь хоста, он обнаруживает, что этот каталог уже заполнен кодом, который был испечен в изображении. Если вы выберете это из этапа сборки, Kubernetes должен иметь возможность успешно смонтировать путь хоста во время выполнения.
Также не забудьте проверить разрешения каталога code/
на хост-машине.
Моя единственная мысль связана с установкой в корневом каталоге. У меня возникли проблемы при монтировании томов хост-куба Kubernetes в/из каталогов в корневом каталоге (я предполагаю, что это были разрешения). Итак, что-то еще, чтобы попробовать, было бы mountPath как /var/www/html
.
Здесь приведен пример функционального хоста HostPath:
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
volumes:
- name: example-volume
hostPath:
path: '/Users/example-user/code'
containers:
- name: example-container
image: example-image
volumeMounts:
- mountPath: '/var/www/html'
name: example-volume
Ответ 2
Лучшей практикой было бы создание кода в вашем изображении, вы не должны запускать образ с кодом, который только что приходит с диска. Ваш Dockerfile должен выглядеть больше:
FROM node:latest
COPY /code/server.js /code/server.js
EXPOSE 8080
CMD /code/server.js
Затем вы запускаете Image on Kubernetes без каких-либо томов. Вам необходимо перестроить изображение и обновить модуль каждый раз, когда вы обновляете код.
Кроме того, я в настоящее время не знаю, что minikube позволяет монтировать между созданной им виртуальной машиной и хостом, на котором вы его запускаете.
Если вам действительно нужен экстремально быстрый цикл обратной связи при смене кода во время работы контейнера, вы можете использовать только Docker самостоятельно с -v /path/to/host/code:/code
без Kubernetes, а затем после того, как вы будете готовы создавать изображение и развертывать и тестировать это на minikube. Однако я не уверен, что это сработает, если вы измените основной .js файл вашего приложения node.