1. 首页
  2. 技术知识

容器化技术架构jenkins docker k8s脚本浅析

目录

    前言碎语浅谈docker浅谈k8s的部署脚本最后聊聊jenkinspipeline

前言碎语

基于kubernetes容器化技术架构能够带来诸多好处,诸如,X伸缩,自动修复等,在比如蓝绿部署,灰度发布等。近几年容器化技术飞速发展,了解服务网格 的人可能会发现,新兴技术 istio 等service mesh技术没有容器化的技术环境根本就没法实践。

浅谈docker

docker可以类比为jvm,jvm也是虚拟机,然后docker的image可以类比为jar包,jar运行在jvm里面,image当然运行在docker容器里,然后jar包是通过maven 的pom.xml定义构建的产物,那docker也有一个Dockerfile来定义打包的镜像。在没有容器化之前,我们开发提供的最终产物是jar,容器化之后我们需要提供docker的镜像,docker的镜像会包含我们的jar,然后提供一个稳定的可移植的运行环境。下面是最简单的一个docker镜像构建:

通过 docker build -t kl/sales . 就可以构建一个可运行的镜像

浅谈k8s的部署脚本

其实k8s的脚本没什么可说的,本身k8s的概念非常之多,具体可参考官方的文档,下面贴出我们的部署文件

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: sales-APP

  namespace: #namespace

spec:

  replicas: 2

  minReadySeconds: 130  # 从容器启动到应用正常提供服务

  strategy:  # k8s更新策略

      type: RollingUpdate #滚动更新

      rollingUpdate:

        maxSurge: 2  # 更新时允许最大激增的容器数,默认 replicas 的 1/4 向上取整

        maxUnavailable: 1  # 更新时允许最大 unavailable 容器数,默认 replicas 的 1/4 向下取整

  template:

    metadata:

      labels:

        app: sales-app

    spec:

      imagePullSecrets: #镜像拉取秘钥

      – name: xx-xx-xx

      containers:

      – name: sales

        image: xxx-vpc.cn-xx.aliyuncs.com/keking/sales:#Tag

        imagePullPolicy: Always

        env:

        – name: runShell

          value: #runShell

        ports:

        – containerPort: 6002

          name: web

          protocol: TCP

        resources:

          limits:

            cpu: 600m

            memory: 4Gi

          requests:

            cpu: 300m

            memory: 100Mi

        livenessProbe: #检查是否存活

          httpGet:

            path: /health

            port: 6002

          initialDelaySeconds: 240 #首次检查在多少时间后

          periodSeconds: 180 #检查周期

          timeoutSeconds: 3 #超时时间

          failureThreshold: 3 #失败的阈值,连续三次

        readinessProbe: #检查是否成功启动

          httpGet:

            path: /health

            port: 6002

          initialDelaySeconds: 140 #首次检查在多少时间后

          periodSeconds: 300 #检查周期

          timeoutSeconds: 3 #超时时间



apiVersion: v1

kind: Service

metadata:

  name: sales-app

  namespace: #namespace

  labels:

    app: sales-app

spec:

  selector:

    app: sales-app

  ports:

  – name: web

    port: 80

    targetPort: 6002

    nodePort: 31942

  type: NodePort


最后聊聊jenkins pipeline

和一般的jenkins pipeline定义一样,容器化后就多了两个步骤,一个是在jar生成后,根据前面的讲的Dockerfile文件构建docker的镜像,这个要求jenkins所在主机必须有docker的环境。第二个步骤是发送k8s的部署脚本到k8s容器,这个是通过jenkins kuberneetes插件来完成的,详见下面的jenkins脚本

