Я пытаюсь настроить 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 ответа
Вы указали тип тома 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
Вы должны использовать PersistentVolumes вместе с StatefulSet вместо ресурса Deployment , если вы хотите, чтобы ваши данные сохранялись после повторных развертываний | перезапусков модуля.
Похожие вопросы
Новые вопросы
jenkins
Jenkins - это инструмент непрерывной интеграции с открытым исходным кодом, написанный на Java, который имеет пакеты для Linux, Mac OS X, Windows, FreeBSD и OpenBSD. Проект был раздвоен от Гудзона.