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.