Kubernetes Docker 中部署 Spring Boot 或者 Java 应用_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Kubernetes Docker 中部署 Spring Boot 或者 Java 应用

Kubernetes Docker 中部署 Spring Boot 或者 Java 应用

 2019/8/30 15:34:04  wpp65  程序员俱乐部  我要评论(0)
  • 摘要:简介本文档介绍如何将SpringBoot或者JavaWeb应用通过Docker部署到Kubernetes集群。相关环境安装及准备本文不做介绍本文中Kubernets集群有两个节点192.168.210.128master192.168.210.129minion-1部署流程为1.打包应用2.Push应用3.部署应用4.发布服务相关技术介绍Kubernetes(kubelet,kubeadm,kubectl)DockerJDKMavenDockerfileMaven创建应用可以到http
  • 标签:net Java Spring 应用
简介
本文档介绍如何将Spring Boot 或者 Java Web 应用通过 Docker 部署到Kubernetes 集群。

相关环境安装及准备本文不做介绍

本文中Kubernets 集群有两个节点
192.168.210.128 master
192.168.210.129 minion-1

部署流程为
1. 打包应用
2. Push 应用
3. 部署应用
4. 发布服务




相关技术介绍
Kubernetes(kubelet,kubeadm,kubectl)
Docker
JDK
Maven
Dockerfile Maven


创建应用

可以到 http://start.spring.io/ 创建一个SpringBoot 的应用,在创建的时候,请选择Web 依赖,以方便部署到 Kubernetes 之后可以查看效果。




修改打包方式JAR为WAR
Spring Boot 应用默认打包方式为 jar,本示例为了演示如何在Tomcat中部署,需要将打包方式修改为war。
修改pom.xml文件
class="java"><groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>demo</name>
<description>Demo project for Spring Boot</description>


修改应用
修改Spring Boot 应用的 main 函数所在的类,使DemoApplication继承 SpringBootServletInitializer,这样可以演示如何以Java Web(Tomcat)方式来部署应用。添加RestController和RequestMapping方便后续查看部署结果。

@SpringBootApplication
@RestController
public class DemoApplication extends SpringBootServletInitializer {

   @RequestMapping("/")
   public String home() {
      return "Hello Docker World";
   }

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}


验证应用
启动Spring Boot 应用,浏览器访问 http://localhost:8080/




打包Docker Image
添加Dockerfile Maven 依赖
修改pom.xml, 添加Dockerfile Maven 依赖。
dockerfile-maven-plugin 用于打包和上传 Docker Image。
<!-- tag::plugin[] -->
<plugin>
   <groupId>com.spotify</groupId>
   <artifactId>dockerfile-maven-plugin</artifactId>
   <version>1.3.6</version>
   <configuration>
      <repository>example/${project.artifactId}</repository>
      <buildArgs>
         <WAR_FILE>target/${project.build.finalName}.war</WAR_FILE>
      </buildArgs>
   </configuration>
</plugin>
<!-- end::plugin[] -->


Dockerfile Spring Boot 方式
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG WAR_FILE
COPY ${WAR_FILE} app.war
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.war"]

Dockerfile Tomcat 方式
FROM tomcat:8
ARG WAR_FILE
COPY ${WAR_FILE} /usr/local/tomcat/webapps/app.war
CMD ["catalina.sh", "run"]


使用Maven build 应用
[root@localhost ~]# mvn clean install

使用dockerfile-maven-plugin打包并上传Docker镜像

[root@localhost ~]# mvn dockerfile:build

Spring Boot 方式



Java Web(Tomcat)方式




Image 上传完成后run image查看结果
[root@localhost ~]# docker images





[root@localhost ~]# docker run -p 8080:8080 -t example/demo


Spring Boot 方式访问
http://192.168.210.128:8080/



Java Web(Tomcat)方式访问
http://192.168.210.128:8080/



http://192.168.210.128:8080/app/



删除Container
根据 Container ID 先停止 Container,然后再删除 Container。
[root@localhost ~]# docker stop container_id


[root@localhost ~]# docker rm container_id

删除Image
根据Image ID 删除 Image
[root@localhost ~]# docker rmi image_id


部署Docker Image到Kubernetes

创建YAML文件
创建Kubernetes部署文件example-demo.yaml,其中包括deployment和service

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: example-demo
  labels:
    app: example-demo
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: example-demo
  template:
    metadata:
      labels:
        app: example-demo
    spec:
      containers:
      - name: example-demo
        image: example/demo:latest
        ports:
        - containerPort: 8080
          protocol: TCP
        livenessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 30
          timeoutSeconds: 30
        imagePullPolicy: IfNotPresent
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule

---
apiVersion: v1
kind: Service
metadata:
  name: example-demo
  labels:
    app: example-demo
spec:
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    app: example-demo
  type: NodePort


部署Docker Image
[root@localhost ~]# kubectl create -f example-demo.yaml




查看Pod状态
[root@localhost ~]# kubectl get pods




[root@localhost ~]# kubectl describe pod example-demo-85fbc4b89d-rq8sr




查看Service
[root@localhost ~]# kubectl get services




[root@localhost ~]# kubectl describe service example-demo




验证部署结果




  • 大小: 50 KB
  • 大小: 57 KB
  • 大小: 6.8 KB
  • 大小: 38.7 KB
  • 大小: 31.1 KB
  • 大小: 4.1 KB
  • 大小: 8.1 KB
  • 大小: 45 KB
  • 大小: 8.5 KB
  • 大小: 2.5 KB
  • 大小: 3.5 KB
  • 大小: 75.8 KB
  • 大小: 4.2 KB
  • 大小: 11.6 KB
  • 大小: 8.4 KB
  • 查看图片附件
发表评论
用户名: 匿名