「Jenkins」- 部署到 Kubernetes 环境 、迁移到 Kubernetes 环境

  CREATED BY JENKINSBOT

问题描述

该笔记将记录:在 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

参考文献

Kubernetes/Jenkins