Spring Boot + Docker + K8S 簡單示例


前言

最近看了看kubernetes(k8s),感覺用這個管理docker確實比自己寫一坨腳本進步太多了,簡直不是一個次原的東西。

看着k8s的官方文檔隨手寫了個小Demo,一個基於k8s的spring boot服務。

代碼:https://github.com/csonezp/echo-service

 

前置條件

電腦已安裝docker/k8s/jdk

建議安裝Docker Desktop,並啟用自帶k8s。

 

https://docs.docker.com/docker-for-mac/install/

https://github.com/gotok8s/k8s-docker-desktop-for-mac

 

上面是Mac的安裝方法,linux可以在鏈接里找到。

 

項目結構

 

 

 

根本上還是一個spring boot項目,只是添加了一些docker/k8s的配置文件,和一些編譯、運行腳本。

 

Spring Boot服務構建

這就是一個最簡單的spring boot服務,主要代碼:

/**
 * @author : zhangpeng
 * @date : 2019/12/27 14:57
 */
@RestController
public class EchoController {

    @GetMapping("/echo")
    public String echo(@RequestParam(required = false,defaultValue = "Hello World!") String data){
        return data;
    }
}

就提供一個rest接口用來表示服務已經啟動了。

為了適配docker,pom文件做了一些修改:

<build>
        <finalName>echo-service</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

標紅的這一行,讓spring boot打出來的jar包里不帶版本號。實際上在生產中是不應該這樣做的,這里就是為了簡單方便。

 

Docker鏡像構建

為了運行spring boot程序,我們需要一個帶Java環境的基礎鏡像。

FROM centos:centos7
MAINTAINER "Zhang Peng <csonezp@gmail.com>"
LABEL description="Base Image Java 8"

RUN yum -y install java-1.8.0-openjdk && mkdir /app

 

 

然后執行一下:

docker build -f centos7-openjdk8.Dockerfile -t openjdk8:v1 .

打出一個名為 openjdk8:v1的鏡像。

這個Dockerfile意思就是鏡像基於centos7,一開始會執行一下jdk的安裝,並創建一個/app的目錄供我們以后使用。

 

基礎鏡像有了,現在就要制作我們的服務鏡像了

FROM openjdk8:v1
MAINTAINER "Zhang Peng <csonezp@gmail.com>"
LABEL description="Spring Boot Image"
WORKDIR /app
COPY target/echo-service.jar /app/app.jar
EXPOSE 8080
CMD java -jar /app/app.jar

 

docker build -f Dockerfile -t echo-service:0.0.1 .

這個Dockerfile會基於openjdk8:v1這個鏡像構建,主要做的操作就是將我們spring boot打出來的jar包:echo-service.jar復制到/app/app.jar,然后再執行這個jar包。

 

k8s配置

docker鏡像准備完畢,下面要編寫一個k8s的配置文件,來告訴k8s該如何運行和管理我們的服務了。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: echo-service
spec:
  replicas: 2 # tells deployment to run 2 pods matching the template
  template: # create pods using pod definition in this template
    metadata:
      labels:
        app: echo-service
    spec:
      containers:
        - name: echo-service
          image: echo-service:0.0.1
          ports:
            - containerPort: 8080

Deployment是k8s的一種常用控制器(點我),可以告訴k8s如何運行你的服務。

這個文件的意思就是會有一個服務,有兩個分片,名字叫echo-service,使用的鏡像是echo-service:0.0.1,會對外暴露8080的接口提供服務。

 

腳本部分

build-img.sh

#!/bin/bash
mvn package -Dmaven.test.skip=true
docker build -f centos7-openjdk8.Dockerfile -t openjdk8:v1 .
docker build -f Dockerfile -t echo-service:0.0.1 .

首先對spring boot項目進行打包,這時會在./target目錄下生成echo-service.jar;

然后根據centos7-openjdk8.Dockerfile 來構建openjdk8:v1這個基礎鏡像;

最后構建echo-service:0.0.1鏡像。

run.sh

kubectl create -f k8s.yaml
kubectl expose deployment echo-service --type="LoadBalancer"

1、創建k8s的pods;

2、將Deployment對外暴露

 

運行

進入項目根目錄,先執行:

sh build-img.sh

 

 

再執行:

sh run.sh

 

 此時服務已經正常啟動。

瀏覽器訪問:http://localhost:8080/echo

 

 服務啟動成功。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM