前言
最近看了看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
服務啟動成功。