1. 程式人生 > >開發階段,將SpringBoot應用快速部署到K8S

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

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](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)| [email protected]:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 | 2. 這個git專案中有多個資料夾,本章的應用在probedemo資料夾下,如下圖紅框所示: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202012/485422-20201216083010491-1416173148.png) ### 必要的內容 1. 整個工程是普通SpringBoot工程,除了常見的pom.xml和原始碼,還多了以下三個檔案: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202012/485422-20201216083011269-351386318.png) 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的完整內容如下: ```shell #!/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. 控制檯提示如下: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202012/485422-20201216083012997-474009821.png) 5. 部署已經完成,可以驗證功能了; ### 注意事項 本次實戰更新映象的方法是本地匯出為tar,再傳到K8S環境去匯入,當K8S環境有多臺機器時就不適合這樣作了,建議使用私有映象倉庫,將映象push到倉庫,然後K8S中映象倉庫pull映象; 至此,SpringBoot應用快速部署到K8S的實戰就完成了,這是我開發過程中常用的遠端部署手段,希望能給您提供一些參考; ### 你不孤單,欣宸原創一路相伴 1. [Java系列](https://xinchen.blog.csdn.net/article/details/105068742) 2. [Spring系列](https://xinchen.blog.csdn.net/article/details/105086498) 3. [Docker系列](https://xinchen.blog.csdn.net/article/details/105086732) 4. [kubernetes系列](https://xinchen.blog.csdn.net/article/details/105086794) 5. [資料庫+中介軟體系列](https://xinchen.blog.csdn.net/article/details/105086850) 6. [DevOps系列](https://xinchen.blog.csdn.net/article/details/105086920) ### 歡迎關注公眾號:程式設計師欣宸 > 微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界... [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blo