天天看點

教你使用k8s來部署springboot服務

作者:晾幹的紅領巾

1.前言

在看到此文章之前,想必你已經知道如何啟動一個spring boot應用,知道如何通過docker運作你的spring boot服務。

你可能會有這樣得疑問,已經了解如上部署方式,是否還有必須去了解如何通過k8s部署spring boot應用?

如果你有這樣的疑問,那麼請繼續往下看。

2.建立SpringBoot應用

在介紹k8s部署spring boot應用之前,我們需要建立一個spring boot應用。

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 應用打包

通過mvn clean package -X指令對該應用進行打包,執行完指令後可以看到target目錄下生成了一個xxx.jar的包

3.建構鏡像

有了應用包,需要編寫Dockerfile檔案将應用包建構成一個鏡像

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 建構鏡像

有了jar包和Dockerfile檔案就可以使用docker build -t a601942905/app .指令來建構鏡像

3.2.1 檢視鏡像是否建構成功

建構完鏡像後則可以通過docker images指令來檢視是否存在剛才建構的鏡像,存在則說明鏡像建構成功

3.2.2 驗證鏡像的正确性

如果本地存在建構的鏡像,可以通過docker run --name myapp -p 8080:8080 -d a601942905/app指令将鏡像啟動成容器

使用docker ps指令檢視容器是否正常啟動,如果正常啟動,可以通過curl localhost:8080通路服務接口, 正常響應,則說明鏡像可以正常使用

3.3 推送鏡像

為了讓k8s能夠拉取到鏡像,需要将建構好的本地鏡像通過docker push a601942905/app指令推送到遠端倉庫

4.k8s

有了鏡像,就可以使用k8s來部署服務

4.1 建立deployment

kubectl create deployment myapp --image=a601942905/app
複制代碼           

4.2 建立service

kubectl expose deployment myapp --type=NodePort --port=8080
複制代碼           

4.3 通路服務

教你使用k8s來部署springboot服務

在浏覽器中輸入ip + 端口即可通路對應的服務

4.4 服務擴容

kubectl scale --replicas=5 deployment/myapp
複制代碼           
教你使用k8s來部署springboot服務

擴容之後可以看到同時存在5個myapp pod服務,這在實際場景中是非常有用的。當我們的服務壓力過大、負載過高時,就可以通過該方式實作服務擴容,使得服務可以提供更高的并發能力,渡過高峰期。

4.5 服務縮容

kubectl scale --replicas=3 deployment/myapp
複制代碼           
教你使用k8s來部署springboot服務

過了業務高峰期,之前擴容的服務就會存在備援,造成資源浪費。可以通過如上方式實作服務縮容,進而達到服務降本的目的

4.6 服務自愈

教你使用k8s來部署springboot服務

服務在運作的過程中,由于某些原因會導緻pod故障,進而造成對外提供服務的數量減少。在業務高峰時期,這種故障的産生可能會拖垮整個服務,進而導緻無法對外提供服務。使用k8s完全不用擔心這種故障的發生,當pod服務故障後,k8s會重新啟動一個新pod服務

4.7 服務滾動更新

kubectl set image deploy/myapp app=a601942905/app:latest
複制代碼           
教你使用k8s來部署springboot服務

服務釋出後,如果釋出服務的配置存在問題,導緻服務無法啟動,此時整個應用都無法對外提供服務。滾動更新會先啟動一個新服務,當新服務啟動後再關掉一個舊服務,這樣即便服務由于配置問題無法啟動,也不會影響線上服務,進而提高服務的slo

4.8 版本回退

kubectl rollout undo deploy/myapp
複制代碼           
教你使用k8s來部署springboot服務

服務發版不可以避免的一個問題:本地、測試環境測的好好的,一到線上就報錯。遇到這種情況,我們的第一反應就是版本回退,進而讓服務恢複到正常狀态

5.總結

看到這裡,想必你已經知道為什麼要了解k8s來部署服務。因為k8s可以輕松實作服務擴容、服務縮容、服務自愈、服務滾動更新和服務版本回退

繼續閱讀