Kubernetes 创建 Jenkins 实现 CICD 配置指南

打印 上一主题 下一主题

主题 1876|帖子 1876|积分 5628

Kubernetes 创建 Jenkins 实现 CICD 配置指南

拉取 Jenkins 镜像并推送到当地仓库

  1. # 从官方仓库拉取镜像(若网络不通畅可使用国内镜像源)
  2. docker pull jenkins/jenkins:lts-jdk11
  3. # 国内用户可去下面地址寻找镜像源并拉取:
  4. https://docker.aityp.com
  5. # 推送到本地 Kubernetes 镜像仓库
  6. docker tag jenkins/jenkins:lts-jdk11 192.168.1.13:5000/datasafe/jenkins:lts-jdk11
  7. docker push 192.168.1.13:5000/datasafe/jenkins:lts-jdk11
复制代码
1. 创建命名空间

  1. kubectl create ns jenkins
复制代码
2. 创建 ServiceAccount 和权限绑定

2.1 检查 ServiceAccount 是否存在

  1. kubectl get serviceaccount -n jenkins
复制代码
2.2 创建 jenkins-admin ServiceAccount

  1. cat <<EOF | kubectl apply -f -
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5.   name: jenkins-admin
  6.   namespace: jenkins
  7. EOF
复制代码
2.3 配置权限绑定

集群管理员权限 (ClusterRoleBinding)

  1. cat <<EOF | kubectl apply -f -
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: ClusterRoleBinding
  4. metadata:
  5.   name: jenkins-admin-binding
  6. subjects:
  7. - kind: ServiceAccount
  8.   name: jenkins-admin
  9.   namespace: jenkins
  10. roleRef:
  11.   kind: ClusterRole
  12.   name: cluster-admin
  13.   apiGroup: rbac.authorization.k8s.io
  14. EOF
复制代码
命名空间权限 (RoleBinding)

  1. cat <<EOF | kubectl apply -f -
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: RoleBinding
  4. metadata:
  5.   name: jenkins-admin-binding
  6.   namespace: jenkins
  7. subjects:
  8. - kind: ServiceAccount
  9.   name: jenkins-admin
  10.   namespace: jenkins
  11. roleRef:
  12.   kind: Role
  13.   name: jenkins-role
  14.   apiGroup: rbac.authorization.k8s.io
  15. EOF
复制代码
3. 部署 Jenkins YAML 配置

  1. ---
  2. kind: Deployment
  3. apiVersion: apps/v1
  4. metadata:
  5.   name: jenkins
  6.   namespace: jenkins
  7. spec:
  8.   replicas: 1
  9.   selector:
  10.     matchLabels:
  11.       app: jenkins
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: jenkins
  16.     spec:
  17.       volumes:
  18.         - name: jenkinshome
  19.           persistentVolumeClaim:
  20.             claimName: jenkins-data-pvc
  21.       containers:
  22.         - name: jenkins
  23.           image: '192.168.1.13:5000/datasafe/jenkins:lts-jdk11'
  24.           ports:
  25.             - name: web
  26.               containerPort: 8080
  27.               protocol: TCP
  28.             - name: agent
  29.               containerPort: 50000
  30.               protocol: TCP
  31.           env:
  32.             - name: JAVA_OPTS
  33.               value: '-Duser.timezone=Asia/Shanghai'
  34.           volumeMounts:
  35.             - name: jenkinshome
  36.               mountPath: /var/jenkins_home
  37.       serviceAccountName: jenkins-admin
  38.       securityContext: {}
  39. ---
  40. kind: Service
  41. apiVersion: v1
  42. metadata:
  43.   name: jenkins
  44.   namespace: jenkins
  45.   labels:
  46.     app: jenkins
  47. spec:
  48.   ports:
  49.     - name: web
  50.       protocol: TCP
  51.       port: 8080
  52.       targetPort: 8080
  53.       nodePort: 30010
  54.   selector:
  55.     app: jenkins
  56.   type: NodePort
  57. ---
  58. kind: Service
  59. apiVersion: v1
  60. metadata:
  61.   name: jenkins-agent
  62.   namespace: jenkins
  63.   labels:
  64.     app: jenkins
  65. spec:
  66.   ports:
  67.     - name: agent
  68.       protocol: TCP
  69.       port: 50000
  70.       targetPort: 50000
  71.   selector:
  72.     app: jenkins
  73.   type: ClusterIP
  74. ---
  75. kind: PersistentVolumeClaim
  76. apiVersion: v1
  77. metadata:
  78.   name: jenkins-data-pvc
  79.   namespace: jenkins
  80. spec:
  81.   accessModes:
  82.     - ReadWriteMany
  83.   resources:
  84.     requests:
  85.       storage: 10Gi
  86.   storageClassName: nfs-client
