问题描述
该笔记将记录:在 Kubernetes Cluster 中,如何部署 Jenkins 服务,重点将现有 Jenkins 服务迁移到 Kubernetes 中;
解决方案
补充说明:
1)鉴于迁移是我们的重点工作,所以部署过程会涉及迁移相关的内容;
服务部署
# 添加仓库
helm repo add jenkinsci https://charts.jenkins.io
helm repo update
helm search repo jenkinsci
# 下载
# 我们 Jenkins 2.345 版本,但是没有该版本的 Chart 资源,
# 而 4.1.12 对应 Jenkins 2.346.1 版本,最贴近(算是微小升级);
helm pull jenkinsci/jenkins --version 4.1.12 # jenkins-4.1.12.tgz
# 修改配置
helm show values ./jenkins-4.1.12.tgz > jenkins-4.1.12.helm-values.yaml
...(1)修改 storageClass 参数,以配置其使用的存储类;
...(2)修改 Ingress 参数,以保留服务提供 HTTP 访问;
# 服务部署
helm --namespace jenkins \
install jenkins ./jenkins-4.1.12.tgz -f jenkins-4.1.12.helm-values.yaml \
--create-namespace
# 查看密码
kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo
# 服务登录
# admin:<password>
服务迁移
问题描述
在 Kubernetes 大为流行前,我们已经开始使用 Jenkins 服务,现在我们需要将 Jenkins 迁移到 Kubernetes 环境,而非重新部署 Jenkins 服务;
解决方案
目前(07/10/2022),我们的想法是:
1)首先,运行 rsync 容器,并创建 PV 与 PVC 资源,负责将数据复制到 PV 内;
2)在启动 Jenkins 服务,并在其中引用该 PVC 资源,并检查 Jenins 能够正常运行;
接下来是验证工作:
第一步、数据迁移
运行 rsync 容器,并完成数据同步:
kubectl apply -f - <<EOF
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-claim
spec:
storageClassName: nfs-client
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
---
apiVersion: v1
kind: Pod
metadata:
name: jenkins-migration
spec:
volumes:
- name: jenkins-claim
persistentVolumeClaim:
claimName: jenkins-claim
containers:
- name: rsync
image: eeacms/rsync
command: ["sleep", "infinity"]
volumeMounts:
- mountPath: "/srv/jenkins/"
name: jenkins-claim
EOF
# 进行数据同步
kubectl exec -it jenkins-migration -- sh
rsync --delete -avz root@jenkins-old:/var/lib/jenkins/ /srv/jenkins/
第二步、创建 Jenkins 服务
按照前述步骤,通过 Helm 部署 Jenkins 服务:
1)修改 persistence.existingClaim: jenkins-claim 参数,以使用已创建的 PVC 资源;
2)修改 Ingress 配置,以暴露 Jenkins 服务;
3)最后,通过 Helm 进行部署(当启动时会自动下载安装部分插件,所以稍慢);
第三步、访问验证,问题修复
浏览器访问 Jenkins 服务,并检查是否正常运行,是否存在异常;
部分问题的出现,其与多种因素(诸如场景、版本、插件等等)相关,我们将描述我们遇到的问题。
针对插件依赖错误问题:
1)当迁移到 Kubernets 环境后,鉴于 Jenkins 版本未与原始版本完全匹配,外加某些未知因素,导致插件依赖出现问题。
2)按照提示,我们依次更新 Jackson 2 API Plugin、SnakeYAML API 插件(环境相关,具体问题具体分析)
3)如果插件升级失败,导致 Jenkins 显示 Error 页面,我们通过 rsync 重置 plugins 目录,然后再次尝试插件升级;
相关链接
Jenkins on Kubernetes Engine
Jenkins Configuration as Code
参考文献