乐趣区

关于云计算:开发阶段将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/blo…:
名称 链接 备注
我的项目主页 https://github.com/zq2599/blo… 该我的项目在 GitHub 上的主页
git 仓库地址 (https) https://github.com/zq2599/blo… 该我的项目源码的仓库地址,https 协定
git 仓库地址 (ssh) git@github.com:zq2599/blog_demos.git 该我的项目源码的仓库地址,ssh 协定
  1. 这个 git 我的项目中有多个文件夹,本章的利用在 <font color=”blue”>probedemo</font> 文件夹下,如下图红框所示:

必要的内容

  1. 整个工程是一般 SpringBoot 工程,除了常见的 pom.xml 和源码,还多了以下三个文件:

  1. Dockerfile 文件用来构建 docker 镜像,如果您的 SpringBoot 版本为 2.3.0.RELEASE 或者更高,倡议应用 SpringBoot 官网举荐的镜像构建形式,此 Dockerfile 能够用来参考;
  2. 和 probedemo.yaml 文件和您的具体我的项目无关,请自行批改,确保能够用来部署 deployment 和 service;
  3. 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. 控制台提醒如下:

  1. 部署曾经实现,能够验证性能了;

注意事项

本次实战更新镜像的办法是本地导出为 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

退出移动版