天天看點

【從入門到放棄-Kubernetes】Kubernetes入門-部署SpringBoot

前言

在上文

【從入門到放棄-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.sql
CREATE 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;           
【從入門到放棄-Kubernetes】Kubernetes入門-部署SpringBoot

這裡要特别注意,因為我們的MySQL服務,在K8s叢集中,提供服務的service名稱為mysql,是以要注意下我們SpringBoot項目連接配接MySQL服務的位址和賬号密碼,避免連接配接失敗導緻無法讀寫。如果你使用的是自己的MySQL服務,請記得修改 application.properties 檔案。

【從入門到放棄-Kubernetes】Kubernetes入門-部署SpringBoot

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服務都準備就緒

【從入門到放棄-Kubernetes】Kubernetes入門-部署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。

此時檢視資料庫記錄。

【從入門到放棄-Kubernetes】Kubernetes入門-部署SpringBoot

讀取資料

http://127.0.0.1:8080/getUsersByCondition?id=3

,傳回資料庫中的結果。

【從入門到放棄-Kubernetes】Kubernetes入門-部署SpringBoot

總結

本文,我們學習了SpringBoot項目的打包和建構鏡像,以及如何和MySQL服務部署在同一個k8s叢集中,并正常通路MySQL服務的。

操作中如果遇到問題,可以回過頭翻看下之前的系列文章,值得注意的是,在SpringBoot項目中,連結MySQL用的host,一定要是service名,而不是pod名,k8s是通過service提供服務的。我在操作的時候,就因為這個點,使用了pod名mysql-0,就一直通路不通,浪費了較多時間。

至此,我們學習了無狀态應用、有狀态應用 以及 無狀态應用和有狀态應用組合部署。應該對k8s的基礎用法有了比較清晰的認識。希望大家能多實際操作,多練。

更多文章

見我的部落格:

https://nc2era.com

written by

AloofJr

,轉載請注明出處