開發階段,將SpringBoot應用快速部署到K8S

  • 2020 年 12 月 16 日
  • 筆記

歡迎訪問我的GitHub

//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下載到,地址和鏈接資訊如下表所示(//github.com/zq2599/blog_demos):
名稱 鏈接 備註
項目主頁 //github.com/zq2599/blog_demos 該項目在GitHub上的主頁
git倉庫地址(https) //github.com/zq2599/blog_demos.git 該項目源碼的倉庫地址,https協議
git倉庫地址(ssh) [email protected]: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世界…
//github.com/zq2599/blog_demos