前言

最近看了看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. .

首先对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

服务启动成功。

Spring Boot + Docker + K8S 简单示例的更多相关文章

  1. spring boot 结合jsp简单示例

    引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  2. Spring Boot 2.x 综合示例-整合thymeleaf、mybatis、shiro、logging、cache开发一个文章发布管理系统

    一.概述 经过HelloWorld示例(Spring Boot 2.x 快速入门(上)HelloWorld示例)( Spring Boot 2.x 快速入门(下)HelloWorld示例详解)两篇的学 ...

  3. Spring Boot Docker 实战

    Spring Boot Docker 开发环境 开发工具: Intellij IDEA 2018.2.6 springboot: 2.0.6.RELEASE jdk: 1.8.0_192 maven: ...

  4. Spring Boot Ftp Client 客户端示例支持断点续传

    本章介绍 Spring Boot 整合 Ftpclient 的示例,支持断点续传 本项目源码下载 1 新建 Spring Boot Maven 示例工程项目 注意:是用来 IDEA 开发工具 File ...

  5. SpringCloud微服务实战——搭建企业级开发框架(四十四):【微服务监控告警实现方式一】使用Actuator + Spring Boot Admin实现简单的微服务监控告警系统

      业务系统正常运行的稳定性十分重要,作为SpringBoot的四大核心之一,Actuator让你时刻探知SpringBoot服务运行状态信息,是保障系统正常运行必不可少的组件.   spring-b ...

  6. Spring Boot 系列 - WebSocket 简单使用

    在实现消息推送的项目中往往需要WebSocket,以下简单讲解在Spring boot 中使用 WebSocket. 1.pom.xml 中引入 spring-boot-starter-websock ...

  7. spring boot docker 初尝试

    Docker服务中进程间通信通过/var/run/docker.sock实现,默认服务不提供监听端口,因此使用docker remote api 需要手动绑定端口. 在centos7.2下,可以进行这 ...

  8. Spring Boot的Servlet简单使用

    当使用spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet.Filter和Servlet规范的所有监听器(如HttpSessionListener监听器). Spri ...

  9. 对Spring Boot 及Mybatis简单应用

    因为没有系统的学习过SpringBoot,在对照一个别人的SpringBoot项目,进行简单的搭建及使用. 1.首先创建SpringBoot项目之后,这里会有默认的启动类,基本不需要配置,在类的上边有 ...

随机推荐

  1. APP UI设计趋势:为好设计而动

    http://www.cocoachina.com/design/20150703/12029.html 作者:bone9 善心悦目的动效已然成为一个app的必备,作为设计师自然要跟随趋势学习.APP ...

  2. Datagrid添加右键菜单 标签: 三层EasyUI 2015-08-14 19:57 1029人阅读 评论(22)

    最近的一个项目前台使用的EasyUI,每个界面都有DataGrid控件,按照我们的想法,应该做出来的效果是单击选中,双击可编辑,当然右键也应该出现这些菜单按钮,想的挺好,那么该如何实现呢?一开始不知道 ...

  3. Nacos Committer 张龙:Nacos Sync 的设计原理和规划

    图:Nacos Meetup @杭州 与你同行,抬头便是星空. 本文整理自Nacos Committer 张龙的现场分享,阿里巴巴中间件受权发布. 随着 Nacos 1.0.0 稳定版的发布,越来越多 ...

  4. @atcoder - AGC035F@ Two Histograms

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N*M 的方格,我们通过以下步骤往里面填数: (1)将 ...

  5. Celery后台任务

    Celery 在程序运行过程中,经常会遇到一些耗时耗资源的任务,为了避免这些任务阻塞主进程的运行,我们会采用多线程或异步任务去处理.比如在Web中需要对新注册的用户发一封激活邮件来验证账户,而发邮件本 ...

  6. 创建我的flask第一个应用(二)

    继上一篇创建我的flask第一个应用(一),继续学习配置flask 在myproject未提供flask默认运行的主程序文件"wsgi.py"或"app.py" ...

  7. WebSocket 实时更新mysql数据到页面

    使用websocket的初衷是,要实时更新mysql中的报警信息到web页面显示 没怎么碰过web,代码写的是真烂,不过也算是功能实现了,放在这里也是鞭策自己,web也要多下些功夫 准备 引入依赖 & ...

  8. oracle函数 nls_charset_id(c1)

    [功能]返回字符集名称参应id值 [参数]c1,字符型 [返回]数值型 sql> select nls_charset_id('zhs16gbk') from dual; nls_charset ...

  9. SDUT-2054_数据结构实验之链表九:双向链表

    数据结构实验之链表九:双向链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 学会了单向链表,我们又多了一种解决问题的 ...

  10. LightOJ 1269 Consecutive Sum (Trie树)

    Jan's LightOJ :: Problem 1269 - Consecutive Sum 题意是,求给定序列的中,子序列最大最小的抑或和. 做法就是用一棵Trie树,记录数的每一位是0还是1.查 ...