在 Kubernetes 上的 Jenkins 中安装卷

djt*_*djt 5 jenkins kubernetes

我正在尝试将 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: {}
Run Code Online (Sandbox Code Playgroud)

但是,如果我随后将一个新容器推送到我的图像存储库并使用以下命令更新 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
Run Code Online (Sandbox Code Playgroud)

我是否误解了这个卷安装是如何工作的?


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

jax*_*orm 1

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

我看到您正在从 ECR 存储库中提取映像,因此我假设您正在 AWS 中运行 k8s。

您需要为 AWS 配置 StorageClass。如果您使用 kops 之类的工具配置了 k8s,那么它就已经配置好了。您可以通过执行以下操作来确认这一点kubectl get storageclass- 配置程序应配置为 EBS:

NAME            PROVISIONER
gp2 (default)   kubernetes.io/aws-ebs
Run Code Online (Sandbox Code Playgroud)

然后,您需要指定持久卷声明:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-data
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: gp2 # must match your storageclass from above
  resources:
    requests:
      storage: 30Gi
Run Code Online (Sandbox Code Playgroud)

您现在可以在您的部署中声明 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
Run Code Online (Sandbox Code Playgroud)