【问题标题】:The mountPath should be absolute in Kubernetes, is it?mountPath 在 Kubernetes 中应该是绝对的,是吗?
【发布时间】:2020-05-19 00:36:52
【问题描述】:

花了几个小时后,我发现 Kubernetes 不支持将相对路径作为挂载路径。我在这里找到了参考mountpath should be absolute,如果是,那么为什么它没有相对路径的能力,有人可以解释一下吗?

    Example code:
    apiVersion: v1
    kind: Pod
    metadata:
      name: task-pv-pod
    spec:
      volumes:
        - name: task-pv-storage
          hostPath:
            # directory location on host
            # path: "./code" # this is not supporting
            path: "/var/www/html/kubernetes/code"  # this is supporting
            # this field is optional
            type: DirectoryOrCreate
      containers:
        - name: task-pv-container
          image: nginx
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/usr/share/nginx/html"
              name: task-pv-storage

上面代码示例中code目录下,我只有一个index.html页面

项目结构截图:

如果我使用path: "./code",则错误显示如下:

Error response from daemon: create ./code: "./code" includes invalid
characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.
If you intended to pass a host directory, use absolute path.

提前致谢!!

【问题讨论】:

  • 相对的意思是从事物的角度来看是相对的。例如,您所在地区的亲戚。当你指定一个路径时,相对地做它是没有意义的,因为你没有任何参考。
  • @suren 这里是一个问题链接,更好的例子github.com/kubernetes/kubernetes/issues/48749
  • @suren 我也更新了我的问题,你能看看吗?
  • 您有时会在基于 Docker 的设置中看到从 Docker 外部绑定挂载代码到容器中的设置实际上在 Kubernetes 中无法正常工作。我建议构建一个包含您的代码的映像,然后将其推送到某种注册表(Docker Hub、AWS ECR、Google GCR...)。
  • @DavidMaze 你能给我一个示例指南吗?

标签: kubernetes path


【解决方案1】:

我相信您的困惑源于您正在运行一个单节点集群,例如 Minikube。

  • 流程链(粗略总结)是:

Kubectl > Kube-API(master) > Kubelet agent (node) > Pod 创建(在 yaml 清单中指定)。

在单节点集群中,所有这些代理都在同一台计算机上,这就是 /var/www/html/kubernetes/code 中的文件被挂载到 pod 的原因。

  • 我会用这个例子来澄清它:
    • 您有一个包含 3 个节点的集群。
    • 您可以使用笔记本中的 kubectl 远程管理节点。

当您使用hostPath 时,文件必须存在于node 上,而不是您的笔记本上,因为不是您计算机上的kubectl 会触发创建 pod 并挂载文件/目录。

这是节点的 kubelet 代理的工作,它将创建 pod 并应用它的清单。这就是为什么您需要指定要挂载的文件/目录的完整路径。


根据PersistentVolumes文档:

Kubernetes 支持hostPath在单节点集群上进行开发和测试。 hostPath PersistentVolume 使用节点上的文件或目录来模拟网络附加存储。

在生产集群中,您不会使用 hostPath。相反,集群管理员会预置网络资源,例如 Google Compute Engine 永久磁盘、NFS 共享或 Amazon Elastic Block Store 卷。集群管理员也可以使用StorageClasses设置dynamic provisioning

使用hostPath类型时要小心,因为:

  • 由于节点上的文件不同,具有相同配置(例如从 podTemplate 创建)的 Pod 在不同节点上的行为可能不同。
  • 当 Kubernetes 按计划添加资源感知调度时,它将无法考虑 hostPath 使用的资源。
  • 在底层主机上创建的文件或目录只能由 root 写入。您要么需要在 privileged Container 中以 root 身份运行您的进程,要么修改主机上的文件权限以便能够写入 hostPath

如果您有任何问题,请在 cmets 中告诉我。

【讨论】:

  • 这是一个很好的解释,真的很感激我有另一个要求你能解释一下 initContainers 和容器之间的区别stackoverflow.com/questions/61858409/…@willrof
  • "在底层主机上创建的文件或目录只能由root写入。您需要在特权容器中以root身份运行您的进程或修改主机上的文件权限才能写入到 hostPath 卷” - 在 Kubernetes 中使用 docker、cri-o 或 containerd,默认情况下,容器以 root 身份运行,带有 CAP_DAC_OVERRIDE。您不需要特权容器来访问 hostPath 挂载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2015-07-02
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2012-02-26
相关资源
最近更新 更多