我有一个包含服务的 Kubernetes 集群,我使用 Ambassador 作为外部世界和我的服务之间的 API 网关。
通过大使,我知道我可以使用我拥有的服务来检查传入请求的身份验证和授权,但这仅适用于来自集群外部的请求吗?
我也想拦截服务到服务的调用。
如果你不能,我会感到惊讶。
这个答案需要一些术语,以避免迷失在文字汤中。
- App-A 是群集内
Service
的使用者,并且将向大使进行身份验证 - App-Z 是群集内
Service
的提供程序(选择器将针对其Pod
( - 我们将在
z
命名空间中调用z-service
app-Z 的 k8sService
,FQDN 为z-service.z.svc.cluster.local
似乎您可以使用其 v-host 支持并教它遵循群集内虚拟主机(上述 FQDN(,然后更新z-service
选择器以面向大使Pod 而不是底层 app-Z Pod。
从app-A的角度来看,唯一会改变的是它现在必须提供身份验证才能联系z-service.z.svc.cluster.local
。
如果不进一步研究 Ambassador 的设置,就很难知道 Ambassador 是否会在那个时候正常工作™,或者你是否需要一个"实现"Service
(例如z-for-real.z.svc.cluster.local
(,以便 Ambassador 知道如何找到实际的 app-Z Pod。
我现在有同样的问题。大使将每个请求路由到身份验证服务(如果提供(,身份验证服务可以是任何内容。所以你可以设置http basic auth,oauth,jwt auth等。 下一个要提及的重要事项是,您的服务可能使用基于标头的路由 (https://www.getambassador.io/reference/headers(。仅当存在持有者(或类似内容(时,请求才会命中您的服务,否则将失败。在您的服务中,您可以检查权限等。总而言之,大使可以帮助你,但你仍然需要自己编程。
如果你想从头开始或更高级的东西,你可以尝试 https://github.com/ory/oathkeeper 或 https://istio.io。
如果您已经找到了解决方案,那么知道会很有趣。