zoukankan      html  css  js  c++  java
  • 开发阶段,将SpringBoot应用快速部署到K8S

    欢迎访问我的GitHub

    https://github.com/zq2599/blog_demos

    内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

    背景

    1. 对于生产环境,我们一般会用CI&&CD工具完成整个构建和部署,因此本文不适合生产环境;
    2. 对于学习和开发环境,我们频繁修改代码,又想快速见到效果,本文就是针对这种场景的;

    内容简介

    1. 如果您正在开发SpringBoot应用,并且应用部署在K8S环境,可以参考本文将应用快速部署到K8S环境;
    2. 文中SpringBoot的版本是2.3.0.RELEASE,从该版本起,SpringBoot官方推荐了一种新的docker镜像构建方案,如果您是之前的版本,请自行修改文中构建镜像的部分;

    环境信息

    本次实战有两个环境:开发和运行环境,其中开发环境信息如下:

    1. 操作系统:Ubuntu 20.04 LTS 桌面版(同样验证过的还有:MacBook pro 13寸,macOS Catalina 10.15.4)
    2. CPU :2.30GHz × 4,内存:32G,硬盘:1T NVMe
    3. JDK:1.8.0_231
    4. MAVEN:3.6.3
    5. SpringBoot:2.3.0.RELEASE
    6. Docker:19.03.10
    7. 开发工具:IDEA 2020.1.1 (Ultimate Edition)

    运行环境信息如下:

    1. 操作系统:CentOS Linux release 7.8.2003
    2. Kubernetes:1.15

    另外,请在开发环境安装sshpass;

    SpringBoot工程源码

    1. 本次实战用到了一个普通的SpringBoot工程,源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
    名称 链接 备注
    项目主页 https://github.com/zq2599/blog_demos 该项目在GitHub上的主页
    git仓库地址(https) https://github.com/zq2599/blog_demos.git 该项目源码的仓库地址,https协议
    git仓库地址(ssh) git@github.com:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议
    1. 这个git项目中有多个文件夹,本章的应用在probedemo文件夹下,如下图红框所示:
      在这里插入图片描述

    必要的内容

    1. 整个工程是普通SpringBoot工程,除了常见的pom.xml和源码,还多了以下三个文件:
      在这里插入图片描述
    2. Dockerfile文件用来构建docker镜像,如果您的SpringBoot版本为2.3.0.RELEASE或者更高,建议使用SpringBoot官方推荐的镜像构建方式,此Dockerfile可以用来参考;
    3. 和probedemo.yaml文件和您的具体项目有关,请自行修改,确保可以用来部署deployment和service;
    4. auto_deploy.sh是可以快速部署的关键,接下来详细说明;

    auto_deploy.sh详述

    auto_deploy.sh的作用如下:

    1. 调用maven命令编辑构建工程;
    2. 将构建好的jar文件制作成docker镜像;
    3. 将docker镜像导出为tar文件;
    4. 将tar文件上传到K8S服务器;
    5. 将probedemo.yaml文件发送到K8S服务器;
    6. 通过sshpass远程执行命令,将docker镜像导入K8S服务器的本地docker仓库;
    7. 通过sshpass远程执行命令,部署deployment和service;
    8. auto_deploy.sh的完整内容如下:
    #!/bin/bash
    
    # 判断是否安装了sshpass
    if ! [ -x "$(command -v sshpass)" ]; then
      echo '请安装sshpass后再使用此脚本!'
      exit 1
    fi
    
    # 镜像名
    IMAGE_NAME='bolingcavalry/probedemo'
    
    # TAG名
    TAG_NAME='0.0.1'
    
    # 配置了deployment和service的yaml文件名
    DEPLOY_SERVICE_YAML='probedemo.yaml'
    
    # K8S环境的IP地址
    K8S_IP_ADDRESS='192.168.50.135'
    
    # K8S环境的SSH账号
    K8S_SSH_ACCOUNT='root'
    
    # 8S环境的SSH密码
    K8S_SSH_PSWD='888888'
    
    # K8S上存放tar和yaml文件的位置
    K8S_FILE_PATH='~/deploy_temp'
    
    # 当前名目录
    CURRENT_DIR=`pwd`
    
    echo '开始自动构建和部署,当前目录是:'${CURRENT_DIR}
    
    # 执行maven命令构建项目
    mvn clean package -U -DskipTests
    
    echo "构建镜像文件:"${IMAGE_NAME}/${TAG_NAME}
    docker build -t ${IMAGE_NAME}/${TAG_NAME} .
    
    echo "将镜像导出为tar文件:"${IMAGE_NAME}/${TAG_NAME}
    docker save ${IMAGE_NAME}/${TAG_NAME} > ${CURRENT_DIR}/image.tar
    
    echo "在K8S服务器创建存放文件的目录:"${K8S_FILE_PATH}
    sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "mkdir -p ${K8S_FILE_PATH}"
    
    echo "将yaml文件发送到K8S服务器:"${IMAGE_NAME}/${TAG_NAME}
    sshpass -p ${K8S_SSH_PSWD} scp ${CURRENT_DIR}/${DEPLOY_SERVICE_YAML} ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS}:${K8S_FILE_PATH}/
    
    echo "将镜像tar文件发送到K8S服务器:"${IMAGE_NAME}/${TAG_NAME}
    sshpass -p ${K8S_SSH_PSWD} scp ${CURRENT_DIR}/image.tar ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS}:${K8S_FILE_PATH}/
    
    echo "如果K8S环境之前已经部署过,就先清理:"${IMAGE_NAME}/${TAG_NAME}
    sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "kubectl delete -f ${K8S_FILE_PATH}/${DEPLOY_SERVICE_YAML}"
    
    echo "等待10秒"
    sleep 10
    
    echo "清理之前加载到本地仓库的镜像:"${IMAGE_NAME}/${TAG_NAME}
    sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "docker rmi ${IMAGE_NAME}/${TAG_NAME}"
    
    echo "从tar文件加载镜像:"${IMAGE_NAME}/${TAG_NAME}
    sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "docker load < ${K8S_FILE_PATH}/image.tar"
    
    echo "部署:"${IMAGE_NAME}/${TAG_NAME}
    sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "kubectl apply -f ${K8S_FILE_PATH}/${DEPLOY_SERVICE_YAML}"
    
    echo "删除tar文件:"${CURRENT_DIR}/image.tar
    rm -rf ${CURRENT_DIR}/image.tar
    
    echo "删镜像:"${IMAGE_NAME}/${TAG_NAME}
    docker rmi ${IMAGE_NAME}/${TAG_NAME}
    

    实验

    1. 请按照自己的实际情况,修改auto_deploy.sh中变量的值,例如K8S环境地址、账号密码等;
    2. 开发阶段,修改java代码完成;
    3. 执行脚本auto_deploy.sh;
    4. 控制台提示如下:
      在这里插入图片描述
    5. 部署已经完成,可以验证功能了;

    注意事项

    本次实战更新镜像的方法是本地导出为tar,再传到K8S环境去导入,当K8S环境有多台机器时就不适合这样作了,建议使用私有镜像仓库,将镜像push到仓库,然后K8S中镜像仓库pull镜像;

    至此,SpringBoot应用快速部署到K8S的实战就完成了,这是我开发过程中常用的远程部署手段,希望能给您提供一些参考;

    你不孤单,欣宸原创一路相伴

    1. Java系列
    2. Spring系列
    3. Docker系列
    4. kubernetes系列
    5. 数据库+中间件系列
    6. DevOps系列

    欢迎关注公众号:程序员欣宸

    微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
    https://github.com/zq2599/blog_demos

  • 相关阅读:
    Node.js 学习笔记(二)
    微服务网关 zuul 替代者 gateway 网关路由
    flowable 6.6.0 绕过自带的登录限制(免登录)
    `flowable.common.app.idmurl` must be set (flowable 6.6.0)
    gateway 跨域问题解决方案
    ueditor 在springboot 打jar运行时 找不到图片附件路径问题
    springboot 打jar 包部署时 读取外部配置文件
    Navicat连接MySQL Server8.0版本时出现Client does not support authentication protocol requested by server;解决如下
    flowable 通过模型model ID部署流程
    springboot 配置日志输出
  • 原文地址:https://www.cnblogs.com/bolingcavalry/p/14142009.html
Copyright © 2011-2022 走看看