我正在整理一个概念证明,以帮助识别同时使用 Spring Boot/Netflix OSS 和 Kubernetes 的问题。这也是为了证明 Prometheus 和 Graphana 等相关技术。
我有一个 Eureka 服务设置,它在我的 Kubernetes 集群中没有问题。这被命名为发现,并在使用添加到 K8 时被命名为“discovery-1551420162-iyz2c”
For my config server, I am trying to use Eureka based on a logical URL so in my bootstrap.yml I have
server:
port: 8889
eureka:
instance:
hostname: configserver
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://discovery:8761/eureka/
spring:
cloud:
config:
server:
git:
uri: https://github.com/xyz/microservice-config
我开始使用
kubectl run configserver --image=xyz/config-microservice --replicas=1 --port=8889
该服务最终运行命名为 configserver-3481062421-tmv4d。然后我在配置服务器日志中看到异常,因为它试图找到 eureka 实例并且无法定位。
我在本地使用带有链接的 docker-compose 对此进行了相同的设置,它可以毫无问题地启动各种容器。
discovery:
image: xyz/discovery-microservice
ports:
- "8761:8761"
configserver:
image: xyz/config-microservice
ports:
- "8888:8888"
links:
- discovery
如何设置像 eureka.client.serviceUri 这样的东西,这样我的微服务就可以在不知道 K8 集群中的固定 IP 地址的情况下定位它们的对等点?
原文由 Andrew Rutter 发布,翻译遵循 CC BY-SA 4.0 许可协议
你必须在 eureka pods/deployments 之上有一个 Kubernetes 服务,然后它会为你提供一个可参考的 IP 地址和端口号。然后使用该可引用地址来查找 Eureka 服务,而不是“8761”。
解决有关 Eureka 的 HA 配置的进一步问题
每个 k8s 服务不应该有超过一个 Eureka 的 Pod/副本(请记住,Pod 是短暂的,你需要一个可引用的 IP 地址/域名用于 eureka 服务注册表)。要实现高可用性 (HA),请启动更多 k8s 服务,每个服务都有一个 pod。
所以,现在你的每个 Eureka 都有可参考的 IP/域名(k8s 服务的 IP)。现在它可以相互注册了。
感觉是不是有点矫枉过正了? _如果您的所有服务都在同一个 kubernetes 命名空间中_,您可以通过 k8s 服务 + KubeDNS 附加组件实现 eureka 提供的所有内容(嗯,几乎所有内容,除了客户端负载平衡)。阅读克里斯蒂安·波斯塔的这篇 文章
编辑
正如 Stefan Ocke 指出的那样,您可以使用 StatefulSet ,而不是每个服务都有一个 pod。