f10@t's blog

Kubernetes-集群环境搭建使用及问题记录(三)

字数统计: 1.1k阅读时长: 4 min
2021/08/12

上一篇主要记录了什么是kubernetes的资源编排yaml文件、如何编写yaml文件,并给了一个Hello-world的demo,当然那个只是展示作用,没啥价值。这篇以一个SpringCloud的项目作为例子,记录一下部署到Kubernetes中的全过程。

image-20210810183438958

实战-编写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的负载均衡,后续我们只暴露这个容器的端口来供外部访问。

image-20210810183438958

这里不放代码了,关于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端口:

  1. vim /lib/systemd/system/docker.service
image-20210810165254879
  1. 查看结果,可以看到暴露了2375端口以及可以正常请求到镜像信息了(这里没有开始TLS,为了安全应该启用,这里只是本地开发

    image-20210810165239899
image-20210810165444488

在IDEA里进行配置:

image-20210810165630498

配置每一个应用,这里只展示其中一个,其他同理。这里我们只构建,不运行(创建容器)

image-20210810170009706

当然你也可以添加前置任务,比如构建镜像前重新Maven打包一下,这样你就不用手动一个一个去打包了:

image-20210810170331052

接下来我们就要去构建镜像了,构建之前我有这些镜像:

image-20210810170514544

构建结束后我们就可以看到镜像了:

image-20210810173227201
image-20210810173254861

编写资源编排文档

接下来就是另一个重头戏了,我们来编写部署这四个服务的yaml。其实是可以写到一个文件里面的,但是为了考虑到横向扩容等形式,这里我们一个一个部署。首先我们部署两个Eureka,我们按部就班来:

  1. 生成yaml:kubectl create deployment eureka_1 --image=spring-cloud-demo/eureka_1 -o yaml --dry-run=client

    image-20210810184457882

    上面这个文件是一个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 # Eureka_1 监听端口
    status: {}

CATALOG
  1. 1. 实战-编写SpringCloud项目的资源编排文档
    1. 1.1. 一个SpringCloud的Demo
      1. 1.1.1. 构建镜像
      2. 1.1.2. 编写资源编排文档
    2. 1.2.