复制代码
4. 创建凭证(Git 服务器账户暗码)


  • 进入 Jenkins 管理界面
  • 导航到"系统管理" → “根据管理”
  • 创建 Git 和节点服务器凭证
  • 纪录生成的唯一标识符

5. 绑定 Jenkins 服务器节点

5.1 预备工作

从节点需要安装以下环境:


  • Git
  • JDK
  • Maven
  • Docker(可选)
添加 Maven 环境变量:
  1. echo 'export PATH=/usr/local/apache-maven-3.8.6/bin:$PATH' >> ~/.profile
  2. source ~/.profile
复制代码
5.2 创建从节点


  • 进入"系统管理" → “节点和云管理”
  • 创建新节点
  • 配置节点信息:

    • 名称
    • 长途工作目录
    • 启动方式(通过SSH)
    • 根据(使用之前创建的凭证)




5.3 常见题目及解决方案

题目1:Jenkins 毗连不上长途机器

错误信息:
  1. [SSH] Opening SSH connection to 192.168.1.4:22.
  2. Searching for 192.168.1.4 in /var/jenkins_home/.ssh/known_hosts
  3. Searching for 192.168.1.4:22 in /var/jenkins_home/.ssh/known_hosts
  4. [04/21/25 12:59:00] [SSH] WARNING: No entry currently exists in the Known Hosts file for this host. Connections will be denied until this new host and its associated key is added to the Known Hosts file.
  5. Key exchange was not finished, connection is closed.
  6. SSH Connection failed with IOException: "Key exchange was not finished, connection is closed.", retrying in 15 seconds. There are 10 more retries left.
复制代码
解决方案:
  1. # 进入 Jenkins 容器执行
  2. ssh-keyscan -H 从节点主机IP >> /var/jenkins_home/.ssh/known_hosts
复制代码
题目2:加入 Jenkins 失败

错误信息:
  1. Starting agent process: cd "/data/jenkins" && java  -jar remoting.jar -workDir /data/jenkins -jar-cache /data/jenkins/remoting/jarCache
  2. Error: A JNI error has occurred, please check your installation and try again
  3. Exception in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
  4.         at java.lang.ClassLoader.defineClass1(Native Method)
  5.         at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
  6.         at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
  7.         at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
  8.         at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
  9.         at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
  10.         at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
  11.         at java.security.AccessController.doPrivileged(Native Method)
  12.         at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
  13.         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  14.         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
  15.         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  16.         at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
  17. Agent JVM has terminated. Exit code=1
复制代码
解决方案:

  • 下载并安装 JDK 11 https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.html#license-lightbox
  • 在节点配置 → 启动方式 → 高级中指定 JDK11 路径

重新点击 launch agent即可

6. 创建 Pipeline 项目

6.1 Pipeline 脚本示例

  1. pipeline {
  2.     agent {
  3.         label 'java' // 使用标签选择节点
  4.     }
  5.         
  6.     environment {
  7.         IMAGE_NAME = "micro-datamap"
  8.         K8S_NAMESPACE = "development"
  9.         K8S_PORT = "31090"
  10.         K8S_DEBUG_PORT = "31091"
  11.         SPRING_PROFILES_ACTIVE = "dev"
  12.     }
  13.    
  14.     parameters {
  15.         string(
  16.             name: 'BUILD_VERSION',
  17.             defaultValue: '3.0.4_hz250117',
  18.             description: '构建版本号'
  19.         )
  20.     }
  21.    
  22.     stages {
  23.         stage("Checkout") {
  24.             steps {
  25.                 echo "1. checkout integration branch"
  26.                 git branch: '分支',
  27.                     credentialsId: 'git凭据标识',
  28.                     url: '仓库地址'
  29.             }
  30.         }
  31.         
  32.         stage('Package&Build') {
  33.             steps {
  34.                 echo "2.package project & build Image"
  35.                 script {
  36.                     sh "cat src/main/docker/Dockerfile"
  37.                     sh "cd src/main/docker/ && bash build.sh ${SPRING_PROFILES_ACTIVE} ${BUILD_VERSION}"
  38.                 }
  39.             }
  40.         }
  41.         
  42.         stage('Push') {
  43.             steps {
  44.                 echo "3.push image"
  45.                 script {
  46.                     sh "docker push 镜像名称"
  47.                 }
  48.             }
  49.         }
  50.         
  51.         stage('Deploy') {
  52.             steps {
  53.                 echo "4.deploy in k8s"
  54.                 script {
  55.                     sh "echo 'deleting current deployment...'"
  56.                     // 部署相关的kubectl命令
  57.                 }
  58.             }
  59.         }
  60.     }
  61. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表