docker - 使用 Kubernetes 和 Docker Desktop for Windows 设置持久卷

标签 docker jenkins kubernetes

我正在尝试为在 Docker Desktop for Windows 中运行的 K8s 设置一个持久卷。最终目标是我想运行 Jenkins,并且在 docker/K8s 宕机时不会丢失任何工作。

我已经尝试了几件事,但我要么误解了这样做的能力,要么我设置错误。目前我有这样的环境设置:

我在 docker 中为 Jenkins 设置了一个卷。我所做的只是创建卷,不确定是否需要在这里进行更多配置。

docker volume inspect jenkins-pv
[
    {
        "CreatedAt": "2020-05-20T16:02:42Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/jenkins-pv/_data",
        "Name": "jenkins-pv",
        "Options": {},
        "Scope": "local"
    }
]

我还在 K8s 中创建了一个持久卷,指向 Docker 卷中的挂载点并部署它。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-pv-volume
  labels:
    type: hostPath
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  hostPath:
    path: "/var/lib/docker/volumes/jenkins-pv/_data"

我还创建了一个光伏声明并进行了部署。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

最后,我为 Jenkins 创建了一个部署。我已经确认它可以工作并且我可以访问该应用程序。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins-app
  template:
    metadata:
      labels:
        app: jenkins-app
    spec:
      containers:
      - name: jenkins-pod
        image: jenkins/jenkins:2.237-alpine
        ports:
        - containerPort: 50000
        - containerPort: 8080
        volumeMounts:
        - name: jenkins-pv-volume
          mountPath: /var/lib/docker/volumes/jenkins-pv/_data
      volumes:
      - name: jenkins-pv-volume
        persistentVolumeClaim:
          claimName: jenkins-pv-claim

但是,退出 Docker 后数据不会持续存在,每次启动时我都必须重新配置 Jenkins。我是否错过了某些事情或我如何/我试图做的事情是不可能的?有没有更好或更简单的方法来做到这一点?

谢谢!

最佳答案

我想出了我的问题,这是两个方面。

  • 我试图从运行 Jenkins 的 pod 中的错误位置保存数据。
  • 我从来没有将数据写回 docker 共享文件夹。

  • 为了让它工作,我在 Docker (C:\DockerShare) 中创建了一个共享文件夹。
    然后我更新了持久卷中的主机路径。
    格式为/host_mnt/path_to_docker_shared_folder_location
    由于我使用 C:\DockerShare 我的路径是:/host_mnt/c/DockerShare
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: jenkins
      labels:
        type: hostPath
    spec:
      storageClassName: manual
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      hostPath:
        path: /host_mnt/c/DockerShare/jenkins
    

    我还必须更新 Jenkins 部署,因为我实际上并没有保存任何配置。
    我应该从/var/jenkins_home 保存数据。

    部署如下所示:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: jenkins
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: jenkins-app
      template:
        metadata:
          labels:
            app: jenkins-app
        spec:
          containers:
          - name: jenkins-pod
            image: jenkins/jenkins:2.237-alpine
            ports:
            - containerPort: 50000
            - containerPort: 8080
            volumeMounts:
            - name: jenkins
              mountPath: /var/jenkins_home
          volumes:
          - name: jenkins
            persistentVolumeClaim:
              claimName: jenkins
    

    无论如何,它现在正在工作,我希望这在设置 PV 时能对其他人有所帮助。

    关于docker - 使用 Kubernetes 和 Docker Desktop for Windows 设置持久卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61918196/

    相关文章:

    c# - .Net Core C# 将方法/类作为子进程执行

    jenkins - 使用 git webhook 无法触发多分支管道 Jenkins 作业

    deployment - 在 Kubernetes 上运行多个应用程序。如何创建结构?

    kubernetes - 如何获取包含从 helm chart 填充的所有值的 list 文件?

    kubernetes - 在kubeflow上找不到GOOGLE_APPLICATION_CREDENTIALS

    docker - 无根 docker 镜像

    docker - Ubuntu docker swarm错误 “docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.”

    jenkins - 如何通过 URL 访问 Jenkins 在 lastSuccessfulBuild 中创建的工件?

    ssh - 在 Jenkins 中使用ssh脚本返回值

    docker - 如何通过docker API正确获取docker镜像的总大小?