如何在 Kubernetes 中为 Spring 应用程序提供双向 TLS (mTLS)?

How to provide mutual TLS (mTLS) with Spring application in Kubernetes?

我有一个有趣的问题,也许你能帮我解决。

给定了 两个 spring 应用程序,分别称为 app1 和 app2。这两种服务都发生了大量 REST 调用。我需要实施一个 安全解决方案 ,其中它们都可以在 REST 上相互通信,但它受到 相互 TLS 的保护(mTLS,其中两个应用程序彼此都有自己的证书)

以标准方式实现它并不难,Spring 有解决方案(使用密钥库等),但问题是,我必须在 Kubernetes 中创建它 环境。 这两个应用程序不在同一个集群中,因此 app1 在我们的集群中,但 app2 部署在我们合作伙伴的系统之一中。
我对 k8s 很陌生,不确定实现此目标的最佳方法是什么。我应该将证书或密钥库存储为机密吗?以某种方式使用和配置 nginx ingress,也许 Istio 会有用?我真的很想找到最佳解决方案,但我不知道正确的方法。 如果我可以在我的应用程序之外配置它并让 k8s 来处理它,我真的很想,但我不确定这样做是否正确。

任何帮助,找到正确道路的指导或一些现实生活中的例子,我们将不胜感激。
感谢您的帮助!

您的问题的答案会更加复杂,因为没有 one-size-fits-all 最好的解决方案。这完全取决于您到底想做什么以及您拥有什么工具。 suren在评论中提到的很好:

if you are still in the stage of PoC, then note that there are couple of ways of achieving what you want. Istio would be a valid way, for example. You could have the other service in a ServiceEntry, enable mTLS and there you go. You don't have to even manage secrets for this specific scenario, as it is automatic. But there are other ways. Even with Istio there are other ways. If you are on any cloud provider, you might have some managed services as well

这是一条很好的评论,我还会向您推荐一个基于 istio 的解决方案。首先先查官方mTLS documentation for istio。您还可以在那里找到特定的使用示例和示例配置文件。

您在问题中还提到您的应用程序将 运行 在两个集群之间。看一下this tutorial,里面具体说明了如何解决这种情况:

Istio injects an envoy sidecar to every pod and makes sure all the traffic goes through the envoy proxy. Envoy proxies compose the data plane. The control plane manages the Envoy sidecars. In previous versions of Istio, the control plane used to have other components, such as Pilot, Citadel, and Galley. These components got consolidated into a single binary called “istiod”. The control plane also deals with the configurations, certificates, secrets, and health checking.

有关详细信息,另请参阅 related problem on Whosebug and another tutorial

请注意,除了 istio 本身,您还可以使用 ready-made 云解决方案,例如 GKE 提供的,即 Configuring TLS and mTLS on the Istio ingress .

另一种方法可能是使用工具 Anthos Service Mesh by example: mTLS

Mikolaj 可能已经涵盖了所有内容,但仍然让我加分

我没有太多使用 Istio 的经验,但是我也建议查看 Linkerd service mesh .

步骤 1.

考虑到如果您使用的是 multi could GKE & EKS,那么它仍然可以工作。

Multicluster guide详情和安装详情

Linkerd 将在集群之间使用 Trust anchor,因此流量可以加密流动并且不会向 public 互联网开放。

您必须生成证书,这将在集群之间形成共同的信任基础。

每个代理都将获得证书的副本并将其用于验证。