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

 更新时间:2022年03月01日 10:30:40   作者:kl  
本篇博文不是详细介绍容器技术的,而是具体的实践。此篇博文分为两个阶段,分别是ci,cd。包含三部分内容,分别是jenkins,docker,k8s的脚本浅析

前言碎语

基于kubernetes容器化技术架构能够带来诸多好处,诸如,弹性伸缩,自动修复等,在比如蓝绿部署,灰度发布等。近几年容器化技术飞速发展,了解服务网格 的人可能会发现,新兴技术 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:+PrintGCDateStamps -XX:+PrintGCDetails -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:+PrintGCDateStamps -XX:+PrintGCDetails -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的搭建(博主使用的阿里云的容器服务)等,欢迎看到此篇有容器化此需求的同行一起探讨

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

相关文章

  • 如何使用Docker部署Xxl-Job分布式任务调度中心

    如何使用Docker部署Xxl-Job分布式任务调度中心

    XXL-Job是一个开源的分布式任务调度中心,它提供了一个可视化的任务管理界面,可以方便地创建、编辑和监控任务,本文详细的讲解了如何使用Docker部署xxl-job分布式任务调度服务,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • Docker中部署Redis并挂载配置文件

    Docker中部署Redis并挂载配置文件

    本文主要介绍了Docker中部署Redis并挂载配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 浅谈Docker运行Tensorboard和jupyter的方法

    浅谈Docker运行Tensorboard和jupyter的方法

    本篇文章主要介绍了浅谈Docker 运行Tensorboard 和 jupyter的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Docker连接宿主Redis的方法步骤

    Docker连接宿主Redis的方法步骤

    本文主要介绍了Docker连接宿主Redis的方法步骤,可以轻松地使用Docker容器与宿主机上的Redis进行交互,实现高效的数据存储和共享,,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Docker 部署Django项目的方法示例

    Docker 部署Django项目的方法示例

    这篇文章主要介绍了Docker 部署Django项目的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • docker如何配置mysql主从复制

    docker如何配置mysql主从复制

    文章介绍了如何在CentOS 7上搭建一个MySQL集群,包括创建Docker环境、配置文件设置、创建和启动MySQL容器、设置远程访问以及配置主从同步
    2024-12-12
  • Docker 网络之端口绑定的方法

    Docker 网络之端口绑定的方法

    本篇文章主要介绍了Docker 网络之端口绑定的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • linux上安装Docker(非常简单的安装方法)

    linux上安装Docker(非常简单的安装方法)

    今天小编就为大家分享一篇关于linux上安装Docker(非常简单的安装方法),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • Docker 教程之私有仓库详解

    Docker 教程之私有仓库详解

    这篇文章主要介绍了Docker 教程之私有仓库详解的相关资料,需要的朋友可以参考下
    2016-12-12
  • Docker 安装Redis 无法使用配置文件设置密码问题及解决方法

    Docker 安装Redis 无法使用配置文件设置密码问题及解决方法

    最近开发需要使用各种组件,如果都到开发机上安装,会占用电脑资源较多,所以使用docker容器来安装这些组件,这篇文章主要介绍了Docker安装Redis无法使用配置文件设置密码问题,需要的朋友可以参考下
    2023-08-08

最新评论