Kubernetes 中的 Zuul 部署

Zuul Deployment in Kubernetes

这是我第一次尝试将微服务架构部署到 Kubernetes 中。一开始,我正在考虑使用 Ambassador 作为我的 API 网关。我还有一个验证用户并生成 JWT 令牌的身份验证服务,但是,我需要验证此令牌 每次调用服务时。这代表了一个过载问题(因为每次 API 网关收到流量时,它都会转到此外部身份验证服务以验证 JWT 令牌)并且 Ambassador 无法在不使用外部服务的情况下执行此过滤.

在这种情况下,使用 Zuul 网关似乎是最佳选择,因为它允许我在网关内验证 JWT 令牌(而不是通过像 Ambassador 这样的外部服务)。但是,我不确定如果我在 Kubernetes 中部署 Zuul 将如何工作,因为据我了解,Zuul 需要具有服务发现的地址(如 Eureka)。

如果我在我的 Kubernetes 集群中部署 Zuul,那么它将如何定位我的服务?

比如本地,没有问题,因为我之前用的是Eureka,知道它的地址。另外,我不认为在 Kubernetes 中部署 Eureka 是个好主意,因为它是多余的。

如果不能使用 Zuul,是否有另一种 API 网关或方法,我可以使用网关验证令牌,而不是像 Ambassador 那样依赖外部身份验证服务?

谢谢。

在 kubernetes 中,您已经拥有 "discovery" 服务,即 kubernetes-service。它定位 pods 并充当它们的负载平衡器。

假设您有这样的 Zuul 配置:

zuul:
  routes:
    books-service:
      path: /books/**
      serviceId: books-service

将匹配 /books/** 的请求路由到服务 books-service。通常你有一个 Eureka 给你 books-service 的真实地址,但现在不是。

这就是 Ribbon 可以帮助你的地方——它允许你在 Zuul 匹配它的请求后手动调整路由。所以你需要将它添加到配置中:

books-service.ribbon.listOfServers: "http://books:8080"

并且在 Zuul 找到 serviceId (books-service) 之后它将请求路由到 books:8080

books:8080 只是一个 kubernetes 服务:

kind: Service
apiVersion: v1
metadata:
  name: books
spec:
  selector:
    app: spring-books-service
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 9376

你可以说它是一个负载均衡器,它从 :8080 获取流量并将其重定向到带有标签 app: spring-books-service.

的 pods

接下来您要做的就是将标签分配给 pods(例如通过部署)

顺便说一句,您可以在任何应用程序中像这样配置 Ribbon,kubernetes 将通过其服务找到您的所有应用程序 (pods),因此您根本不需要任何发现服务!而且由于 k8s-services 比 Eureka 可靠得多,您可以简单地删除它。