上一篇主要记录了什么是kubernetes的资源编排yaml文件、如何编写yaml文件,并给了一个Hello-world的demo,当然那个只是展示作用,没啥价值。这篇以一个SpringCloud的项目作为例子,记录一下部署到Kubernetes中的全过程。
实战-编写SpringCloud项目的资源编排文档
一个SpringCloud的Demo
为了学习编写这个资源编排文件,我单独写了一个非常简单的SpringCloud程序,由四部分构成:两个Eureka注册中心、一个叫做MailService
的邮箱服务、一个可以用来访问MailService
的客户端--称为MailClient
,下面我一一展示这四个部件的代码,说明功能,然后把他们搬到Kubernetes里面去。
项目结构如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| C:. │ pom.xml │ ├─EntryPoint # 即MailClient │ │ pom.xml │ │ │ ├─src │ │ ├─main │ │ │ ├─java │ │ │ │ └─xidian │ │ │ │ └─lzw │ │ │ │ └─springcloud │ │ │ │ └─service │ │ │ │ └─entrypoint │ │ │ │ │ EntryPointApplication.java │ │ │ │ │ │ │ │ │ ├─client │ │ │ │ │ MailClient.java │ │ │ │ │ │ │ │ │ └─controller │ │ │ │ MailClientController.java │ │ │ │ │ │ │ └─resources │ │ │ application.yml │ ├─Eureka-1 # 即Eureka一号 │ │ pom.xml │ │ │ ├─src │ │ ├─main │ │ │ ├─java │ │ │ │ └─xidian │ │ │ │ └─lzw │ │ │ │ └─springcloud │ │ │ │ └─eureka │ │ │ │ └─eureka1 │ │ │ │ Eureka1Application.java │ │ │ │ │ │ │ └─resources │ │ │ application.yml | ├─Eureka-2 # 即Eureka二号 │ │ pom.xml │ │ │ ├─src │ │ ├─main │ │ │ ├─java │ │ │ │ └─xidian │ │ │ │ └─lzw │ │ │ │ └─springcloud │ │ │ │ └─eureka │ │ │ │ └─eureka2 │ │ │ │ Eureka2Application.java │ │ │ │ │ │ │ └─resources │ │ │ application.yml │ ├─MailService # 即邮箱服务 │ │ pom.xml │ │ │ ├─src │ │ ├─main │ │ │ ├─java │ │ │ │ └─xidian │ │ │ │ └─lzw │ │ │ │ └─springcloud │ │ │ │ └─service │ │ │ │ └─mailservice │ │ │ │ │ MailServiceApplication.java │ │ │ │ │ │ │ │ │ ├─controller │ │ │ │ │ MailController.java │ │ │ │ │ │ │ │ │ └─service │ │ │ │ │ MailService.java │ │ │ │ │ │ │ │ │ └─impl │ │ │ │ GMailServiceImpl.java │ │ │ │ │ │ │ └─resources │ │ │ application.yml
|
这四个组件的关系如下图。本来应该使用一个Zuul网关来统一管理API的,这里换成了使用了OpenFeign的一个接入节点的服务EntryPoint,优点是提供了Ribbon的负载均衡,后续我们只暴露这个容器的端口来供外部访问。
这里不放代码了,关于SpringBoot之前有写过IOC和AOP的文章,感兴趣的兄弟可以翻翻。不过确实SpringBoot和SpringCloud的知识确实我没有单独整理过,有空了整整吧,想看的兄弟们给我写个评论就行。
构建镜像
我们分别对这四部分编写Dockerfile,分别如下所示:
Eureka-1
1 2 3 4
| FROM openjdk:8-jdk-alpine3.9 MAINTAINER lzwgier<float311@163.com> COPY ./target/Eureka-1-0.0.1-SNAPSHOT.jar Eureka-1.jar ENTRYPOINT ["java", "-jar", "Eureka-1.jar", "&"]
|
Eureka-2
1 2 3 4
| FROM openjdk:8-jdk-alpine3.9 MAINTAINER lzwgier<float311@163.com> COPY ./target/Eureka-2-0.0.1-SNAPSHOT.jar Eureka-2.jar ENTRYPOINT ["java", "-jar", "Eureka-2.jar", "&"]
|
MailService
1 2 3 4
| FROM openjdk:8-jdk-alpine3.9 MAINTAINER lzwgier<float311@163.com> COPY ./target/MailService-0.0.1-SNAPSHOT.jar MailService.jar ENTRYPOINT ["java", "-jar", "MailService.jar", "&"]
|
EntryPoint
1 2 3 4
| FROM openjdk:8-jdk-alpine3.9 MAINTAINER lzwgier<float311@163.com> COPY ./target/EntryPoint-0.0.1-SNAPSHOT.jar EntryPoint.jar ENTRYPOINT ["java", "-jar", "EntryPoint.jar", "&"]
|
当然你可以把这四个jar和Dockerfile扔到服务器一个个build并打tag,这里我方便,就直接通过IDEA直接连接并制作镜像,我们在master节点上开启一下Docker对外的2375端口:
vim /lib/systemd/system/docker.service
查看结果,可以看到暴露了2375端口以及可以正常请求到镜像信息了(这里没有开始TLS,为了安全应该启用,这里只是本地开发)
在IDEA里进行配置:
配置每一个应用,这里只展示其中一个,其他同理。这里我们只构建,不运行(创建容器)
当然你也可以添加前置任务,比如构建镜像前重新Maven打包一下,这样你就不用手动一个一个去打包了:
接下来我们就要去构建镜像了,构建之前我有这些镜像:
构建结束后我们就可以看到镜像了:
编写资源编排文档
接下来就是另一个重头戏了,我们来编写部署这四个服务的yaml。其实是可以写到一个文件里面的,但是为了考虑到横向扩容等形式,这里我们一个一个部署。首先我们部署两个Eureka,我们按部就班来:
生成yaml:kubectl create deployment eureka_1 --image=spring-cloud-demo/eureka_1 -o yaml --dry-run=client
上面这个文件是一个deployment,我们手动为其添加service的配置,把这俩粘贴到一起:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| --- apiVersion: apps/v1 kind: Service --- apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: eureka-1 name: eureka-1 spec: replicas: 1 selector: matchLabels: app: eureka_1 strategy: {} template: metadata: creationTimestamp: null labels: app: eureka_1 spec: containers: - image: spring-cloud-demo/eureka_1 name: eureka-1-cg9bp resources: {} ports: - containerPort: 8080 status: {}
|