我正在使用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卷设置不会覆盖容器中的内容吗?
我翻阅了几次文档,却没有发现任何东西。
答案 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。