【问题标题】:Mount kubernetes volume in docker container without erasing the container's data在 docker 容器中挂载 kubernetes 卷而不擦除容器的数据
【发布时间】:2019-10-18 07:20:24
【问题描述】:

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

【问题讨论】:

  • 你已经阅读了 K8s 关于持久存储的文档? kubernetes.io/docs/concepts/storage/persistent-volumes
  • 此行为与普通 Linux **mount**(8) 相同。如果您启动三个不同的 pod,它们都安装了相同的共享卷,但它们的初始内容都不同,您期望什么行为?

标签: docker jenkins kubernetes mounted-volumes


【解决方案1】:

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

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

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

我写了两个简单的控制器 - 自动 PV 释放器(它将找到并再次为新 PVC 生成 Released PVs Available)和动态 PVC 供应器(专门用于 Jenkins Kubernetes 插件 - 因此您可以将 PVC 定义为一个吊舱)。在这里查看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

【讨论】:

    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2021-09-17
    • 2018-11-17
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多