HostPath 与 minikube - Kubernetes
HostPath with minikube - Kubernetes
更新:
我连接到 minikubevm,我看到我的主机目录已挂载,但那里没有文件。此外,当我在那里创建文件时,它不会在我的主机中。任何link都在他们之间
我尝试挂载主机目录以使用 kubernetes 开发我的应用程序。
按照文档的建议,我在我的电脑上使用 minikube 运行 我的 kubernetes 集群。目标是使用 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
我的 pod 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
当我 运行 我的 docker 图像没有 hostPath 卷时,它当然可以工作,但问题是在每次更改时我都必须重新创建我的图像,这对于开发来说真的不强大,这就是我需要卷 hostPath 的原因。
有什么想法吗?为什么我没有成功挂载我的本地目录?
感谢您的帮助。
最佳做法是将代码构建到您的图像中,您不应该 运行 带有代码的图像只是来自磁盘。您的 Docker 文件应该更像:
FROM node:latest
COPY /code/server.js /code/server.js
EXPOSE 8080
CMD /code/server.js
然后你 运行 Kubernetes 上的镜像没有任何卷。每次更新代码都需要重新构建镜像和更新pod。
此外,我目前还不知道 minikube 允许在它创建的 VM 和您正在 运行安装它的主机之间进行挂载。
如果您真的想要在容器 运行ning 时更改代码的极快反馈周期,您可以仅使用 Docker 与 -v /path/to/host/code:/code
一起使用,而无需 Kubernetes然后一旦你准备好构建图像并在 minikube 上部署和测试它。但是,如果您要更改节点应用程序的主要 .js 文件,我不确定这是否有效。
编辑:看起来解决方案是使用 privilaged container, or to manually mount your home folder to allow the MiniKube VM to read from your hostPath -- https://github.com/boot2docker/boot2docker#virtualbox-guest-additions。 (感谢 Eliel 解决了这个问题)。
绝对可以使用 minikube 配置 hostPath 卷 - 但是有很多怪癖,并且对这个特定问题没有很好的支持。
尝试从您的 Dockerfile 中删除 ADD code/ /code
。 Docker's "ADD" instruction 正在将代码从主机复制到容器的 /code
目录中。这就是重建映像成功更新您的代码的原因。
当 Kubernetes 尝试将容器的 /code
目录挂载到主机路径时,它发现该目录已经充满了被烘焙到图像中的代码。如果你把它从构建步骤中去掉,Kubernetes 应该能够在运行时成功挂载主机路径。
还要确保检查主机上 code/
目录的权限。
我唯一的其他想法与挂载到根目录有关。我在根目录中挂载 Kubernetes hostPath volumes to/from 目录时遇到问题(我认为这与权限相关)。因此,可以尝试的其他方法是像 /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
他们现在提供了适用于所有环境的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
并且在 pod 中:
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
更新: 我连接到 minikubevm,我看到我的主机目录已挂载,但那里没有文件。此外,当我在那里创建文件时,它不会在我的主机中。任何link都在他们之间
我尝试挂载主机目录以使用 kubernetes 开发我的应用程序。
按照文档的建议,我在我的电脑上使用 minikube 运行 我的 kubernetes 集群。目标是使用 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
我的 pod 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
当我 运行 我的 docker 图像没有 hostPath 卷时,它当然可以工作,但问题是在每次更改时我都必须重新创建我的图像,这对于开发来说真的不强大,这就是我需要卷 hostPath 的原因。
有什么想法吗?为什么我没有成功挂载我的本地目录?
感谢您的帮助。
最佳做法是将代码构建到您的图像中,您不应该 运行 带有代码的图像只是来自磁盘。您的 Docker 文件应该更像:
FROM node:latest
COPY /code/server.js /code/server.js
EXPOSE 8080
CMD /code/server.js
然后你 运行 Kubernetes 上的镜像没有任何卷。每次更新代码都需要重新构建镜像和更新pod。
此外,我目前还不知道 minikube 允许在它创建的 VM 和您正在 运行安装它的主机之间进行挂载。
如果您真的想要在容器 运行ning 时更改代码的极快反馈周期,您可以仅使用 Docker 与 -v /path/to/host/code:/code
一起使用,而无需 Kubernetes然后一旦你准备好构建图像并在 minikube 上部署和测试它。但是,如果您要更改节点应用程序的主要 .js 文件,我不确定这是否有效。
编辑:看起来解决方案是使用 privilaged container, or to manually mount your home folder to allow the MiniKube VM to read from your hostPath -- https://github.com/boot2docker/boot2docker#virtualbox-guest-additions。 (感谢 Eliel 解决了这个问题)。
绝对可以使用 minikube 配置 hostPath 卷 - 但是有很多怪癖,并且对这个特定问题没有很好的支持。
尝试从您的 Dockerfile 中删除 ADD code/ /code
。 Docker's "ADD" instruction 正在将代码从主机复制到容器的 /code
目录中。这就是重建映像成功更新您的代码的原因。
当 Kubernetes 尝试将容器的 /code
目录挂载到主机路径时,它发现该目录已经充满了被烘焙到图像中的代码。如果你把它从构建步骤中去掉,Kubernetes 应该能够在运行时成功挂载主机路径。
还要确保检查主机上 code/
目录的权限。
我唯一的其他想法与挂载到根目录有关。我在根目录中挂载 Kubernetes hostPath volumes to/from 目录时遇到问题(我认为这与权限相关)。因此,可以尝试的其他方法是像 /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
他们现在提供了适用于所有环境的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
并且在 pod 中:
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