【问题标题】:Is there a way to share existing data between containers in a pod?有没有办法在 pod 中的容器之间共享现有数据?
【发布时间】:2019-11-25 10:49:36
【问题描述】:

我在一个 pod 中有 2 个容器。 1.网络应用 2.Nginx 我想与 nginx 容器共享来自 Webapp 容器 /var/www/webapp/ 的数据。 /var/www/html

/var/www/webapp ( folder structure )
│   index.php
│       
│
└───folder1
│   │   service1.php
│   │   
│   └───subfolder1
│       │   app.php
│   
└───folder2
    │   service2.php  

文件夹已正确挂载,但所有文件均丢失。

apiVersion: apps/v1
kind: Deployment
    spec:
      volumes:
      - name: webapp-data
        persistentVolumeClaim:
          claimName: webapp-data
      containers:
      - name: webapp
        image: webapp
        imagePullPolicy: Always 
        volumeMounts:
        - name: webapp-data
          mountPath: /var/www/webapp/
       - name: nginx
        imagePullPolicy: Always
        image: nginx
        volumeMounts:
        - name: webapp-data
          mountPath: /var/www/html/
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: webapp-data
spec:
  storageClassName: local
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

在 docker 下挂载卷时,容器内的所有文件夹和文件都可用,但在 k8s 中不可用。

【问题讨论】:

  • blinger-main 是什么?因为它肯定不是那个 pod 中的卷。
  • 在 pod 上运行的容器可以共享卷和网络,因为它们可以在 localhost 上相互访问。对于您的用例,您需要确保两个容器的 volumeMounts 名称相同才能访问相同的卷。
  • 我的错误,只是在这里提供时输入错​​误。

标签: kubernetes persistent-volumes kubernetes-pvc


【解决方案1】:

Kubernetes 不会自动使用映像中的内容填充空卷。 (这与docker run 不同。)如果共享数据目录为空,您的应用程序需要弄清楚如何设置它本身。

对于标准数据库容器,这并不重要,因为它们通常以某种 initdb 类型调用开始,这将创建所需的文件结构。同样,如果您将持久卷用作缓存或上传空间,也没关系。

对于您所描述的用例,您希望一个容器仅具有来自另一个容器的文件副本,您实际上并不需要持久卷。我会使用可以在两个容器之间共享的emptyDir volume,然后使用init container 将数据复制到卷中。不要在应用程序内容上挂载任何东西。

这大致看起来像(实际上使用部署):

apiVersion: v1
kind: Pod
metadata:
  name: ...
spec:
  volumes:
    - name: webapp-data
      emptyDir: {}
  initContainers:
    - name: populate
      image: webapp
      volumeMounts:
        - name: webapp-data
          mountPath: /data
      command: [cp, -a, /var/www/webapp, /data]
  containers:
    - name: webapp
      image: webapp
      # no volumeMounts; default command
    - name: nginx
      image: nginx
      volumeMounts:
        - name: webapp-data
          mountPath: /var/www/html

通过这种设置,两个容器在同一个 pod 中运行也没有硬性要求;您可以有一个运行后端服务的部署,以及运行 nginx 的第二个部署(通过从后端映像复制数据开始)。

(Kubernetes 文档中Configure Pod Initialization 中的示例非常相似,但从外部站点获取 nginx 内容。)

【讨论】:

  • 这适用于我的用例,我最终分离了容器。
【解决方案2】:

可能只是一个错误,但您指的是其中一个容器中名称为 blinger-main 的卷。使用这个:

apiVersion: apps/v1
kind: Deployment
    spec:
      volumes:
      - name: webapp-data
        persistentVolumeClaim:
          claimName: webapp-data
      containers:
      - name: webapp
        image: webapp
        imagePullPolicy: Always 
        volumeMounts:
        - name: webapp-data
          mountPath: /var/www/webapp/
       - name: nginx
        imagePullPolicy: Always
        image: nginx
        volumeMounts:
        - name: webapp-data
          mountPath: /var/www/html/

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2016-11-03
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多