zoukankan      html  css  js  c++  java
  • 利用K8S的jenkins动态slave+gitee + dockerhub实现完整的develops

    环境要求

      完整的K8S环境+gitee账号+dockerhub账号

    实现目标

      由于是简单测试 本次使用一个简单的nginx镜像 然后自定义首页来实现效果

    简单的逻辑结构

      1 首先梳理整个步骤 首先开发人员需要在本地调试代码并且运维人员写好dockerfile 同时写好K8S的yaml,本次实验用的是jenkinsfile 所以还需要编写好jenkinsfile

           2  简单的代码目录结构如下

       3 结构梳理

    • jenkins点击构建之后回去代码库拉代码
    • 由于我们选择了Jenkinsfile 所以代码拉去之后会按照Jenkinsfile 里面的内容执行 
    •  Jenkinsfile 内容为pipeline 由Groovy 编写 所以我们按照我们的需求编写 我的pipeline如下

    node('haimaxy-jnlp') {
        stage('Prepare') {
            echo "1.Prepare Stage"
            checkout scm
            script {
                build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
       
                if (env.BRANCH_NAME != 'master') {
                    build_tag = "${env.BRANCH_NAME}-${build_tag}"
                }
            }
        }
        stage('Test') {
          echo "2.Test Stage"
        }
        stage('Build') {
            echo "3.Build Docker Image Stage"
            sh "docker build -t zfno111/nginx-demo:${build_tag} ."
        }
        stage('Push') {
            echo "4.Push Docker Image Stage"
            withCredentials([usernamePassword(credentialsId: 'dockerHub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
                sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"
                sh "docker push zfno111/nginx-demo:${build_tag}"
            }
        }
        stage('Deploy') {
            echo "5. Deploy Stage"
            if (env.BRANCH_NAME == 'master') {
                input "确认要部署线上环境吗?"
            }
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s.yaml"
            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s.yaml"
            sh "kubectl apply -f k8s.yaml --record"
        }
    }

      关于上面的内容做一个简单理解:  

      node('haimaxy-jnlp') jenkins部署内容 实现动态slave, 

      stage('Prepare') 这个阶段取出build_tag这个后续也会给docker镜像用,如果分支是主分支名字前面会加上master

      Build阶段完成docker镜像打包 按照dockerfile打包,这里会用到build_tag

      Push阶段 把docker推送到dockerhub上并且打上标签

      Deploy阶段 实施部署按照K8S.yaml里面的内容实现 同时更改一些标签

    K8S.yaml内容如下

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-demo
      namespace: default
    spec:
      selector:
        matchLabels:
          app: nginx-demo
      template:
        metadata:
          labels:
            app: nginx-demo
        spec:
          containers:
          - image: zfno111/nginx-demo:<BUILD_TAG>
            imagePullPolicy: IfNotPresent
            name: nginx-demo
            env:
            - name: branch
              value: <BRANCH_NAME>

        这里完成将容器部署到集群的操作

    接下来看下实战效果

    比如我们修改了Nginx的前端页面 

        echo "这是第一次测试的首页文件" > index.html
     
    然后我们在jenkins上面打包

     等待完成之后

     由于我们没有使用svc和igress所以直接curl K8S内部的集群端口

     发现正常

    后记。。 其实在做整个CD之前还有需要插件和细节  比如JENKINS master-slave的动态部署    jenkins优化 与K8S的关联等等等  后续有时间再来详解

  • 相关阅读:
    mysql字符集
    zabbix自动发现zabbix_agent后添加到所属组和链接到某些模块(九)
    zabbix_agent添加到系统服务启动(八)
    苦苦的追寻,奈何~~(一年三份工作的总结)
    systemd service 设置limit,不生效问题
    logrotate
    cron定时任务
    crontab定时任务第一个周期未完成下一个周期执行就来了
    来年仍旧迷茫...
    rsync的daemon模式
  • 原文地址:https://www.cnblogs.com/ZFBG/p/14667753.html
Copyright © 2011-2022 走看看