Jenkins 库伯内特斯岛詹金斯的容量增加

Jenkins 库伯内特斯岛詹金斯的容量增加,jenkins,kubernetes,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: match

我试图将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作业,没有插件等)

我是不是误解了这个卷装是如何工作的



另外,我还有备份和还原脚本,可以将Jenkins主目录备份到s3,然后再次下载,但这在一定程度上超出了本问题的范围。

如果希望数据在重新部署后仍能继续使用,则应将持久卷状态集一起使用,而不是部署资源。重新启动pod。

您已经指定了卷类型
清空dir
。这将在运行pod的kube节点上挂载一个空目录。每次重新启动部署时,pod可能会在kube主机之间移动,而空目录不存在,因此数据不会在重新启动时持久化

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

您需要为AWS配置StorageClass。如果您已经使用类似kops的东西配置了K8,那么这将已经配置好。您可以通过执行
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可能无法向其写入。我在部署规范中添加了一个
securityContext:fsGroup:1000
,以装载组id为1000的卷。(该值取决于Dockerfile或docker图像。)
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