如何在 Kubernetes 中模仿“--volumes-from”

2024-04-05

我正在寻找一种模式,允许在 Kubernetes 中同一 Pod 上运行的两个容器之间共享卷。

我的用例是: 我有一个 Ruby on Rails 应用程序在 Docker 容器内运行。 docker 镜像包含静态资源/app/<app-name>/public目录,我需要从在同一 Pod 中运行的 nginx 容器访问这些资产。

在“香草”码头我会使用--volumes-from标记共享此目录:

docker run --name app -v /app/<app-dir>/public <app-image>
docker run --volumes-from app nginx

阅读本文档后:https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/volumes.md https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/volumes.md我尝试了这个(仅提供相关条目):

spec:
  containers:
    - image: <app-image>
      name: <app-name>
      volumeMounts:
        - mountPath: /app/<app-name>/public
          name: assets
    - image: nginx
      name: nginx
      volumeMounts:
        - mountPath: /var/www/html
          name: assets
          readOnly: true
    volumes:
      - name: assets
        hostPath:
          path: /tmp/assets

But:

  • 虽然/tmp/assets节点上存在,它是空的
  • /app/<app-name>/public应用程序容器内也是空的

作为解决方法,我将尝试在应用程序容器启动时填充共享目录(简单地cp /app/<app-name>/public/*到共享目录),但我真的不喜欢这个想法。

问题:如何模仿--volumes-from在 Kubernetes 中,或者如果没有直接对应的容器,我如何将文件从一个容器共享到同一 pod 中运行的其他容器?

apiVersion: v1beta3

Client Version: version.Info{Major:"0", Minor:"17", GitVersion:"v0.17.0", GitCommit:"82f8bdac06ddfacf493a9ed0fedc85f5ea62ebd5", GitTreeState:"clean"}
Server Version: version.Info{Major:"0", Minor:"17", GitVersion:"v0.17.0", GitCommit:"82f8bdac06ddfacf493a9ed0fedc85f5ea62ebd5", GitTreeState:"clean"}

[更新-2016-8]在最新的 Kubernetes 版本中,您可以使用一个非常好的功能,名为init-container来替换postStart下面是我的回答的一部分,这将确保容器的顺序。

apiVersion: v1
kind: Pod
metadata:
  name: javaweb-2
spec:
  initContainers:
  - name: war
    image: resouer/sample:v2
    command: ["cp", "/sample.war", "/app"]
    volumeMounts:
    - mountPath: /app
      name: app-volume
  containers:
  - name: tomcat
    image: resouer/mytomcat:7.0
    command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"]
    volumeMounts:
    - mountPath: /root/apache-tomcat-7.0.42-v2/webapps
      name: app-volume
    ports:
    - containerPort: 8080
      hostPort: 8001
  volumes:
  - name: app-volume
    emptyDir: {}

NOTE: initContainer 仍然是一个测试版功能所以这个 yaml 的工作版本实际上是这样的:http://kubernetes.io/docs/user-guide/product-pods/#handling-initialization http://kubernetes.io/docs/user-guide/production-pods/#handling-initialization,请注意pod.beta.kubernetes.io/init-containers part.

---原答案开始---

事实上,你可以。您需要使用容器生命周期处理程序来控制要与其他容器共享的文件/目录。喜欢:

---
apiVersion: v1
kind: Pod
metadata:
    name: server
spec:
    restartPolicy: OnFailure
    containers:
    - image: resouer/sample:v2
      name: war
      lifecycle:
        postStart:
          exec:
            command:
              - "cp"
              - "/sample.war"
              - "/app"
      volumeMounts:
      - mountPath: /app
        name: hostv1 
    - name: peer
      image: busybox
      command: ["tail", "-f", "/dev/null"]
      volumeMounts:
      - name: hostv2
        mountPath: /app/sample.war
    volumes:
    - name: hostv1
      hostPath:
          path: /tmp
    - name: hostv2
      hostPath:
          path: /tmp/sample.war

请检查我的要点以了解更多详细信息:

https://gist.github.com/resouer/378bcdaef1d9601ed6aa https://gist.github.com/resouer/378bcdaef1d9601ed6aa

当然你也可以使用emptyDir。因此,war 容器可以将其 /sample.war 共享给对等容器,而不会弄乱对等容器的 /app 目录。

如果我们可以容忍 /app 被覆盖,事情就会简单得多:

---
apiVersion: v1
kind: Pod
metadata:
  name: javaweb-2
spec:
  restartPolicy: OnFailure
  containers:
  - image: resouer/sample:v2
    name: war
    lifecycle:
      postStart:
        exec:
          command:
            - "cp"
            - "/sample.war"
            - "/app"
    volumeMounts:
    - mountPath: /app
      name: app-volume
  - image: resouer/mytomcat:7.0
    name: tomcat
    command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"]
    volumeMounts:
    - mountPath: /root/apache-tomcat-7.0.42-v2/webapps
      name: app-volume
    ports:
    - containerPort: 8080
      hostPort: 8001 
  volumes:
  - name: app-volume
    emptyDir: {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Kubernetes 中模仿“--volumes-from” 的相关文章

随机推荐

  • 将行恢复为默认列值 mysql

    我正在使用 MySQL 社区服务器 5 1 有没有一种方法可以通过一个查询将所有行设置回默认列值 我刚刚添加了很多行 我为大多数指定的列设置了默认值 但由于某种原因 所有列值都设置为 0 我想知道是否有一个查询将所有列值设置为其默认值 并且
  • java.lang.IllegalStateException:找不到工厂javax.faces.application.ApplicationFactory的备份[重复]

    这个问题在这里已经有答案了 我想从 jsf 2 1 迁移到 2 2 但无法运行我的服务器 Tomcat 导致出现以下错误 我谨通知您 我在项目 Maven 中使用了 Hibernate Spring JSF Root WebApplicat
  • Windows 7 中 NASM 程序中的 I/O

    我想用 NASM 汇编语言进行编程 我有 NASM 2 07 和 Borland C 编译器 5 0 bcc32 我的操作系统是Windows 7 我不知道如何在Windows平台上使用NASM进行输入和输出 请问你能帮我吗 最简单的方法是
  • 调试 javascript 有哪些好的技巧? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 所以我相当经常地使用 JavaScr
  • 关于C++类中typedef函数的疑问

    我需要定义一个返回类对象的函数 假设我有一个名为狗的类 h 中的类声明和 cpp 中的实现 当狗死时 我想调用一个函数让狗管理器知道这一点 在dog的SetFunc中我将收到要调用的函数 Dog h class Dog public typ
  • 从插件 (.so) 加载 Qt UI(带图像)时遇到问题

    我有一个插件 可以加载并显示一个自定义小部件 该小部件显示从资源文件 resources qrc 加载的图像 作为 QLabel 的背景 我面临的问题是 加载插件后 它会正确显示小部件 但不显示图像 我尝试将 Q INIT RESOURCE
  • Safari 上的 Flex-wrap 问题

    我试图让两个元素填充其容器并在达到某个最小尺寸时进行包装 我的代码在除 safari 之外的所有浏览器上都能完美运行 而且我无法找到替代方案 这似乎是 flex basis 0 的问题 问题是这样的 http www cssdesk com
  • 错误:“grep:参数列表太长”[重复]

    这个问题在这里已经有答案了 我正在尝试运行以下命令 但出现参数太长错误 你能帮我吗 HOST grep rl pattern home public html bash bin grep Argument list too long 有没有
  • Hadoop - 如何收集没有值的文本输出

    我正在从事地图缩减工作 我想知道是否可以向我的输出文件发出自定义字符串 没有计数 没有其他数量 只有一团文本 这是我正在思考的基本想法 public static class Map extends MapReduceBase implem
  • VueJS 和 Laravel 的 Textarea v-model 初始值

    我想使用刀片语法将用户名显示为 Markdown 编辑器的默认文本区域值
  • 自动滚动 JavaFX TextFlow

    我有一个 JavaFXTextFlow包裹在一个ScrollPane 我试图让它在有新内容时自动滚动到底部Text被添加到TextFlow 我尝试过附加监听器以最大化ScrollPane s vvalue to The ScrollPane
  • Rails 包含查询,其条件不返回左表中的所有结果

    我有两个表格 帖子和图像 以下是 schema rb 中的相关部分 create table posts force true do t t string name t string body t datetime created at t
  • 更新张量流中的张量切片

    我想更新 3 维张量的切片 下列的如何在 Tensorflow 中进行切片分配 https stackoverflow com questions 39157723 how to do slice assignment in tensorf
  • 我可以使用QTimer来实现多线程算法吗?

    目前我需要实现一个基于Qt的多线程算法 也许我应该尝试延长QThread 但在此之前 我想问一下 我是否可以只使用两个QTimers timer1 timer2 并将它们的超时信号分别连接到线程上 来实现一个 假 的多线程程序 您可以连接
  • WCF 中的两个接口和一个具体类

    请检查下面的示例 namespace GServices ServiceKnownType typeof SearchType ServiceContract SessionMode SessionMode Allowed public i
  • 组合两张地图

    Scala 中是否有一个函数可以组合两个映射 或者 flatMap 是一个明智的方法吗 scala gt val caps Map String Int Map A 1 B 2 caps Map String Int Map A gt 1
  • tinypng.org 如何压缩 PNG 文件? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 http tinypng org http tinypng org 是一项很棒的服务 他们将我的 png 图像优化了约 67 他们的服务如何运作 他们
  • React.js使用axios将数据发布到php,但php echo为空

    我正在使用react js axios和PHP将数据发布到MySQL数据库 这是我的react js代码 sendData var data new FormData data append name jessie data append
  • 如何开发依赖的 Composer 包而不需要提交或发布更改?

    我有一个应用程序 A 它有一个composer json 文件 定义了对包 P 的依赖关系 这是我自己的新闪亮包 我的包 P 有一个composer json 文件 它定义了对库 L 和框架 F 的依赖关系 我的包 P 还没有远程存储库 并
  • 如何在 Kubernetes 中模仿“--volumes-from”

    我正在寻找一种模式 允许在 Kubernetes 中同一 Pod 上运行的两个容器之间共享卷 我的用例是 我有一个 Ruby on Rails 应用程序在 Docker 容器内运行 docker 镜像包含静态资源 app