在詹金斯的Kubernetes上安装卷

时间:2018-01-02 22:58:09

标签: 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: {}

然而,如果我然后将一个新容器推送到我的图像存储库并使用以下命令更新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,然后再次下载,但这有点超出了这个问题的范围。

2 个答案:

答案 0 :(得分:2)

如果您希望数据在重新部署后重新启动,则应使用 PersistentVolumes 以及 StatefulSet 而不是部署资源

答案 1 :(得分: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

然后,您需要指定persistentvolumeclaim:

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

您现在可以在部署中声明:

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