自动化集成:Pipeline整合Docker+K8S

Posted 知了一笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化集成:Pipeline整合Docker+K8S相关的知识,希望对你有一定的参考价值。

前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作;本篇文章主要描述流水线集成K8S用法

一、背景描述

分布式服务的部署是一个复杂的流程,当容器应用存在几十甚至上百的时候,用手动的方式部署显然难度过高,借助Kubernetes容器编排引擎,可以快速的实现自动部署,扩展,升级等一系列复杂步骤。

二、流程设计

在之前的篇幅中,已经描述了流水线的方式进行源码编译Jar包,并构建成Docker镜像的过程,接下来在K8S平台上部署Docker容器,这样整个自动化的流程就基本完善了:

核心步骤:

  • 创建yaml文件类型资源管理脚本;
  • 执行已部署资源的删除;
  • 根据脚本创建新的资源服务;
  • 该流程衔接在Docker镜像构建成功之后,可以先在本地pull镜像,也可以直接从远程仓库实时获取镜像。

    三、实现过程

    1、插件安装

    Jenkins集成K8S的插件:Kubernetes plugin

    2、部署脚本

    关于K8S部署docker镜像的脚本语法,在K8S基础模块中有详细描述,创建脚本文件的语法在docker流水线模块中同样适用:

        environment 
            k8s_directory = \'k8s-deploy\'
        

            // K8S部署Docker镜像
            stage(\'K8Sdeploy\'
                steps 
                    sh \'\'\'
                    rm -rf $k8s_directory
                    mkdir -p $k8s_directory
                    cd $k8s_directory
    cat>k8s-app.yaml<<EOF
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: k8s-app-deployment
      labels:
        app: k8s-app
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: k8s-app
      template:
        metadata:
          labels:
            app: k8s-app
        spec:
          containers:
          - name: k8s-app
            image: cicada-image/doc-line-app:latest
            imagePullPolicy: Never
            ports: 
            - containerPort: 8079
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: k8s-app-service
      labels:
        app: k8s-app
    spec:
      type: NodePort
      ports: 
        - port: 8080
          targetPort: 8079
      selector:
        app: k8s-app
    EOF
                    cat k8s-app.yaml
                    echo "create k8s-app.yaml success"

                    echo "base Yaml file deploy k8s resource"
                    ls
                    
                    sleep 10
                    set +e
                    kubectl delete -f k8s-app.yaml
                    
                    sleep 10
                    set -e
                    kubectl create -f k8s-app.yaml
                    \'
    \'\'
                
            
        

    脚本说明:

  • 进入k8s的工作目录;
  • 创建k8s-app.yaml部署的脚本文件;
  • 声明Pod的副本数为:2;
  • 根据脚本尝试一次资源删除;
  • 根据脚本创建资源;
  • set +e-e为shell语法,控制脚本是否中断;
  • 资源创建成功后,查看k8s的控制台界面,各个组件是否都部署成功,之后通过访问服务中API接口判断环境是否通顺:

    3、流程总结

    在整个流程中,涉及下面几个核心阶段:

  • 源码管理,代码仓库获取,hook模式配置;
  • 本地编译打包,生成应用的Jar包;
  • Docker将Jar包构建成镜像文件,上传仓库;
  • K8S将Docker镜像部署在集群服务上;
  • 这里简化很多不必要的流程,在实际的应用中,远比案例中的演示更复杂,可以根据各个业务的需要,参考流水线组件的功能文档,不断引入更好的方式去优化流程,最终会形成一个持续交付的自动流程,并且不会对代码层面带来改造成本。


    同系列推荐

  • Jenkins管理工具详解

  • Pipeline流水语法详解

  • Docker容器入门简介

  • Pipeline整合Docker容器

  • Kubernetes容器引擎详解

  • 微服务组件二次浅封装


  • 四、源代码地址

    GitEE·地址
    https://gitee.com/cicadasmile/butte-auto-parent
    Wiki·地址
    https://gitee.com/cicadasmile/butte-java-note

    自动化集成:Pipeline整合Docker容器

    一、背景描述

    微服务架构是当前主流的技术选型,在业务具体落地时,会存在很多业务服务,不管是在开发、测试、上线的任意节点中,如果基于手动编译的方式打包服务,操作成本不仅极高,而且很容易出现纰漏。

    通过Pipeline流水线的方式,将服务镜像构建编排成一键触发执行,实现自动化的管理流程,是微服务架构中的必要的功能模块。

    二、流程设计

    本篇中的流程节点,主要针对打包好的应用Jar包,在docker模块中的处理流程,主要是镜像构建管理与容器运行:

    • 构建docker文件目录与内容;
    • 拷贝Jar包,创建Dockerfile脚本文件;
    • 执行docker镜像构建,推送云仓库;
    • 拉取镜像文件并运行docker容器;

    整个流程的都放在Pipeline流水线中,衔接在本地Jar包生成之后。

    三、实现过程

    1、插件安装

    首先安装流程中Docker集成的相关插件:Docker PipelineDocker pluginCloudBees Docker Hub/Registry Notification

    在之前的流水线篇幅中,已经通过流水线完成Gitee仓库代码pull和本地打包,下面开始处理docker环节。

    2、镜像构建脚本

    关于Dockerfile的脚本语法也可以参考之前docker篇幅,下面看流水线中的用法:

        environment 
            docker_directory = docker-app
            docker_repository = 仓库URL
        
    
            stage(Dockerfile) 
                steps 
                    sh 
                    rm -rf $docker_directory
                    mkdir -p $docker_directory
                    cp auto-client/target/auto-client-1.0-SNAPSHOT.jar $docker_directory/auto-client.jar
                    cd $docker_directory
    cat>Dockerfile<<EOF
    FROM java:8
    MAINTAINER cicadasmile
    VOLUME /data/docker/logs
    ADD auto-client.jar application.jar
    ENTRYPOINT ["java","-Dspring.profiles.active=dev","-Djava.security.egd=file:/dev/./urandom","-jar","/application.jar"]
    EOF
                    cat Dockerfile
                    
                    echo "create Dockerfile success"
                
            
    

    脚本说明:

    • 在流水线的工作空间创建目录docker-app
    • 每次执行都清空一次docker目录,再把Jar包和Docker脚本放进去;
    • cat-EOF-EOF:即创建Dockerfile文件,并把中间的内容写入;
    • 脚本中的内容必须在文件中顶行写入;

    3、打包推送

    这里即进入docker目录,执行镜像打包的操作,并把镜像推送到云端仓库,很多仓库都是私有的,需要身份验证,通过配置凭据去访问:

    stage(DockerImage)
        steps 
            script 
                dir("$docker_directory") 
                    sh ls
                    docker.withRegistry("$docker_directory", 访问凭据) 
                       docker.build("doc-line-app:latest").push()
                    
                
                echo "build DockerImage success"
            
        
    

    4、凭据配置

    打开Manage Jenkins界面,Manage Credentials选项;

    按如下流程配置即可:


    同系列推荐


    四、源代码地址

    GitEE·地址
    https://gitee.com/cicadasmile/butte-auto-parent
    Wiki·地址
    https://gitee.com/cicadasmile/butte-java-note

    以上是关于自动化集成:Pipeline整合Docker+K8S的主要内容,如果未能解决你的问题,请参考以下文章

    自动化集成:Pipeline整合Docker容器

    Gitlab+Jenkins Pipeline+Docker+k8s+Helm自动化部署实践(干货!)

    Gitlab+Jenkins Pipeline+Docker+k8s+Helm自动化部署实践(干货!)

    在容器中运行 Jenkins pipeline 任务

    Jenkins Pipeline+Docker实现流水线自动化构建(上百个项目共用一个脚本方案)

    手把手搭建jenkins + docker + k8s 持续集成、自动化发布环境