云原生DevOps:Jenkins集成Kubernetes

Posted 是Dream呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生DevOps:Jenkins集成Kubernetes相关的知识,希望对你有一定的参考价值。

@TOC

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

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文件脚本

  • 设置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" ]
            )
        
    

修改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
# 省略其他内容…………

3.滚动更新

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

设置Jenkinsfle

以上是关于云原生DevOps:Jenkins集成Kubernetes的主要内容,如果未能解决你的问题,请参考以下文章

[云原生专题-62]:Kubesphere云治理-DevOps-持续集成与pipeline自动上云工具Jenkins

云原生DevOps:CICD持续集成|交付|部署

云原生DevOps:集成Harbor

云原生DevOps:Jenkins流水线

云原生 | Devops篇Jenkins安装与实战

视野数科借助 SAE + Jenkins 打造云原生 DevOps,运维效率提升 60%