SpringBoot應(yīng)用快速部署到K8S的詳細(xì)教程
歡迎訪問我的GitHub
https://github.com/zq2599/blog_demos
內(nèi)容:
所有原創(chuàng)文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;
背景
對(duì)于生產(chǎn)環(huán)境,我們一般會(huì)用CI&&CD工具完成整個(gè)構(gòu)建和部署,因此本文不適合生產(chǎn)環(huán)境;對(duì)于學(xué)習(xí)和開發(fā)環(huán)境,我們頻繁修改代碼,又想快速見到效果,本文就是針對(duì)這種場(chǎng)景的;
內(nèi)容簡(jiǎn)介
- 如果您正在開發(fā)SpringBoot應(yīng)用,并且應(yīng)用部署在K8S環(huán)境,可以參考本文將應(yīng)用快速部署到K8S環(huán)境;
- 文中SpringBoot的版本是2.3.0.RELEASE,從該版本起,SpringBoot官方推薦了一種新的docker鏡像構(gòu)建方案,如果您是之前的版本,請(qǐng)自行修改文中構(gòu)建鏡像的部分;
環(huán)境信息
本次實(shí)戰(zhàn)有兩個(gè)環(huán)境:開發(fā)和運(yùn)行環(huán)境,其中開發(fā)環(huán)境信息如下:
- 操作系統(tǒng):Ubuntu 20.04 LTS 桌面版(同樣驗(yàn)證過的還有:MacBook pro 13寸,macOS Catalina 10.15.4)
- CPU :2.30GHz × 4,內(nèi)存:32G,硬盤:1T NVMe
- JDK:1.8.0_231
- MAVEN:3.6.3
- SpringBoot:2.3.0.RELEASE
- Docker:19.03.10
- 開發(fā)工具:IDEA 2020.1.1 (Ultimate Edition)
運(yùn)行環(huán)境信息如下:
- 操作系統(tǒng):CentOS Linux release 7.8.2003
- Kubernetes:1.15
另外,請(qǐng)?jiān)陂_發(fā)環(huán)境安裝sshpass;
SpringBoot工程源碼
本次實(shí)戰(zhàn)用到了一個(gè)普通的SpringBoot工程,源碼可在GitHub下載到,地址和鏈接信息如下表所示(https://github.com/zq2599/blog_demos):
這個(gè)git項(xiàng)目中有多個(gè)文件夾,本章的應(yīng)用在probedemo文件夾下,如下圖紅框所示:
必要的內(nèi)容
整個(gè)工程是普通SpringBoot工程,除了常見的pom.xml和源碼,還多了以下三個(gè)文件:
- Dockerfile文件用來構(gòu)建docker鏡像,如果您的SpringBoot版本為2.3.0.RELEASE或者更高,建議使用SpringBoot官方推薦的鏡像構(gòu)建方式,此Dockerfile可以用來參考;
- 和probedemo.yaml文件和您的具體項(xiàng)目有關(guān),請(qǐng)自行修改,確??梢杂脕聿渴餯eployment和service;
- auto_deploy.sh是可以快速部署的關(guān)鍵,接下來詳細(xì)說明;
auto_deploy.sh詳述
auto_deploy.sh的作用如下:
- 調(diào)用maven命令編輯構(gòu)建工程;
- 將構(gòu)建好的jar文件制作成docker鏡像;
- 將docker鏡像導(dǎo)出為tar文件;
- 將tar文件上傳到K8S服務(wù)器;
- 將probedemo.yaml文件發(fā)送到K8S服務(wù)器;
- 通過sshpass遠(yuǎn)程執(zhí)行命令,將docker鏡像導(dǎo)入K8S服務(wù)器的本地docker倉庫;
- 通過sshpass遠(yuǎn)程執(zhí)行命令,部署deployment和service;
- auto_deploy.sh的完整內(nèi)容如下:
#!/bin/bash # 判斷是否安裝了sshpass if ! [ -x "$(command -v sshpass)" ]; then echo '請(qǐng)安裝sshpass后再使用此腳本!' exit 1 fi # 鏡像名 IMAGE_NAME='bolingcavalry/probedemo' # TAG名 TAG_NAME='0.0.1' # 配置了deployment和service的yaml文件名 DEPLOY_SERVICE_YAML='probedemo.yaml' # K8S環(huán)境的IP地址 K8S_IP_ADDRESS='192.168.50.135' # K8S環(huán)境的SSH賬號(hào) K8S_SSH_ACCOUNT='root' # 8S環(huán)境的SSH密碼 K8S_SSH_PSWD='888888' # K8S上存放tar和yaml文件的位置 K8S_FILE_PATH='~/deploy_temp' # 當(dāng)前名目錄 CURRENT_DIR=`pwd` echo '開始自動(dòng)構(gòu)建和部署,當(dāng)前目錄是:'${CURRENT_DIR} # 執(zhí)行maven命令構(gòu)建項(xiàng)目 mvn clean package -U -DskipTests echo "構(gòu)建鏡像文件:"${IMAGE_NAME}/${TAG_NAME} docker build -t ${IMAGE_NAME}/${TAG_NAME} . echo "將鏡像導(dǎo)出為tar文件:"${IMAGE_NAME}/${TAG_NAME} docker save ${IMAGE_NAME}/${TAG_NAME} > ${CURRENT_DIR}/image.tar echo "在K8S服務(wù)器創(chuàng)建存放文件的目錄:"${K8S_FILE_PATH} sshpass -p ${K8S_SSH_PSWD} ssh ${K8S_SSH_ACCOUNT}@${K8S_IP_ADDRESS} "mkdir -p ${K8S_FILE_PATH}" echo "將yaml文件發(fā)送到K8S服務(wù)器:"${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文件發(fā)送到K8S服務(wù)器:"${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環(huán)境之前已經(jīng)部署過,就先清理:"${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}
實(shí)驗(yàn)
- 請(qǐng)按照自己的實(shí)際情況,修改auto_deploy.sh中變量的值,例如K8S環(huán)境地址、賬號(hào)密碼等;
- 開發(fā)階段,修改java代碼完成;
- 執(zhí)行腳本auto_deploy.sh;
- 控制臺(tái)提示如下:
部署已經(jīng)完成,可以驗(yàn)證功能了;
注意事項(xiàng)
本次實(shí)戰(zhàn)更新鏡像的方法是本地導(dǎo)出為tar,再傳到K8S環(huán)境去導(dǎo)入,當(dāng)K8S環(huán)境有多臺(tái)機(jī)器時(shí)就不適合這樣作了,建議使用私有鏡像倉庫,將鏡像push到倉庫,然后K8S中鏡像倉庫pull鏡像;
至此,SpringBoot應(yīng)用快速部署到K8S的實(shí)戰(zhàn)就完成了,這是我開發(fā)過程中常用的遠(yuǎn)程部署手段,希望能給您提供一些參考;
你不孤單,欣宸原創(chuàng)一路相伴
到此這篇關(guān)于SpringBoot應(yīng)用快速部署到K8S的詳細(xì)教程的文章就介紹到這了,更多相關(guān)SpringBoot部署到K8S內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)簡(jiǎn)單的酒店管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07Java實(shí)現(xiàn)小型圖書館管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)小型圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼+redis限制發(fā)送的次數(shù)功能
這篇文章主要介紹了Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼+redis限制發(fā)送的次數(shù),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04Spring?Data?JPA系列QueryByExampleExecutor使用詳解
這篇文章主要為大家介紹了Spring?Data?JPA系列QueryByExampleExecutor使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09SpringMVC中使用@PathVariable綁定路由中的數(shù)組的方法
這篇文章主要介紹了SpringMVC中使用@PathVariable綁定路由中的數(shù)組的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07