-3

我正在编写一个要部署在 Kubernetes 上的服务。客户端将是其他服务,而不是人,这些服务可能位于其他命名空间甚至集群中。我的目标是:

  1. 验证调用服务
  2. 授权调用服务
  3. 根据调用服务的身份应用一些策略(如配额)

我知道 Kubernetes 没有提供真正帮助解决这些问题的服务,我需要在我的服务中构建一些明确的东西。我想了解当前的最佳实践是什么,以及如何最大限度地利用 Kubernetes 或生态系统中的可用功能,以实现这些目标,同时最大限度地减少编码和管理负担。我考虑过的几个选项:

  • 自定义用户名/共享秘密。我可以将共享密钥传递给所有调用服务,然后编写我自己的自定义代码来验证共享密钥是否匹配。我认为将这些作为不记名令牌传递是正确的举动。使用 Kubernetes 服务帐户和角色对象是否是这些共享机密的合理容器?如果是这样,是否有使查找、关联和策略工作更容易的库?

  • 智威汤逊。JWT 似乎更倾向于传递声明,例如最终用户身份,并且似乎要求所有参与组件共享相同的 JWT 机密。由于我不希望 call-service-foo 能够作为 call-service-bar 进行身份验证,因此尚不清楚 JWT 是否正确。想法?

  • mTLS。我可以为所有参与的服务颁发 TLS 证书。我可以使用哪些组件来自动颁发这些证书?我应该尝试使用 Kubernetes 服务帐户或角色对象来管理这些,还是滚动我自己的 CRD?

  • 伊斯蒂奥。看起来 Istio 可以透明地做很多这样的事情,但到目前为止,我发现的所有解释这一点的资源似乎都假设透明性是一个目标。但是,由于我需要调用服务的身份,是否可以从 Istio 中获取?如果我的呼叫者不在我的集群中,这可以工作吗?

  • 尖顶(spiffe.io)。这看起来很适合我的用例,但它似乎很新,我不知道人们对它有多少经验。

这些选项中的任何一个(并请纠正我对其中任何一个的理解)作为最佳实践脱颖而出,还是我应该考虑其他选项?

谢谢!

4

2 回答 2

0

您需要的是一个充当微服务 API 端点网关的组件。这种组件属于一种称为“API 管理”(维基百科页面)的软件类别,其用途不仅限于 Kubernetes。

API 管理软件有很多选择,例如 Wikipedia 页面中列出的,但我的项目使用 Gravitee,到目前为止,由于其简单的管理 UI,我们很喜欢它。随意在https://gravitee.io/上探索它。

注意,除了作为用户之一之外,我与 Gravitee.io 没有任何关系(尽管我确实为一个 PR 做出了贡献)

于 2020-08-08T08:55:28.323 回答
0

我知道我现在迟到了,但如果其他人在看的话:Istio 已经包含了多集群支持,它使沟通变得轻松。

参考:https ://istio.io/latest/docs/setup/install/multicluster

于 2021-07-12T12:08:18.867 回答