Kubernetes上微服务间身份验证的最佳实践?

时间:2020-08-07 15:16:18

标签: authentication kubernetes microservices mtls

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

  1. 验证呼叫服务
  2. 授权呼叫服务
  3. 基于呼叫服务的身份(例如配额)应用一些策略

我知道Kubernetes并没有提供真正对这些服务有帮助的服务,因此我需要在服务中构建一些明确的内容。我想了解当前的最佳实践,以及如何最大程度地利用Kubernetes或生态系统中的可用资源,以实现这些目标,同时最大程度地减少编码和管理负担。我考虑过的一些选择:

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

  • JWT 。 JWT似乎更倾向于传递声明(如最终用户身份),并且似乎要求所有参与组件共享相同的JWT机密。由于我不希望calling-service-foo能够通过calling-service-bar进行身份验证,因此尚不清楚JWT是正确的选择。有想法吗?

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

  • Istio 。看起来Istio可以透明地完成很多工作,但是到目前为止,我发现解释该问题的所有资源似乎都假定透明是目标。但是,由于我将需要呼叫服务的身份,是否有可能使它脱离Istio?如果我的呼叫者不在我的集群中,可以这样做吗?

  • SPIRE(spiffe.io)。看起来它与我的用例非常匹配,但它似乎是新的,而且我不知道人们有多少经验。

这些选项中的任何一个(请更正我对它们中的任何一个)是否能作为最佳实践脱颖而出,还是我应该考虑的其他选择?

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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