问题描述
该笔记将记录:在 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
参考文献