目录
1.简介
2.Spring Boot
3.Docker
4.Kubernetes
5.应用更新
6.Q&A
7.参考
本文主要介绍如何利用docker和kubernetes部署Spring Boot项目。
云托管应用,指应用不经过云原生改造,直接利用docker打包镜像,以容器拉起并运行在云环境上的应用,其本质上跟物理机器上安装部署应用没有太大的区别。直接将Spring Boot项目部署到K8S环境,其实就是部署一个云托管应用。
虽然二者本质上没有较大的区别,但是云托管应用部署的规则还需要遵循k8s和docker的规范,其中最重要的是利用docker将Spring Boot工程打包成不可变的镜像,将镜像上传至镜像仓库Harbor,编写k8s的资源文件YAML。最终,kubernetes根据资源文件对应用进行调度、启动、管理。
首先创建一个Spring Boot项目,将其构建成jar包。
在构建好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仓库
镜像是云时代的应用交付模板,在制作镜像后,可以利用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。
编写完deployment、service等资源文件后,kubernetes会根据定义的资源进行应用的管理。在此之后对应用进行更新操作时,只需要替换镜像并更新即可。
如果应用只是进行代码修改,而不进行版本迭代,且deployment中的imagePullPolicy设置为Always,我们可以重新Build镜像、上传至harbor仓库、删除对应的Pod即可,k8s会自动的从Harbor拉取最新的镜像重新启动pod。
1.为什么需要docker?
docker有两个重要作用,第一个是利用dockerfile构建不可变的镜像。第二个是作为容器的运行引擎(这需要视情况而定,kubernetes集群也可以采用其他的容器运行引擎)。
2.为什么需要harbor?
harbor作为一个私有的镜像仓库,提供了集群镜像的统一管理功能,k8s集群中各个节点都可以从harbor中拉取镜像,方便了镜像的分发。
1.Docker官网
2.kubernetes官网