【问题标题】:minikube + nginx + volumeMount not workingminikube + nginx + volumeMount 不工作
【发布时间】:2017-12-20 06:14:09
【问题描述】:

我正在关注here的示例。

我只是想了解卷如何与 Kubernetes 一起工作。我正在本地测试,所以我需要与 minikube 抗衡。我试图让这个尽可能简单。我正在使用 nginx,并希望它显示从我的本地主机上的文件夹安装的内容。

环境: macOS 10.12.5 minikube 0.20.0 + xhvve 虚拟机

我使用的是最新的ngninx image from GitHub,没有做任何修改。

当我在 minikube 之外运行 docker 映像时,这非常有效。

docker run --name flow-4 \
 -v $(pwd)/website:/usr/share/nginx/html:ro \
 -P -d nginx

但是当我尝试在 minikube 中运行它时,我总是在访问托管页面时收到 404 响应。为什么?

这是我的 kubernetes 配置文件...
kubernets/deploy/deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: flow-4
  name: flow-4
spec:
  replicas: 1
  selector:
    matchLabels:
      run: flow-4
  template:
    metadata:
      labels:
        run: flow-4
    spec:
      containers:
      - image: nginx
        name: flow-4
        ports:
        - containerPort: 80

        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: flow-4-volume
      volumes:
      - name: flow-4-volume
        hostPath:
          path: /Users/myuser/website

kubernets/deploy/svc.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    run: flow-4
  name: flow-4
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: flow-4
  type: NodePort

最后,我是这样运行的:

kubectl create -f kubernetes/deploy/
minikube service flow-4

当它在我的浏览器中打开时,我没有在网站文件夹中看到我的 index.html 页面,而是收到一条“404 Not Found”消息(在 nginx/1.13.3 页脚上方)

为什么我会收到 404? nginx 看不到我挂载的文件夹的内容吗? 托管 kubernetes 的 VM 是否无法访问我的“网站”文件夹?

我怀疑这是问题所在。我通过 ssh 进入 kubernetes pod

kubectl exec -it flow-4-1856897391-m0jh1 /bin/bash

当我查看 /usr/share/nginx/html 文件夹时,它是空的。如果我手动添加一个 index.html 文件,那么我可以在浏览器中看到它。但是为什么 Kubernetes 不会将我的本地驱动器挂载到这个文件夹呢?

更新

从我的 /Users/** 文件夹安装完整路径似乎有问题。相反,我使用“minikube mount”命令将本地文件夹容器 index.html 挂载到 minikube VM 中。然后在一个单独的终端中,我开始了我的部署,它可以很好地看到 index.html 文件。

这是我更新后的 deployment.yaml 文件,文件名更清晰,可以更好地解释不同的文件夹以及它们的挂载位置...

这是我的 kubernetes 配置文件...
kubernets/deploy/deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: flow-4
  name: flow-4
spec:
  replicas: 1
  selector:
    matchLabels:
      run: flow-4
  template:
    metadata:
      labels:
        run: flow-4
    spec:
      containers:
      - image: nginx
        name: flow-4
        ports:
        - containerPort: 80

        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: flow-4-volume
      volumes:
      - name: flow-4-volume
        hostPath:
          path: /kube-website

它使用与文章前面相同的 svc.yaml 文件。

然后我从当前目录中运行整个这样的东西。
1.mkdir local-website
2.echo 'Hello from local storage' > local-website/index.html
3.minikube mount local-website:/kube-website
让它运行....

在新的终端中,相同的文件夹...
4.kubectl create -f kubernetes/deploy/

一旦所有 pod 都在运行...
5.minikube service flow-4

您应该会在浏览器中看到“来自本地存储的您好”消息。您可以编辑本地 index.html 文件,然后刷新浏览器以查看内容更改。

你可以用这个把它全部拆掉...... kubectl delete deployments,services flow-4

【问题讨论】:

    标签: nginx docker kubernetes minikube


    【解决方案1】:

    可能你创建的文件夹不在 kubernetes 节点中(它是 minikube vm)。

    尝试在 vm 中创建文件夹,然后重试

    ssh -i ~/.minikube/machines/minikube/id_rsa docker@$(minikube ip)
    mkdir /Users/myuser/website
    

    还可以看看minikube host mount folder 功能

    【讨论】:

    • 我相信 /Users 下的所有内容都会自动挂载到 minikube VM 中。为了测试,我按照你的建议进入了它。进入 minikube VM 后,我可以将目录更改为 /Users/myuser/website。我可以看到 index.html 文件。使用“minikube mount”不会改变任何东西。它在 minikube VM 中仍然可见,但在我的 pod 中不可见。还有其他想法吗?
    • 在深入挖掘之后,从 /Users///local-website 安装一条长路径似乎有些奇怪。我进一步简化了一些事情,只使用了'minikube mount local-website:/kub-website,其中'local-website'在我的当前目录中。然后我更新了 kubernetes 使用的部署描述符,以简单地挂载 /kub-website 文件夹。工作得很好。我会更新我的答案以反映它。感谢您为我指出“minikube mount”的方向。
    猜你喜欢
    • 2021-01-16
    • 2022-07-15
    • 1970-01-01
    • 2018-04-04
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多