手把手教你k8s部署springboot服務(wù)
1.前言
在看到此文章之前,想必你已經(jīng)知道如何啟動一個spring boot
應(yīng)用,知道如何通過docker
運(yùn)行你的spring boot
服務(wù)。
你可能會有這樣得疑問,已經(jīng)了解如上部署方式,是否還有必須去了解如何通過k8s
部署spring boot
應(yīng)用?
如果你有這樣的疑問,那么請繼續(xù)往下看。
2.創(chuàng)建SpringBoot應(yīng)用
在介紹k8s
部署spring boot
應(yīng)用之前,我們需要創(chuàng)建一個spring boot
應(yīng)用。
2.1 編寫pom.xml
<?xml version="1.0" encoding="UTF-8"?> ? <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ? ? ? ? xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ? ?<parent> ? ? ? ?<artifactId>boot-example-advance</artifactId> ? ? ? ?<groupId>com.boot.example</groupId> ? ? ? ?<version>1.0-SNAPSHOT</version> ? ?</parent> ? ? ?<modelVersion>4.0.0</modelVersion> ? ?<artifactId>boot-example-docker</artifactId> ? ?<version>1.0-SNAPSHOT</version> ? ? ?<name>boot-example-docker</name> ? ?<url>http://www.example.com</url> ? ? ?<dependencies> ? ? ? ?<dependency> ? ? ? ? ? ?<groupId>org.springframework.boot</groupId> ? ? ? ? ? ?<artifactId>spring-boot-starter-web</artifactId> ? ? ? ?</dependency> ? ?</dependencies> ? ? ?<build> ? ? ? ?<plugins> ? ? ? ? ? ?<plugin> ? ? ? ? ? ? ? ?<groupId>org.springframework.boot</groupId> ? ? ? ? ? ? ? ?<artifactId>spring-boot-maven-plugin</artifactId> ? ? ? ? ? ? ? ?<executions> ? ? ? ? ? ? ? ? ? ?<execution> ? ? ? ? ? ? ? ? ? ? ? ?<goals> ? ? ? ? ? ? ? ? ? ? ? ? ? ?<goal>repackage</goal> ? ? ? ? ? ? ? ? ? ? ? ? ? ?<goal>build-info</goal> ? ? ? ? ? ? ? ? ? ? ? ?</goals> ? ? ? ? ? ? ? ? ? ?</execution> ? ? ? ? ? ? ? ?</executions> ? ? ? ? ? ?</plugin> ? ? ? ?</plugins> ? ?</build> </project>
2.2 編寫程序
@SpringBootApplication @RestController public class DockerApplication { ? ? ? ?@GetMapping("/") ? ?public String home() { ? ? ? ?try { ? ? ? ? ? ?return "Hello Docker World:" + InetAddress.getLocalHost().getHostAddress(); ? ? ? } catch (UnknownHostException e) { ? ? ? ? ? ?return "Hello Docker World"; ? ? ? } ? } ? ? ?public static void main(String[] args) { ? ? ? ?SpringApplication.run(DockerApplication.class, args); ? } }
2.3 應(yīng)用打包
通過mvn clean package -X
命令對該應(yīng)用進(jìn)行打包,執(zhí)行完命令后可以看到target
目錄下生成了一個xxx.jar
的包
3.構(gòu)建鏡像
有了應(yīng)用包,需要編寫Dockerfile
文件將應(yīng)用包構(gòu)建成一個鏡像
3.1 編寫Dockerfile
FROM openjdk:8-jdk-alpine ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
3.2 構(gòu)建鏡像
有了jar
包和Dockerfile
文件就可以使用docker build -t a601942905/app .
命令來構(gòu)建鏡像
3.2.1 查看鏡像是否構(gòu)建成功
構(gòu)建完鏡像
后則可以通過docker images
命令來查看是否存在剛才構(gòu)建的鏡像,存在則說明鏡像
構(gòu)建成功
3.2.2 驗(yàn)證鏡像的正確性
如果本地存在構(gòu)建的鏡像,可以通過docker run --name myapp -p 8080:8080 -d a601942905/app
命令將鏡像
啟動成容器
使用docker ps
命令查看容器是否正常啟動,如果正常啟動,可以通過curl localhost:8080
訪問服務(wù)接口, 正常響應(yīng),則說明鏡像
可以正常使用
3.3 推送鏡像
為了讓k8s
能夠拉取到鏡像,需要將構(gòu)建好的本地鏡像
通過docker push a601942905/app
命令推送到遠(yuǎn)程倉庫
4.k8s
有了鏡像
,就可以使用k8s
來部署服務(wù)
4.1 創(chuàng)建deployment
kubectl create deployment myapp --image=a601942905/app
4.2 創(chuàng)建service
kubectl expose deployment myapp --type=NodePort --port=8080
4.3 訪問服務(wù)
在瀏覽器中輸入ip + 端口即可訪問對應(yīng)的服務(wù)
4.4 服務(wù)擴(kuò)容
kubectl scale --replicas=5 deployment/myapp
擴(kuò)容
之后可以看到同時存在5
個myapp pod
服務(wù),這在實(shí)際場景中是非常有用的。當(dāng)我們的服務(wù)壓力過大、負(fù)載過高時,就可以通過該方式實(shí)現(xiàn)服務(wù)擴(kuò)容,使得服務(wù)可以提供更高的并發(fā)能力,渡過高峰期。
4.5 服務(wù)縮容
kubectl scale --replicas=3 deployment/myapp
過了業(yè)務(wù)高峰期,之前擴(kuò)容的服務(wù)就會存在冗余,造成資源浪費(fèi)??梢酝ㄟ^如上方式實(shí)現(xiàn)服務(wù)縮容,從而達(dá)到服務(wù)降本的目的
4.6 服務(wù)自愈
服務(wù)在運(yùn)行的過程中,由于某些原因會導(dǎo)致pod
故障,從而造成對外提供服務(wù)的數(shù)量減少。在業(yè)務(wù)高峰時期,這種故障的產(chǎn)生可能會拖垮整個服務(wù),從而導(dǎo)致無法對外提供服務(wù)。使用k8s
完全不用擔(dān)心這種故障的發(fā)生,當(dāng)pod
服務(wù)故障后,k8s
會重新啟動一個新pod
服務(wù)
4.7 服務(wù)滾動更新
kubectl set image deploy/myapp app=a601942905/app:latest
服務(wù)發(fā)布后,如果發(fā)布服務(wù)的配置存在問題,導(dǎo)致服務(wù)無法啟動,此時整個應(yīng)用都無法對外提供服務(wù)。滾動更新
會先啟動一個新服務(wù),當(dāng)新服務(wù)啟動后再關(guān)掉一個舊服務(wù),這樣即便服務(wù)由于配置問題無法啟動,也不會影響線上服務(wù),從而提高服務(wù)的slo
4.8 版本回退
kubectl rollout undo deploy/myapp
服務(wù)發(fā)版不可以避免的一個問題:本地、測試環(huán)境測的好好的,一到線上就報錯。遇到這種情況,我們的第一反應(yīng)就是版本回退
,從而讓服務(wù)恢復(fù)到正常狀態(tài)
5.總結(jié)
看到這里,想必你已經(jīng)知道為什么要了解k8s
來部署服務(wù)。因?yàn)?code>k8s可以輕松實(shí)現(xiàn)服務(wù)擴(kuò)容
、服務(wù)縮容
、服務(wù)自愈
、服務(wù)滾動更新
和服務(wù)版本回退
到此這篇關(guān)于手把手教你k8s部署springboot服務(wù)的文章就介紹到這了,更多相關(guān)k8s部署springboot服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)教程之final關(guān)鍵字淺析
這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之final關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06淺談基于SpringBoot實(shí)現(xiàn)一個簡單的權(quán)限控制注解
這篇文章主要介紹了基于SpringBoot實(shí)現(xiàn)一個簡單的權(quán)限控制注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01一文徹底弄懂Java中MultipartFile接口和File類
MultipartFile是一個接口,我們可以理解為是Spring?給我們綁定的一個在使用文件上傳等時簡便實(shí)現(xiàn)的口子,這篇文章主要給大家介紹了關(guān)于如何通過一文徹底弄懂Java中MultipartFile接口和File類的相關(guān)資料,需要的朋友可以參考下2023-11-11Java多線程正確使用倒計(jì)時協(xié)調(diào)器CountDownLatch方法詳解
這篇文章主要為大家介紹了Java多線程倒計(jì)時協(xié)調(diào)器CountDownLatch的正確使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09SpringBoot項(xiàng)目的配置文件中設(shè)置server.port不生效問題
這篇文章主要介紹了SpringBoot項(xiàng)目的配置文件中設(shè)置server.port不生效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11關(guān)于@RequestParam注解的使用(簡單易懂)
這篇文章主要介紹了關(guān)于@RequestParam注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01