Docker+K8s 部署Spring Boot项目

目录

1.简介

2.Spring Boot

3.Docker

4.Kubernetes

5.应用更新

6.Q&A

7.参考


1.简介

本文主要介绍如何利用docker和kubernetes部署Spring Boot项目。

云托管应用,指应用不经过云原生改造,直接利用docker打包镜像,以容器拉起并运行在云环境上的应用,其本质上跟物理机器上安装部署应用没有太大的区别。直接将Spring Boot项目部署到K8S环境,其实就是部署一个云托管应用。

虽然二者本质上没有较大的区别,但是云托管应用部署的规则还需要遵循k8s和docker的规范,其中最重要的是利用docker将Spring Boot工程打包成不可变的镜像,将镜像上传至镜像仓库Harbor,编写k8s的资源文件YAML。最终,kubernetes根据资源文件对应用进行调度、启动、管理。


2.Spring Boot

首先创建一个Spring Boot项目,将其构建成jar包。

Docker+K8s 部署Spring Boot项目_第1张图片


3.Docker

在构建好Spring Boot项目后,可直接部署到物理机器。但是要作为一个云托管应用,还需要进一步的改造。第一步是制作镜像,推荐使用dockerfile,便于阅读和传输。

FROM openjdk:8-jre-alpine
COPY demo-0.0.1-SNAPSHOT.jar /app/demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/app/demo-0.0.1-SNAPSHOT.jar"]

编写完dockerfile后,可以直接在当前目录下进行制作

docker build . -t harbor.com/library/demo:latest

'.' 指代当前目录,harbor.com是私有的harbor仓库域名,demoe:latest是该镜像的名称和标签

docker push harbor.com/library/demo:latest

该指令将该镜像上传至harbor仓库  


4.Kubernetes

镜像是云时代的应用交付模板,在制作镜像后,可以利用docker运行容器,但是这种方式不具备应用管理功能、也不能便捷的扩缩容,因此我们还需要k8s来管理应用容器。kubernetes定义了一组资源secret、configMap、deployment、replicaSet、service、pod,用来描述云中的容器、应用、安全、配置。本文主要使用的是deployment和service。

deployment:deployment是对动作的描述,其中的动作包含了pod的启动、删除、滚动更新、回滚、扩容、缩容。

service   :service是对网络的描述,其配置了k8s中pod之间的ip、代理,还可以通过nodePort的方式暴露集群内部网络。

doployment.yaml

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: deploydemo
  labels:
    apps: deploydemo
spec:
  replicas: 2
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: deploydemo
  template:
    metadata:
      labels:
        app: deploydemo
    spec:
      restartPolicy: Always
      containers:
      - name: deploydemo
        image: harbor.com/library/deploydemo:latest
        ports:
        - containerPort: 8080
          protocol: TCP
        imagePullPolicy: Always

service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: deploydemo
  labels:
    app: deploydemo
spec:
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    app: deploydemo

 编写完deployment和service资源文件后,利用kubectl apply -f deployment.yaml -f service.yaml 指令即可在default命名空间下完成部署。需要编写详细的资源文件可参考deployment、service。


5.应用更新

编写完deployment、service等资源文件后,kubernetes会根据定义的资源进行应用的管理。在此之后对应用进行更新操作时,只需要替换镜像并更新即可。

如果应用只是进行代码修改,而不进行版本迭代,且deployment中的imagePullPolicy设置为Always,我们可以重新Build镜像、上传至harbor仓库、删除对应的Pod即可,k8s会自动的从Harbor拉取最新的镜像重新启动pod。


6.Q&A

1.为什么需要docker?

docker有两个重要作用,第一个是利用dockerfile构建不可变的镜像。第二个是作为容器的运行引擎(这需要视情况而定,kubernetes集群也可以采用其他的容器运行引擎)。

2.为什么需要harbor?

harbor作为一个私有的镜像仓库,提供了集群镜像的统一管理功能,k8s集群中各个节点都可以从harbor中拉取镜像,方便了镜像的分发。


7.参考

1.Docker官网

2.kubernetes官网

 

 

 

 

 

 

你可能感兴趣的:(kubernetes,spring,boot,docker)