【问题标题】:mTLS between two kubernetes clusters两个 Kubernetes 集群之间的 mTLS
【发布时间】:2020-12-30 03:02:22
【问题描述】:
我试图在两个 kubernetes 集群中的两个应用程序之间获取 mTLS,而不是 Istio 的方式(使用它的入口网关),我想知道以下是否可行(对于 Istio,对于 Likerd,对于 Consul.. .).
假设我们有一个 k8s 集群 A 和一个应用程序 A.A。以及带有应用程序 B.B. 的集群 B,我希望它们与 mTLS 通信。
- 集群 A 具有用于 nginx 入口控制器的 LetsEncrypt 证书,以及用于其应用程序的网格(随便)。
- 集群 B 具有来自我们的根 CA 的自签名证书。
- 集群 A 和 B 服务网格具有由我们的根 CA 签署的不同证书。
- 流量从互联网流向集群 A 入口控制器 (HTTPS),从那里流向应用程序 A.A.
- 流量到达应用 A.A. 后,此应用想与应用 B.B. 对话
- Apps A.A.和 B.B. 通过入口(使用他们的入口控制器)公开端点。
- TLS 证书以端点结尾并且是通配符。
你认为 mTLS 会在这种情况下工作吗?
【问题讨论】:
标签:
kubernetes
istio
linkerd
mtls
servicemesh
【解决方案1】:
基本上这个来自portshift的blog回答你的问题。
答案取决于你的集群是如何构建的,因为
Istio 提供了很少的选项来在多个 kubernetes 集群中部署服务网格,更多关于它的信息here。
所以,如果你有 Single Mesh 部署
您可以在完全连接的多集群网络上部署单个服务网格(控制平面),并且所有工作负载都可以在没有 Istio 网关的情况下直接相互访问,无论它们在哪个集群上运行。
但是
如果您有多网格部署
通过多网格部署,您可以获得更高程度的隔离性和可用性,但它会增加设置的复杂性。原本独立的网格使用 ServiceEntries、Ingress Gateway 松散耦合在一起,并使用公共根 CA 作为安全通信的基础。从网络的角度来看,唯一的要求是入口网关可以相互访问。需要访问不同网格中的服务的给定网格中的每个服务都需要远程网格中的 ServiceEntry 配置。
在多网格部署中,随着环境的发展和多样化,安全性会变得复杂。在集群之间对服务进行身份验证和授权时存在安全挑战。本地Mixer(服务策略和遥测)需要使用相邻集群中服务的属性进行更新。否则,当这些服务到达其集群时,它将无法授权这些服务。为此,每个 Mixer 都需要了解相邻集群中的工作负载身份及其属性。每个 Citadel 都需要使用相邻集群的证书进行更新,以允许集群之间的 mTLS 连接。
跨多网格控制平面的细粒度工作负载身份(mTLS 证书)和服务属性的联合可以通过以下方式完成:
-
Kubernetes Ingress: 将来自集群外部的 HTTP 和 HTTPS 路由暴露给集群内的services。流量路由由 Ingress 资源上定义的规则控制。 Ingress 可以终止 SSL / TLS,并提供基于名称的虚拟主机。然而,它需要 Ingress controller 来满足 Ingress 规则
-
服务网格网关: Istio 服务网格提供了不同的配置模型,Istio Gateway。网关允许将监控和路由规则等 Istio 功能应用于进入集群的流量。入口 gateway 描述了在网格边缘运行的负载均衡器,用于接收传入的 HTTP/TCP 连接。它配置公开的端口、协议等。入口流量的流量路由是使用 Istio 路由规则配置的,与内部服务请求的方式完全相同。
你认为 mTLS 会在这种情况下工作吗?
根据以上信息
我希望它能回答你的问题。如果您还有其他问题,请告诉我。
【解决方案2】:
你想要领事的Mesh Gateways。它们在部署在不同数据中心、集群或运行时环境中的联合 Consul 集群之间实现 mTLS 服务到服务连接。