【问题标题】:Volume mounting in Jenkins on KubernetesKubernetes 上 Jenkins 中的卷挂载
【发布时间】:2019-02-11 21:34:51
【问题描述】:

我正在尝试将 Jenkins 设置为在 Kubernetes 上的容器中运行,但我无法为 Jenkins 主目录持久保存卷。

这是我的 deployment.yml 文件。图片来自jenkins/jenkins

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins-deployment
  labels:
    app: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      containers:
      - name: jenkins
        image: 1234567.dkr.ecr.us-east-1.amazonaws.com/mycompany/jenkins
        imagePullPolicy: "Always"
        ports:
        - containerPort: 8080
        volumeMounts:
          - name: jenkins-home
            mountPath: /var/jenkins_home
      volumes:
        - name: jenkins-home
          emptyDir: {}

但是,如果我随后将一个新容器推送到我的映像存储库并使用以下命令更新 pod,Jenkins 会重新联机但要求我从头开始(输入管理员密码,我的 Jenkins 作业都不存在,不插件等)

kubectl apply -f kubernetes (where my manifests are stored)

kubectl set image deployment/jenkins-deployment jenkins=1234567.dkr.ecr.us-east-1.amazonaws.com/mycompany/jenkins:$VERSION

我是否误解了此卷挂载的工作原理?


顺便说一句,我还有备份和恢复脚本,可以将 Jenkins 主目录备份到 s3,然后再次下载,但这有点超出了这个问题的范围。

【问题讨论】:

    标签: jenkins kubernetes


    【解决方案1】:

    如果您希望您的数据在重新部署|重新启动 pod 后仍然存在,您应该使用 PersistentVolumes 和 StatefulSet 而不是 Deployment 资源.

    【讨论】:

      【解决方案2】:

      您已指定卷类型EmptyDir。这实际上将在运行您的 pod 的 kube 节点上挂载一个空目录。每次重新启动部署时,pod 都可能在 kube 主机之间移动,并且空目录不存在,因此您的数据不会在重新启动后保留。

      我看到您正在从 ECR 存储库中提取图像,所以我假设您在 AWS 中运行 k8s。

      您需要为 AWS 配置一个 StorageClass。如果您已经使用 kops 之类的工具配置了 k8s,那么这将已经被配置。您可以通过 kubectl get storageclass 确认这一点 - 供应商应配置为 EBS:

      NAME            PROVISIONER
      gp2 (default)   kubernetes.io/aws-ebs
      

      然后,您需要指定一个 persistentvolumeclaim:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: jenkins-data
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: gp2 # must match your storageclass from above
        resources:
          requests:
            storage: 30Gi
      

      您现在可以对您的部署进​​行 pv 声明:

      apiVersion: extensions/v1beta1
      kind: Deployment
      metadata:
        name: jenkins-deployment
        labels:
          app: jenkins
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: jenkins
        template:
          metadata:
            labels:
              app: jenkins
          spec:
            containers:
            - name: jenkins
              image: 1234567.dkr.ecr.us-east-1.amazonaws.com/mycompany/jenkins
              imagePullPolicy: "Always"
              ports:
              - containerPort: 8080
              volumeMounts:
                - name: jenkins-home
                  mountPath: /var/jenkins_home
            volumes:
              persistentVolumeClaim:
              claimName: jenkins-data # must match the claim name from above
      

      【讨论】:

      • 感谢您的回复。至于这个解决方案与 EBS 卷(如另一个答案中所建议的),有什么优点/缺点?我想 EBS 会在节点故障中幸存吗?
      • 这将通过动态配置使用 EBS,但是当 Pod 在其他节点上重新调度时,ebs 卷将重新附加到部署。
      • 以防万一有人遇到与我相同的问题:k8s 以 root 身份挂载卷,Jenkins 可能无法写入它们。我在 Deployment 规范中添加了 securityContext: fsGroup: 1000 以挂载组 id 为 1000 的卷。(该值取决于 Dockerfile 或 docker 映像。)
      猜你喜欢
      • 2020-09-15
      • 2020-08-07
      • 1970-01-01
      • 2019-08-24
      • 2021-10-26
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      相关资源
      最近更新 更多