podTemplate(label: ‘jnlp-slave’, cloud: ‘kubernetes’, containers: [

        containerTemplate(

                name: ‘jnlp’,

                image: ‘xx-vpc.cn-xx.aliyuncs.com/keking/jenkins-slave:latest’,

                alwaysPullImage: true

        ),

],

        volumes: [

                hostPathVolume(mountPath: ‘/var/run/docker.sock’, hostPath: ‘/var/run/docker.sock’),

                hostPathVolume(mountPath: ‘/usr/bin/docker’, hostPath: ‘/usr/bin/docker’),

                hostPathVolume(mountPath: ‘/usr/local/jdk’, hostPath: ‘/usr/local/jdk’),

                hostPathVolume(mountPath: ‘/usr/local/maven’, hostPath: ‘/usr/local/maven’),

        ],

        imagePullSecrets: [‘registry-pull-secret’],

)

        {

            node(“jnlp-slave”) {

                stage(‘Git Checkout’) {

                    checkout([$class: ‘GitSCM’, branches: [[name: “*/${branch}”]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: ‘xx’, url: ‘http://xx.xx.xx/xx/yudian-salesplatform-boot.git’]]])

                }

                stage(‘Maven Build’) {

                    script {

                        if (‘true’ == “${build}”) {

                            sh “mvn clean install -U  -P${profile} -Dmaven.test.skip=true”

                        } else {

                            echo “跳过maven build”

                        }

                    }

                }

                stage(‘Docker Build ‘) {

                    script {

                        if (‘true’ == “${build}”) {

                            sh ”’

                                docker login -u it_sh@keking-group -p x#xxx-vpc.cn-xx.aliyuncs.com

                                docker build -t xx-vpc.cn-xx.aliyuncs.com/keking/sales:${Tag} .

                                docker push xx-vpc.cn-xx.aliyuncs.com/keking/sales:${Tag}

                               ”’

                        } else {

                            echo “跳过docker build”

                        }

                    }

                }

                stage(‘Deploy to K8s’) {

                    script {

                        if(‘true’ == “${deploy}”){

                            if (‘prod’ == “${profile}”) {

                                sh ”’

                                       sed -i “s/#namespace/prod/g” deploy.yaml

                                       sed -i “s%#runShell%java -Xmx2G -Xms2G -Xmn960M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.log -Xloggc:/tmp/gc.log -verbose:gc -XX:+PrintGСDateStamps -XX:+PrintGСDetails -XX:MaxMetaspaceSize=128m -XX:MetaspaceSize=128m  -jar -Ddev_meta=http://conf.x.ops:8801/ -Denv=DEV -Didc=prod app.jar%g” deploy.yaml

                                   ”’

                            }

                            if (‘uat’ == “${profile}”) {

                                sh ”’

                                       sed -i “s/#namespace/uat/g” deploy.yaml

                                       sed -i “s%#runShell%java -Xmx1536M -Xms1536M -Xmn960M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.log -Xloggc:/tmp/gc.log -verbose:gc -XX:+PrintGСDateStamps -XX:+PrintGСDetails -XX:MaxMetaspaceSize=128m -XX:MetaspaceSize=128m  -jar -Ddev_meta=http://conf.keking.ops:8801/ -Denv=DEV -Didc=sales_docker app.jar%g” deploy.yaml                     

                                   ”’

                            }

                            sh ”’

                               sed -i “s/#Tag/${Tag}/g” deploy.yaml

                            ”’

                            kubernetesDeploy configs: ‘deploy.yaml’, kubeConfig: [path: ”], kubeconfigId: ‘9c1da035-60b9-4bd8-aeae-1a31666280ce’, secretName: ”, ssh: [sshCredentialsId: ‘*’, sshServer: ”], textCredentials: [certificateAuthorityData: ”, clientCertificateData: ”, clientKeyData: ”, serverUrl: ‘https://’]

                        }else {

                            echo “跳过Deploy k8s”

                        }

                    }

                }

            }

        }综上,就完成了从jenkins到k8s的ci和cd过程,当然过程中还有很多细枝末节未详尽描述,比如k8s的搭建(博X用的阿里云的容器服务)等,欢迎看到此篇有容器化此需求的同行一起探讨

以上就是jenkins docker k8s的容器化之路脚本浅析的详细内容,更多关于jenkins docker k8s的容器化脚本的资料请关注共生网络其它相关文章!

原创文章,作者:starterknow,如若转载,请注明出处:https://www.starterknow.com/105711.html

联系我们