简介
本文档介绍如何将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继承 SpringBoot
ServletInitializer,这样可以演示如何以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
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
验证部署结果