在docker容器中挂载kubernetes卷而不删除容器的数据

时间:2019-10-18 07:20:24

标签: docker jenkins kubernetes mounted-volumes

我正在使用kubernetes plugin在jenkins上建立管道来编译一些代码。

我的目标:
在此管道中,我尝试从docker容器访问一些数据,以将其用作第二个缓存(如下所示)。

apiVersion: v1
kind: Pod
metadata:
  name: cache-test
spec:
  restartPolicy: Never
  volumes:
  - name: shared-data
    emptyDir: {}

  containers:

  - name: cache-container
    image: cache:latest
    volumeMounts:
    - name: shared-data
      mountPath: /cache
    command: 
      - cat


  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: 
      - cat

问题:
我的问题是,当我将shared-folder直接安装在/cache中时,我的所有数据都将被擦除(覆盖)。

周围的工作
一种解决方法是创建一个中间目录,我可以在其中复制数据:

apiVersion: v1
kind: Pod
metadata:
  name: cache-test
spec:
  restartPolicy: Never
  volumes:
  - name: shared-data
    emptyDir: {}

  containers:

  - name: cache-container
    image: cache:latest
    volumeMounts:
    - name: shared-data
      mountPath: /shared-folder
    command: 
      - cat


  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: 
      - cat

然后在我的Jenkins管道中添加此步骤:

          container('cache-container') {
                sh """#!/usr/bin/env bash
                set -exu
                cp -r /cache/* /shared-folder
                """
              } // container

问题:
有办法避免此复制步骤吗?也许kubernetes卷设置不会覆盖容器中的内容吗? 我翻阅了几次文档,却没有发现任何东西。

1 个答案:

答案 0 :(得分:0)

如果不将数据复制到与其他容器共享的卷,就不能将容器用作缓存。但你可能不应该这样做。

您可能希望将缓存移出容器并使其成为 PersistentVolume。 PersistentVolumeClaims 可以声明 PV,然后 pod 可以挂载这些 PVC。

PV 的问题,无论它们是静态的还是动态的 - 当先前锁定的 PVC 被删除时,它们将不会 Available 用于 PVC。它们将停留在 Released 状态。出于某种原因,Kubernetes 不会自动执行此操作 - 工作负载不应访问来自其他工作负载的数据。因为当他们这样做时 - Kubernetes 惯用的方式是 StatefulSets,因此 Kubernetes 保证只有相同工作负载的副本才能声明旧数据。不幸的是,它不适用于构建缓存。

我编写了两个简单的控制器 - 自动 PV 释放器(它会为新的 PVC 再次找到并制作 Released PV Available)和动态 PVC 供应器(专门用于 Jenkins Kubernetes 插件 - 所以你可以定义一个PVC 作为 Pod 上的注释)。在此处查看https://github.com/plumber-cd/kubernetes-dynamic-reclaimable-pvc-controllers。此处有一个完整的 Jenkinsfile 示例 https://github.com/plumber-cd/kubernetes-dynamic-reclaimable-pvc-controllers/tree/main/examples/jenkins-kubernetes-plugin-with-build-cache

相关问题