我有一个Node.JS服务器在Kubernetes集群中运行。我想知道是否有一种合适的方法可以通过Kubernetes将一些API端点设置为私有,而另一些端点则设置为公共。
为了简化这一点,考虑以下情况:
- API 1:
/products/:id
(需要从外部访问) - API 2:
/prices
(需要仅由同一Kubernetes集群内的其他内部微服务或Pod访问)
注意:我使用Ingress Nginx通过服务将流量路由到这个Pod
目前,我通过在不同的端口运行2个Node.js Express服务器示例来实现这一点,这些服务器Map到2个Kubernetes服务。其中一个(公共)在Ingress中提到,另一个(私有)没有。
我不太喜欢这种方法,因为我必须运行两台服务器,并在服务中维护这么多细节。有没有更好的方法来实现这一点,也许是Istio(有人用它来实现这一目的吗)?
在过去,我使用AWS API Gateway来处理这个问题,但是这次我没有这个选项,我想知道Kubernetes内部是否可以处理这个问题。
我很乐意提供更多的细节,如果我错过了什么。
1条答案
按热度按时间w8f9ii691#
ingress是一个成熟的API网关,因此您可以使用NGINX,Istio或其他功能限制访问。您不需要拆分代码库以避免暴露特定端点。
从逻辑上讲,在你的用例中,你只需要为白名单路径定义路由-this nginx answer提供了一个例子。Istio在其VirtualService resource中提供了类似的选项,包括表达路由规则的能力。
您甚至可以编写自己的ingress插件来实现更复杂的逻辑。在这种情况下,请选择一个支持高级语言的ingress控制器。包括Istio在内的相当多的控制器都支持LUA scripting language,这非常容易学习。
从简单性的Angular 来看,这也是一个API设计问题。例如,为不应该暴露的端点采用
/internal
这样的路径将使API路由易于维护。