理解eureka-server
本章节参考 eureka-server 的 代码仓库,并着重从容器化部署的角度来理解 Spring Cloud eureka-server 以及 OCP 中 eureka-server 的配置文件。
open-capacity-platform/register-center/eureka-server/src/main/resources
目录中包含了 eureka-server 的配置文件,如下所示:
├── application-slave0.yml
├── application-slave1.yml
├── application-slave2.yml
├── application-slave3.yml
├── application.yml
└── bootstrap.yml
其中, application-slave0.yml
,application-slave1.yml
,application-slave2.yml
,application-slave3.yml
为 spring boot 的 4 个 profile 配置,他们之间最重要的差异在于以下两个字段:
- server.port
- eureka.client.defaultZone
而 application.yml
文件中则指定了 application-slave0.yml
为默认 profile。通过 eureka.client.service-url.defaultZone
字段不难看出:
- 配置文件 slave0 为一组,在运行 eureka-server 单节点时使用(该文件中还有一些特定于测试环境的配置项)
- 配置文件 slave1/slave2/slave3 为一组,在运行 eureka-server 高可用时使用,为了避免端口冲突,为每一个实例单独定义了
server.port
字段,通过--spring.profiles.active
启动参数为 eureka-server 的实例指定激活的配置文件
确定部署方案
在 Kubernetes 中部署多个 eureka-server 的实例组成集群时,主要有如下考虑因素:
- 每个 eureka-server 需要被赋予一个唯一的 id,通过字段
eureka.instance.instance-id
指定。OCP 中,该字段的配置为${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
- Kubernetes 为每一个 Pod 分配一个 IP 地址,此要求可以满足
- eureka-server 的每一个实例需要知道集群中其他实例的地址和端口号,通过字段
eureka.client.serviceUrl.defaultZone
指定- 请参考 StatefulSet的使用场景 以理解为何选择 StatefulSet 部署 eureka
- 请参考 StatefulSet稳定的网络ID 以理解 StatefulSet 如何为其中的 Pod 分配 DNS name
- eureka-server 的多个实例之间,不能存在端口冲突
- 请参考 Kubernetes的网络模型 以理解 Kubernetes 中如何避免端口冲突
我们在 Kubernetes 上部署 eureka-server 时:
- 使用 StatefulSet 部署 eureka-server,副本数量为 3
- 使用 OCP eureka-server 的 application-slave0.yml 这个 profile
- 使用环境变量覆盖
eureka.client.service-url.defaultZone
取值,将其设置为:
::: tiphttp://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka
通过 cloud-eureka-0.cloud-eureka 也可以访问到对应的 POD,但是此处必须使用完整域名,否则 eureka-server 将不被认为是 available
::: - 使用环境变量覆盖
eureka.instance.prefer-ip-address
取值,将其设置为:false
- 为 eureka-server 创建 Ingress,并分配域名
cloud-eureka.ocp.demo.kuboard.cn
- 关于 Ingress,请参考 Ingress通过互联网访问您的应用
- 该域名由
工作负载名
.名称空间
.集群名字
.一级域名
组成,这种命名规则下,只需要将*.demo.kuboard.cn
的域名解析指向集群 Ingress Controller 的地址就可以,在测试环境中配置新的模块时非常方便。
部署eureka-server
本教程将 eureka-server 及其他 OCP 组件部署到 ocp
名称空间,并假设您已经创建好了该名称空间,参考 创建名称空间
-
在 Kuboard 界面中进入
ocp
名称空间,并点击页头的按钮创建工作负载
,如下图所示:填写表单:
字段名称 填写内容 备注 服务类型StatefulSet 服务分层 中间件 服务名称 eureka 服务描述 服务注册中心 副本数量 3 容器名称 eureka-server 镜像 ocpsample/eureka-server:latest 也可以使用自己构建的镜像 抓取策略 Always 环境变量 eureka.client.service-url.defaultZone=http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eurekaeureka.instance.prefer-ip-address=false填入 kuboard 时
环境变量名后面不带=
Service NodePort:
协议TCP
服务端口1111
节点端口31111
容器端口1111
可从节点端口访问 Ingress 域名:cloud-eureka.ocp.demo.kuboard.cn
路由配置: 映射URL/
服务端口1111
可通过域名访问 -
点击 保存 按钮
-
点击 应用 按钮
-
点击 完成 按钮
- 等待 eureka-server 完成部署
- 根据您服务器到 hub.docker.com 的网速不同,等候的时间约 1-5 分钟
查看部署结果
按照上面的部署方式,有如下两种方式可以从浏览器访问 eureka-server 的界面:
- 使用域名: http://cloud-eureka.ocp.demo.kuboard.cn/
- 使用节点端口:http://${任意节点的IP地址}:31111
eureka-server 界面如下图所示: