• 【云原生】DevOps(八):Jenkins集成Kubernetes


    在这里插入图片描述

    前言: 📢📢📢
    当下云原生火爆全网,云原生充分利用了云计算弹性、敏捷、资源池和服务化特性,改变云端应用的设计、开发、部署和运行模式,为我们大大提供了便利,本篇文章将带大家走进云原生的世界,揭开它的神秘面纱
    💕 入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀
    💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺

    一、 Jenkins集成Kubernetes

    1.准备部署的yml文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: test
      name: pipeline
      labels:
        app: pipeline
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: pipeline
      template:
        metadata:
          labels:
            app: pipeline    
        spec:
          containers:
          - name: pipeline
            image: 192.168.11.102:80/repo/pipeline:v4.0.0
            imagePullPolicy: Always
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      namespace: test
      labels:
        app: pipeline
      name: pipeline  
    spec:
      selector:
        app: pipeline
      ports:
      - port: 8081
        targetPort: 8080
      type: NodePort
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      namespace: test
      name: pipeline
    spec:
      ingressClassName: ingress
      rules:
      - host: mashibing.pipeline.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: pipeline
                port:
                  number: 8081
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    2.Harbor私服配置

    在尝试用kubernetes的yml文件启动pipeline服务时,会出现Kubernetes无法拉取镜像的问题,这里需要在kubernetes所在的Linux中配置Harbor服务信息,并且保证Kubernetes可以拉取Harbor上的镜像

    • 设置Master和Worker的私服地址信息

      设置Harbor私服地址
      在这里插入图片描述
    • 在Kuboard上设置私服密文信息

      设置密文并测试
      在这里插入图片描述

      按照复制指令的位置测试认证,效果如下

      测试效果
      在这里插入图片描述

    3.测试使用效果

    执行kubectl命令,基于yml启动服务,并且基于部署后服务的提示信息以及Ingress的设置,直接访问

    在这里插入图片描述

    | 在这里插入图片描述

    4.Jenkins远程调用

    • 将pipeline.yml配置到Gitlab中

      配置yml文件
      在这里插入图片描述
    • 配置Jenkins的目标服务器,可以将yml文件传输到K8s的Master上

      设置目标服务器
      在这里插入图片描述
    • 修改Jenkinsfile,重新设置流水线任务脚本,并测试效果

      传递yml文件脚本
      在这里插入图片描述

      | [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fqEXWcsV-1657006838073)(Pictures/1642500102996.png)] |

    • 设置Jenkins无密码登录k8s-master

      将Jenkins中公钥信息复制到k8s-master的~/.ssh/authorized_keysz中,保证远程连接无密码

      远程执行命令无需密码
      在这里插入图片描述
    • 设置执行kubectl的脚本到Jenkinsfile

      设置Jenkinsfile
    • 执行查看效果

      执行流水线
      在这里插入图片描述

      可以查看到yml文件是由变化的, 这样k8s就会重新加载

    • 查看效果

      效果
      在这里插入图片描述

    Ps:这种方式更适应与CD操作,将项目将基于某个版本部署到指定的目标服务器

    二、基于GitLab的WebHooks

    这里要实现自动化的一个CI操作,也就是开发人员Push代码到Git仓库后,Jenkins会自动的构建项目,将最新的提交点代码构建并进行打包部署,这里区别去上述的CD操作,CD操作需要基于某个版本进行部署,而这里每次都是将最新的提交点集成到主干上并测试。

    1.WebHooks通知

    开启Jenkins的自动构建

    构建触发器
    在这里插入图片描述

    设置Gitlab的Webhooks

    设置Gitlab的Webhooks
    在这里插入图片描述

    需要关闭Jenkins的Gitlab认证

    关闭Jenkins的Gitlab认证
    在这里插入图片描述

    再次测试Gitlab

    再次测试
    在这里插入图片描述

    2.修改配置

    修改Jenkinsfile实现基于最新提交点实现持续集成效果,将之前引用${tag}的全部去掉

    // 所有的脚本命令都放在pipeline中
    pipeline{
    	// 指定任务再哪个集群节点中执行
    	agent any
    
    	// 声明全局变量,方便后面使用
    	environment {
    		harborUser = 'admin'
            harborPasswd = 'Harbor12345'
            harborAddress = '192.168.11.102:80'
            harborRepo = 'repo'
    	}
    
        stages {
            stage('拉取git仓库代码') {
                steps {
                    checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.11.101:8929/root/mytest.git']]])
                }
            }
            stage('通过maven构建项目') {
                steps {
                    sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
                }
            }
            stage('通过SonarQube做代码质量检测') {
                steps {
                    sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=40306ae8ea69a4792df2ceb4d9d25fe8a6ab1701'
                }
            }
            stage('通过Docker制作自定义镜像') {
                steps {
                    sh '''mv ./target/*.jar ./docker/
                    docker build -t ${JOB_NAME}:latest ./docker/'''
                }
            }
            stage('将自定义镜像推送到Harbor') {
                steps {
                    sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborAddress}
                    docker tag ${JOB_NAME}:latest  ${harborAddress}/${harborRepo}/${JOB_NAME}:latest
                    docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest '''
                }
            }
            stage('将yml文件传到k8s-master上') {
                steps {
                    sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                }
            }
            stage('远程执行k8s-master的kubectl命令') {
                steps {
                   sh '''ssh root@192.168.11.201 kubectl apply -f /usr/local/k8s/pipeline.yml
                    ssh root@192.168.11.201 kubectl rollout restart deployment pipeline -n test'''
                }
            }
    
        }
        post {
            success {
                dingtalk(
                    robot: 'Jenkins-DingDing',
                    type: 'MARKDOWN',
                    title: "success: ${JOB_NAME}",
                    text: ["- 成功构建:${JOB_NAME}! \n- 版本:latest \n- 持续时间:${currentBuild.durationString}" ]
                )
            }
            failure {
                dingtalk(
                    robot: 'Jenkins-DingDing',
                    type: 'MARKDOWN',
                    title: "success: ${JOB_NAME}",
                    text: ["- 构建失败:${JOB_NAME}! \n- 版本:latest \n- 持续时间:${currentBuild.durationString}" ]
                )
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    修改pipeline.yml,更改镜像版本

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: test
      name: pipeline
      labels:
        app: pipeline
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: pipeline
      template:
        metadata:
          labels:
            app: pipeline    
        spec:
          containers:
          - name: pipeline
            image: 192.168.11.102:80/repo/pipeline:latest   # 这里
            imagePullPolicy: Always
            ports:
            - containerPort: 8080
    # 省略其他内容…………
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3.滚动更新

    因为pipeline没有改变时,每次不会重新加载,这样会导致Pod中的容器不会动态更新,这里需要使用kubectl的rollout restart命令滚动更新

    设置Jenkinsfle
    在这里插入图片描述

    在这里插入图片描述

    【系列好文推荐】

    🎯🎯🎯
    零基础学Python 开篇–全套学习路线
    零基础学Python–Web开发(七):登录实现及功能测试
    零基础学Python 机器学习实战——疫情数据分析与预测实战

    🎯🎯🎯

    欢迎订阅本专栏:零基础学Python 系列课程是针对Python入门&进阶打造的一全套课程,在这里,我将会一 一更新Python基础语法、Python爬虫、Web开发、 Django框架、Flask框架以及人工智能相关知识,帮助你成为Python大神,如果你喜欢的话就抓紧收藏订阅起来吧~💘💘💘
    💕💕💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!✨ ✨ ✨
    🍻🍻🍻如果你喜欢的话,就不要吝惜你的一键三连了~
    在这里插入图片描述
    在这里插入图片描述
    ⬇️⬇️ ⬇️ 商务合作|交流学习|粉丝福利|Python全套资料⬇️ ⬇️ ⬇️ 欢迎联系~

  • 相关阅读:
    LLVM系列第十八章:写一个简单的IR处理流程Pass
    通知定档2024中国(成都)国际线路板展览会
    CVE-2017-12615 Tomcat远程命令执行漏洞
    吴恩达机器学习课程资源(笔记、中英文字幕视频、课后作业,提供百度云镜像!)
    通信原理 | 网络相关知识总结
    SpringCore完整学习教程5,入门级别
    Python3,区区一段代码,自己就可以制作动漫头像,YYDS。
    【Java入门每日一练】使用DFS深度优先遍历文件夹
    vite+vue3+ts项目搭建之集成Layout组件搭建、全局自动注册基础组件、缓存页面
    Pandas数据结构
  • 原文地址:https://blog.csdn.net/weixin_51390582/article/details/125621311