我试图将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,然后再次下载,但这有点超出了这个问题的范围。
答案 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