Kubernetes 中的 Zuul 部署

Posted

技术标签:

【中文标题】Kubernetes 中的 Zuul 部署【英文标题】:Zuul Deployment in Kubernetes 【发布时间】:2019-07-03 01:45:54 【问题描述】:

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

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

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

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

如果使用 Zuul 无法做到这一点,是否有其他 API 网关或方法可以让我使用网关验证令牌,而不是像大使那样依赖外部身份验证服务?

谢谢。

【问题讨论】:

一些信息:***.com/questions/49817076/… 【参考方案1】:

在 kubernetes 中,您已经拥有“发现”服务,即 kubernetes-service。它定位 pod 并充当它们的负载均衡器。

假设你有这样的 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 的 Pod。

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

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

【讨论】:

这个 books-service.ribbon.listOfServers: "http://books:8080" 配置应该转到通过 feign 客户端调用服务的应用程序吗? @AyeshmanthaPerera 因为 Ribbon 是客户端 LB,所以该客户端(在本例中为 Zuul)应该知道服务器列表。 Zuul 支持 Ribbon 自动路由请求。 Feign 和 RestTemplate 都支持 Ribbon。见this question

以上是关于Kubernetes 中的 Zuul 部署的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes v1.14.0 之 kube-apiserver集群部署

kubernetes集群安装指南:master组件kube-scheduler部署

kubernetes二进制安装

kubernetes集群安装指南:master组件kube-controller-manager部署

kube-state-metrics部署

kube-dns部署