Files
kuboard-press/learning/k8s-practice/ocp/eureka-server.md
huanqing.shao c1db1d7cf2 auth-server
2019-09-28 19:53:11 +08:00

120 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
vssueId: 84
layout: LearningLayout
description: Kubernetes教程_使用Kuboard在Kubernetes上部署Spring_Cloud微服务平台OCP_open_capacity_platform微服务能力开放平台_部署eureka-server
---
# 在K8S上部署eureka-server
本文假设您已经完成了 [在Kubernetes上部署SpringCloud-OCP](/learning/k8s-practice/ocp/) 教程的前序步骤:
* [准备OCP的构建环境和部署环境](/learning/k8s-practice/ocp/prepare.html)
* [构建docker镜像并推送到仓库](/learning/k8s-practice/ocp/build.html)
> 也可以使用 `ocpsample/eureka-server:latest` 镜像
* 理解 Spring Cloud Eureka 组件,请参考 [Eureka服务注册与发现](https://www.jianshu.com/p/c18d140ad9f6)
## 理解eureka-server
本章节参考 eureka-server 的 [代码仓库](https://gitee.com/owenwangwen/open-capacity-platform/tree/2.0.1/register-center/eureka-server),并着重从容器化部署的角度来理解 Spring Cloud eureka-server 以及 OCP 中 eureka-server 的配置文件。
`open-capacity-platform/register-center/eureka-server/src/main/resources` 目录中包含了 eureka-server 的配置文件,如下所示:
```sh
├── 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的使用场景](/learning/k8s-intermediate/workload/wl-statefulset/#statefulset-使用场景) 以理解为何选择 StatefulSet 部署 eureka
* 请参考 [StatefulSet稳定的网络ID](/learning/k8s-intermediate/workload/wl-statefulset/basics.html#稳定的网络-id) 以理解 StatefulSet 如何为其中的 Pod 分配 DNS name
* eureka-server 的多个实例之间,不能存在端口冲突
* 请参考 [Kubernetes的网络模型](/learning/k8s-intermediate/service/connecting.html#kubernetes-的网络模型) 以理解 Kubernetes 中如何避免端口冲突
我们在 Kubernetes 上部署 eureka-server 时:
* 使用 StatefulSet 部署 eureka-server副本数量为 3
* 使用 OCP eureka-server 的 application-slave0.yml 这个 profile
* 使用环境变量覆盖 `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/eureka
```
::: tip
通过 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通过互联网访问您的应用](/learning/k8s-intermediate/service/ingress.html#ingress)
* 该域名由 `工作负载名`.`名称空间`.`集群名字`.`一级域名` 组成,这种命名规则下,只需要将 `*.demo.kuboard.cn` 的域名解析指向集群 Ingress Controller 的地址就可以,在测试环境中配置新的模块时非常方便。
## 部署eureka-server
本教程将 eureka-server 及其他 OCP 组件部署到 `ocp` 名称空间,并假设您已经创建好了该名称空间,参考 [创建名称空间](/guide/cluster/namespace.html)
* 在 Kuboard 界面中进入 `ocp` 名称空间,并点击页头的按钮 `创建工作负载`,如下图所示:
填写表单:
| 字段名称 | 填写内容 | 备注 |
| -------- | ------------------------------------------------------------ | ---- |
| 服务类型 | StatefulSet | |
| 服务分层 | 中间件 | |
| 服务名称 | eureka | |
| 服务描述 | 服务注册中心 | |
| 副本数量 | 3 | |
| 容器名称 | eureka-server | |
| 镜像 | ocpsample/eureka-server:latest | 也可以使用自己构建的镜像 |
| 抓取策略 | Always | |
| 环境变量 | <div style="max-width: 600px;"><span style="color: blue;">eureka.client.service-url.defaultZone=</span>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/eureka</div> <div style="max-width: 600px;"><span style="color: blue;">eureka.instance.prefer-ip-address=</span>false</div> | |
| Service | NodePort<br />协议 `TCP` 服务端口 `1111`节点端口 `31111` 容器端口 `1111` | 可从节点端口访问 |
| Ingress | 域名cloud-eureka.ocp.demo.kuboard.cn<br />路由配置: 映射URL `/` 服务端口 `1111` | 可通过域名访问 |
![Kubernetes教程在K8S中部署SpringCloud](./eureka-server.assets/image-20190927104441574.png)
* 点击 **保存** 按钮
* 点击 **应用** 按钮
* 点击 **完成** 按钮
* 等待 eureka-server 完成部署
* 根据您服务器到 hub.docker.com 的网速不同,等候的时间约 1-5 分钟
## 查看部署结果
按照上面的部署方式,有如下两种方式可以从浏览器访问 eureka-server 的界面:
* 使用域名: [http://cloud-eureka.ocp.demo.kuboard.cn/](http://cloud-eureka.ocp.demo.kuboard.cn/)
* 使用节点端口http://${任意节点的IP地址}:31111
eureka-server 界面如下图所示:
![Kubernetes教程在K8S部署SpringCloud服务注册中心Eureka-Server](./eureka-server.assets/image-20190927140934092.png)