Я пытаюсь настроить 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: {}

Однако, если я затем отправлю новый контейнер в свой репозиторий изображений и обновлю модули с помощью приведенных ниже команд, Дженкинс вернется в сеть, но попросит меня начать с нуля (введите пароль администратора, ни одной из моих заданий 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
djt 3 Янв 2018 в 01:58

2 ответа

Лучший ответ

Вы указали тип тома EmptyDir. По сути, это приведет к монтированию пустого каталога на узле kube, на котором запущен ваш модуль. Каждый раз при перезапуске развертывания модуль может перемещаться между хостами kube, а пустой каталог отсутствует, поэтому ваши данные не сохраняются при перезапусках.

Я вижу, что вы извлекаете образ из репозитория ECR, поэтому я предполагаю , что вы используете k8s в AWS.

Вам нужно будет настроить StorageClass для AWS. Если вы подготовили k8s, используя что-то вроде kops, это уже будет настроено. Вы можете подтвердить это, выполнив kubectl get storageclass - провайдер должен быть настроен как EBS:

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

Затем вам нужно указать постоянную претензию по объему:

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
1
jaxxstorm 3 Янв 2018 в 03:38

Вы должны использовать PersistentVolumes вместе с StatefulSet вместо ресурса Deployment , если вы хотите, чтобы ваши данные сохранялись после повторных развертываний | перезапусков модуля.

2
kofucii 2 Янв 2018 в 23:27