web-dev-qa-db-ja.com

minikubeを使用したHostPath-Kubernetes

更新:minikubevmに接続し、ホストディレクトリがマウントされているのを確認しましたが、ファイルがありません。また、そこでファイルを作成した場合、ホストマシンにはありません。それらの間にリンクがあります

私は、kubernetesでアプリを開発するためにホストディレクトリをマウントしようとしています。

ドキュメントが推奨するように、私は自分のPCでkubernetesクラスターを実行するためにminikubeを使用しています。目標は、私のアプリを開発するためのdockerとkubernetesを備えた開発環境を作成することです。ローカルディレクトリをマウントして、Dockerがそこからコードアプリを読み取るようにしたいと考えています。しかし、それはうまくいきません。どんな助けでも本当に感謝します。

私のテストアプリ(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);

私のDockerfile:

FROM node:latest
WORKDIR /code
ADD code/ /code
EXPOSE 8080
CMD server.js

私のポッドkubernetes構成:(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ボリュームなしでdockerイメージを実行すると、もちろん機能しますが、問題は、変更するたびに、開発にはあまり強力でないイメージを再作成する必要があることです。そのため、ボリュームhostPathが必要です。

何か案が ?ローカルディレクトリをマウントできないのはなぜですか?

助けてくれてありがとう。

20
Eliel Haouzi

編集:解決策は 特権コンテナー を使用するか、手動でホームフォルダーをマウントしてMiniKube VMがhostPathから読み取ることができるようにすることです-- https://github.com/boot2docker/boot2docker#virtualbox-guest-additions 。(これを理解するにはElielにクレジットしてください)。

HostPathボリュームをminikubeで構成することは完全に可能ですが、多くの癖があり、この特定の問題に対するサポートはあまりよくありません。

DockerfileからADD code/ /codeを削除してみてください。 Dockerの「ADD」命令 は、ホストマシンからコンテナの/codeディレクトリにコードをコピーしています。これが、イメージを再構築するとコードが正常に更新される理由です。

Kubernetesがコンテナの/codeディレクトリをホストパスにマウントしようとすると、このディレクトリには、イメージに焼き付けられたコードがすでにいっぱいであることがわかります。これをビルドステップから外すと、Kubernetesは実行時にホストパスを正常にマウントできるはずです。

また、ホストマシンのcode/ディレクトリの権限を確認してください。

私の他の唯一の考えは、ルートディレクトリへのマウントに関するものです。ルートディレクトリのディレクトリとの間でKubernetes hostPathボリュームをマウントするときに問題が発生しました(これはアクセス許可に関連していると思います)。したがって、/var/www/htmlのようなmountPathを試してみてください。

次に、機能する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
12
springle

彼らは今、minikube mountすべての環境で機能します

https://github.com/kubernetes/minikube/blob/master/docs/Host_folder_mount.md

Macで試した:

$ minikube mount ~/stuff/out:/mnt1/out
Mounting /Users/macuser/stuff/out into /mnt1/out on the minikube VM
This daemon process needs to stay alive for the mount to still be accessible...
ufs starting

そしてポッドで:

apiVersion: v1
kind: Pod
metadata:
  name: myServer
spec:
  containers:
  - name: myServer
    image: myImage
    volumeMounts:
    - mountPath: /mnt1/out
      name: volume
    # Just spin & wait forever
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
  volumes:
  - name: volume
    hostPath:
      path: /mnt1/out
3
enator