我正在使用kubernetes插件在jenkins上安装一个管道来编译一些代码。
我的目标:
在这个管道中,我尝试从一个坞容器中访问一些数据,以便在一秒钟内将它用作缓存(如下面所示)。
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问题:
有办法避免这个复制步骤吗?也许库伯内特斯卷设置不覆盖容器中的内容?我翻阅了几遍文件,没有发现任何东西。
发布于 2021-06-21 21:23:00
如果不将数据复制到与其他容器共享的卷中,就不能将容器用作缓存。但无论如何你都不应该。
您可能希望将缓存从容器中移出并使其成为PersistentVolume。PersistentVolumeClaims可以声明 PV,然后pods可以安装这些。
PVs的问题,不管它们是静态的还是动态的--当先前的锁定PVC被删除时,它们不会是Available。他们将被困在Released州。Kubernetes没有自动完成这个任务是有原因的--工作负载不应该访问其他工作负载的数据。因为当他们这样做的时候--古伯奈特的惯用方法是StatefulSets,所以Kubernetes保证只有相同工作负载的副本才能声明旧的数据。不幸的是,它只是不适用于构建缓存。
我编写了两个简单的控制器--自动PV发布器(它将再次为新的PVC找到并使Released PVs Available )和动态PVC提供程序(特别是为Jenkins插件)--这样您就可以将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。
https://stackoverflow.com/questions/58445811
复制相似问题