0

我正在使用kubernetes 插件在 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 卷设置不会覆盖容器中的内容?我浏览了几次文档,但没有找到任何东西..

4

1 回答 1

0

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

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

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

我写了两个简单的控制器 - 自动 PV 释放器(它将为新的 PVC 再次查找并制作ReleasedPV 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

于 2021-06-21T21:23:00.193 回答