前言
在上文
【從入門到放棄-Kubernetes】Kubernetes入門-部署MySQL中,我們學習了如何部署MySQL,本文我們将基于上文中的内容,學習如何部署SpringBoot應用,并調用我們部署好的MySQL服務。
SpringBoot鏡像準備
我們可以參考前面
【從入門到放棄-Kubernetes】Kubernetes入門-應用部署中建構代碼鏡像的方式。
有差別的地方是nodejs中的server.js源碼可以直接運作,而java需要多一步編譯打包的動作。
你也可以直接用我打好的鏡像:registry.cn-hangzhou.aliyuncs.com/larswang/springboot-demo:2.0,跳過這一步,直接看後面的【部署服務】章節。
準備源碼
首先需要有SpringBoot項目源代碼,這裡使用的是我的一個demo。裡面隻做了簡單的對MySQL資料庫增删改查的動作,并對外提供了http操作接口,友善我們驗證。
源碼在:
https://github.com/AloofJr/springboot-demo打包
我們知道SpringBoot都是以fat jar的方式運作。
源碼在開發環境測試沒問題後,就可以開始準備打包了。
這裡我用的maven直接打包
mvn clean && mvn package -e -X
正常運作無報錯後,你會看到 ./target/目錄下生成了 demo-0.0.1-SNAPSHOT.jar 檔案,這就是我們打包後執行用的SpringBoot fat jar。
注意:
- 其實可以将打包的流程放在Dockerfile中,但是因為網絡等原因,速度非常慢,且容易出現pom依賴下載下傳不下來,導緻打包失敗的情況。
- 這裡我直接在本地打包好,跟随源檔案一起上傳了。
- 我們在标準的開發流程中,也為了節省時間,也通常是先将項目獨立編譯打包好後,直接使用打包好的jar檔案進行部署的。
Dockerfile
# 基于openjdk基礎鏡像
FROM openjdk:8-jdk-alpine
# 添加bash指令
RUN apk add --no-cache bash
# copy jar檔案
COPY ./target/demo-0.0.1-SNAPSHOT.jar /home/admin/myapp/
# 進入工作目錄
WORKDIR /home/admin/myapp/
# 暴露8080端口
EXPOSE 8080
# 運作jar,啟動服務
CMD ["java", "-jar", "demo-0.0.1-SNAPSHOT.jar"]
這裡我們基于openjdk:8-jdk-alpine鏡像建構,dockerfile寫好後,可以先在本地使用如下指令建構、啟動測試一下。
# build docker image
docker build -t springboot-demo .
# run
docker run -it -p 8080:8080 --rm --name my-running-demo springboot-demo
通路
http://127.0.0.1:8080/出現404頁面就說明鏡像建構沒問題了。
将dockerfile放在源代碼倉庫的根目錄,如
參考
建構鏡像,将鏡像在阿裡雲鏡像服務倉庫中建構并上傳。
部署服務
準備MySQL服務
部署服務前,請保證k8s叢集中,MySQL服務是啟動的,如果沒啟動,請參考
部署。
在MySQL的主庫中,準備我們demo中要用到的資料庫及表結構。
# 進入MySQL主庫的pod
kubectl exec -it mysql-0 bash
# 通過用戶端連接配接
mysql -uroot -p
導入
demo.sqlCREATE DATABASE IF NOT EXISTS `test` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE test;
CREATE TABLE IF NOT EXISTS `users` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
`userName` varchar(32) DEFAULT NULL COMMENT '使用者名',
`passWord` varchar(32) DEFAULT NULL COMMENT '密碼',
`user_sex` varchar(32) DEFAULT NULL,
`nick_name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

這裡要特别注意,因為我們的MySQL服務,在K8s叢集中,提供服務的service名稱為mysql,是以要注意下我們SpringBoot項目連接配接MySQL服務的位址和賬号密碼,避免連接配接失敗導緻無法讀寫。如果你使用的是自己的MySQL服務,請記得修改 application.properties 檔案。
Deployment
SpringBoot服務是無狀态的,我們采用Deployment的方式部署。yaml檔案如下。
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-deployment
labels:
app: springboot
spec:
replicas: 2
selector:
matchLabels:
app: springboot
template:
metadata:
labels:
app: springboot
spec:
containers:
- name: springboot
image: registry.cn-hangzhou.aliyuncs.com/larswang/springboot-demo:2.0
ports:
- containerPort: 8080
apply
kubectl apply -f springboot.yaml
kubectl get pods
檢視pod狀态,直到MySQL和SpringBoot服務都準備就緒
對外暴露服務
kubectl expose deployment springboot-deployment --name=my-springboot --type=LoadBalancer
minikube tunnel
通路服務
此時通路
出現404頁面就說明,我們的服務已經ready了。(因為我們的demo中,沒有設定預設index頁面,是以直接通路會404)
寫入資料
http://127.0.0.1:8080/addUsers,是我們demo中,寫入mock資料的接口。傳回true。
此時檢視資料庫記錄。
讀取資料
http://127.0.0.1:8080/getUsersByCondition?id=3,傳回資料庫中的結果。
總結
本文,我們學習了SpringBoot項目的打包和建構鏡像,以及如何和MySQL服務部署在同一個k8s叢集中,并正常通路MySQL服務的。
操作中如果遇到問題,可以回過頭翻看下之前的系列文章,值得注意的是,在SpringBoot項目中,連結MySQL用的host,一定要是service名,而不是pod名,k8s是通過service提供服務的。我在操作的時候,就因為這個點,使用了pod名mysql-0,就一直通路不通,浪費了較多時間。
至此,我們學習了無狀态應用、有狀态應用 以及 無狀态應用和有狀态應用組合部署。應該對k8s的基礎用法有了比較清晰的認識。希望大家能多實際操作,多練。
更多文章
見我的部落格:
https://nc2era.comwritten by
AloofJr,轉載請注明出處