【问题标题】:Kubernetes copy image data to volume mountsKubernetes 将镜像数据复制到卷挂载
【发布时间】:2021-03-11 20:51:07
【问题描述】:

我需要在两个容器之间共享一个目录:myapp 和监控,为此我创建了一个 emptyDir: {},然后在两个容器上创建了 volumeMount。

spec:
      volumes:
        - name:  shared-data
          emptyDir: {}
      containers:
      - name: myapp
        volumeMounts:
          - name:  shared-data
            mountPath:  /etc/myapp/
      - name: monitoring
        volumeMounts:
          - name: shared-data
            mountPath: /var/read 

这很好用,因为我写入共享数据目录的数据在两个容器中都是可见的。但是,在 /etc/myapp/myapp.config 下创建容器时创建的配置文件是隐藏的,因为共享数据卷安装在 /etc/myapp 路径上(重叠)。

如何强制容器首先将卷挂载到 /etc/myapp 路径,然后使 docker 映像将 myapp.config 文件放置在默认路径 /etc/myapp 下,但它是已挂载的卷,因此允许/var/read下的监控容器可以访问的配置文件?

总结:让监控容器读取 myapp 容器上的 /etc/myapp/myapp.config 文件。

谁能给点建议?

【问题讨论】:

  • 容器必须以某种形式运行cp,无论是在它自己的入口点还是在初始化容器中。 Kubernetes 从不自行将文件复制到卷中(这与 Docker 的行为不同)。
  • 我不喜欢使用卷 - 我想要的只是... /etc/myapp 下的数据,它具有默认配置文件(由图像写入)和新配置文件(作为 myapp容器正在运行)应该可供监控容器拾取。
  • @BuggyB 你成功了吗?
  • 不,我现在放弃了上述内容。我没有使用需要上述功能的 sidecar,而是将二进制文件(用于度量报废)直接嵌入到主 myapp 容器中,该容器可以直接从 /etc/myapp/* 中读取。这不是一个好的解决方案,因为当我扩展 myapp 时,监控也会扩展,但对于我的场景,我不会扩展 - 单个容器 myapp。

标签: kubernetes


【解决方案1】:

您能否将共享数据挂载到初始化容器中的 /var/read 并将配置文件从 /etc/myapp/myapp.config 复制到 /var/read?

【讨论】:

  • 1.将共享数据卷挂载到 /var/read - 是 2. 但是如何将 MyApp 容器上的 /etc/myapp/myapp.config 复制到 Monitoring 容器上的 /var/read?
【解决方案2】:

考虑将ConfigMapsSubPaths 结合使用。

ConfigMap 是一个 API 对象,用于将非机密数据存储在 键值对。 Pod 可以使用 ConfigMaps 作为环境变量, 命令行参数,或作为卷中的配置文件。

有时,共享一卷以供多次使用是很有用的 单荚。 volumeMounts.subPath 属性指定子路径 在引用的卷中而不是在其根中。

ConfigMap 可以用作卷。 template.spec 中的 volumeMounts 与任何其他卷相同。但是,卷部分是不同的。您可以按名称引用 configMap,而不是指定 persistentVolumeClaim 或其他卷类型。比你可以添加看起来像这样的subPath 属性:

volumeMounts:
  - name:  shared-data
    mountPath:  /etc/myapp/
    subPath: myapp.config

以下资源将向您展示如何设置它:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2020-08-07
    • 2016-06-08
    • 2021-10-30
    • 1970-01-01
    • 2019-08-24
    • 2019-10-09
    相关资源
    最近更新 更多