• 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

     服务启动成功。

  • 相关阅读:
    mybatis以序列周期,同样处理的这个问题的价值
    达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面
    采用curl库
    MFC 盾webBrowser打开弹出的页面
    reactnative调研
    React Native通信机制详解
    问题与学习 分析与综合
    学习、概念与概念簇
    奥苏伯尔学习理论
    语言与编程语言
  • 原文地址:https://www.cnblogs.com/csonezp/p/12121448.html
Copyright © 2020-2023  润新知