kubernetes共享非空卷

问题描述 投票:0回答:3

在具有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映像复制到共享卷?怎么样?

nginx kubernetes volume
3个回答
0
投票

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


0
投票

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

对此的两个简单答案是:

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

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

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

在Kubernetes中,您还有一个额外的问题,您通常希望分别缩放HTTP代理和应用程序后端,这意味着将它们放在不同的部署中。一旦有了应用程序的三份副本,哪个副本可以提供“静态”资产?您需要使用诸如持久性卷之类的东西来共享内容,但是大多数易于访问的持久性卷类型不支持多个装载。


0
投票

为了澄清,我是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。实际上,我们不能将任何公共云用于安全策略(数据必须在我们的国家/地区,并且现在没有大公司可以使用此选项)。因此,我们的想法是在多个裸机服务器中运行普通k8,并使用此类非常简单的应用程序开始迁移。我尝试使用2个docker,replica:1和单个容器中的一个空卷。在这种情况下,我看到应用程序最初的nginx文件夹为空,我需要等待crontab更新才能查看结果。因此,这是第一个问题。现在,我阅读了您的答案,显然我还有其他疑问。拆分吊舱是否更好,所以将1个吊舱用于容器?具有持久卷的部署是这样吗?在这种情况下,我遇到了老问题,如何查看初始的nginx资产文件?非常感谢您的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.