【问题标题】:kubernetes share non-empty volumeKubernetes 共享非空卷
【发布时间】:2020-01-27 16:28:44
【问题描述】:

在我的 docker-compose 应用程序中,我有 2 个容器、1 个 nginx 和 1 个 python 脚本 crontab,它们更新了 nginx/html 文件夹中的一些文件。 当我声明时使用 docker-compose

volumes:
    - shared-volume:/usr/share/nginx/html/assets/xxx:ro

nginx 镜像中的初始文件被复制到共享卷中。

现在我正在尝试将应用程序移动到 k8s,但是当我使用共享卷时,我发现 nginx/html 中的初始文件丢失了。

所以问题是,是否可以将初始文件从我的 nginx 映像复制到共享卷?如何?

____________________________编辑______________________________________

澄清一下,我是 k8s 的新手,我们通常使用 VM 运行更新 nginx 资产文件夹的脚本。使用 docker-compose 我使用这样的东西:

version: '3.7'
services:
  site-web:
    build: .
    image: "site-home:1.0.0"
    ports:
    - "80:80"
    volumes:
    - v_site-home:/usr/share/nginx/html/assets/:ro
  site-cron:
    build: ./cronScript
    image: "site-home-cron:1.0.0"
    volumes:
    - v_site-home:/app/my-assets
volumes:
  v_site-home:
    name: v_site-home

现在我开始编写部署(使用持久卷?因为据我所知,即使有持久卷,在这种情况下,有状态集也没有用)将我的 docker-compose 转换为 k8s。实际上,我们不能将任何公共云用于安全策略(数据必须在我们国家,现在没有大公司有这个选项)。所以想法是在多个裸机服务器上运行 vanilla k8s,并使用像这样的非常简单的应用程序开始迁移。我尝试在一个 pod 中使用 2 个 docker、replica:1 和一个空卷。在这种情况下,我看到最初应用程序的 nginx 文件夹是空的,我需要等待 crontab 更新才能看到我的结果。所以这是第一个问题。

现在我阅读了您的回答,显然我还有其他疑问。拆分吊舱是否更好,所以容器用 1 个吊舱?具有持久卷的部署是这样吗?在这种情况下,我遇到了老问题,如何查看初始 nginx 资产文件?非常感谢您的帮助!

【问题讨论】:

  • 向我们展示真正的 yaml 文件。我猜您使用单独的 pod 进行部署。请注意:您可以将 nginx 和 python 应用程序部署到一个带有两个容器的 pod 中。
  • 看我的回答!谢谢
  • 你不应该回答你自己的问题,而只是为了澄清你自己的问题。您需要直接更新您的原始问题。

标签: nginx kubernetes volume


【解决方案1】:

这通常需要一个运行 cp 的 initContainer。这不是一个很好的解决方案,但它可以完成工作。

【讨论】:

  • 诺诺诺。海报只是没有明确提到如何设置带有多个容器的 pod,这样做会很简单volumeMount。我猜他部署了不同的 pod。
  • 现在在我的示例中,我在 1 个 pod 中有 2 个容器。我应该复制吊舱。这是了解 k8s 的第一种方法(在这种情况下,将复制 nginx 文件夹中的文件)。显然,所有 pod 之间的持久卷似乎是一个更好的解决方案(我只是尝试从 docker compose 转换为一个简单的空卷)。无论如何,我想初始化音量。关于此初始化的建议?是否可以初始化持久卷?
  • 正如我所说,您可以使用一个 initContainer 来执行此操作,该容器还可以安装 PV 并设置您想要的任何内容。
【解决方案2】:

Kubernetes 没有在容器首次启动时将内容复制到卷中的 Docker 功能。

两个直截了当的答案是:

  1. 构建包含静态资产的自定义 Nginx 映像。您可以使用 Dockerfile COPY --from=other/image:tag 构造将它们从您的应用程序容器复制到代理容器中。

  2. 将资产完全存储在容器空间之外的某个地方。如果您将其部署到 AWS,您可以将它们发布到 S3,甚至直接从公共 S3 存储桶提供它们。或者,如果您的集群可以访问诸如 NFS 挂载之类的东西,则让您的整个构建过程将静态资产复制到那里。

Docker 功能有许多经常被忽略的极端情况,最值得注意的是内容仅在容器首次启动时被复制。如果您希望该卷包含连接到您的应用程序的静态资产,并且您更新了应用程序容器,则命名卷将不会更新。因此,无论如何您都需要一些其他解决方案来管理共享内容,我不会依赖 Docker 功能来解决这个问题。

在 Kubernetes 中,您通常需要单独扩展 HTTP 代理和应用程序后端,这意味着将它们放在不同的部署中。拥有应用程序的三个副本后,哪一个提供“静态资产”?您需要使用持久卷之类的东西来共享内容,但大多数易于访问的持久卷类型不支持多个挂载。

【讨论】:

  • 我编辑了我的帖子以澄清。因此,您建议创建一个持久卷并与所有 pod 共享,是否有可能以及在这种情况下如何用数据初始化持久卷?正如我所说的 docker compose 非常简单。
  • 我不建议在上述两个选项中使用持久卷。您必须自己编写代码来填充和更新它(正如@coderanger 建议的那样,通常使用 initContainer 或图像入口点脚本中的逻辑)。
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2019-03-11
  • 2019-10-26
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多