当前,我们在Amazon EC2计算机上以软件即服务的形式提供我们的软件。我们的软件是基于微服务的应用程序,具有大约20种不同的服务。
对于较大的客户,我们在一组专用的VM上使用专用的安装,VM的数量(以及我们的微服务实例的数量)取决于客户的要求。任何较大客户的普遍要求是,我们的软件需要访问客户的数据中心(例如,用于LDAP访问)。到目前为止,我们已经使用亚马逊的虚拟专用网关功能解决了这一问题。
现在,我们想将SaaS部署迁移到Kubernetes。当然,我们可以跨单个客户的VM创建Kubernetes集群(例如,使用kops),但是这样做带来的好处很小。
相反,从角度来看,我们想运行一个大型Kubernetes集群,在该集群上,我们将各个客户安装程序部署到专用的命名空间中,与今天向客户固定分配机器相比,这种方式可以提高资源利用率并降低成本。
从Kubernetes的角度来看,我们的软件已经可以正常工作,我们可以将多个安装部署到一个集群上。但是,开放的话题是VPN访问。我们需要的是一种允许客户空间中的所有 pods 访问客户的VPN,但不能访问任何其他客户的VPN的方法。
在搜索该主题时,我发现了将VPN客户端添加到单个容器(例如https://caveofcode.com/2017/06/how-to-setup-a-vpn-connection-from-inside-a-pod-in-kubernetes/)的方法,这显然是不可行的。
其他方法似乎描述了在K8s中运行VPN服务器(这也不是我们所需要的)。
其他人(例如“Strongswan IPSec VPN服务”,https://www.ibm.com/blogs/bluemix/2017/12/connecting-kubernetes-cluster-premises-resources/)再次使用DaemonSets“在每个工作节点上配置路由”。这似乎也不是我们可以接受的解决方案,因为这将允许工作节点上的所有Pod(无论它们位于哪个命名空间中)都可以访问各自的VPN ...并且如果我们拥有数十个客户安装,每个安装都需要在群集上建立自己的VPN。
是否有任何方法或解决方案可提供我们所需的功能,即仅对特定命名空间中的Pod进行VPN访问?
还是有其他方法仍然可以满足我们的要求(由于Kubernetes的工作节点在客户之间共享,从而降低了成本)?
对于LDAP访问,一个选项可能是设置一种LDAP代理,这样只有该代理才需要具有对客户网络的VPN访问权限(通过在每个客户的小型专用VM上运行此代理,然后配置该代理)作为应用程序的LDAP端点)。但是,LDAP访问只是我们的应用程序根据用例需要的连接的许多方面中的一个。
最佳答案
如果您的IPSec集中器支持VTI,则可以使用防火墙规则路由通信。例如,PFSense支持它:https://www.netgate.com/docs/pfsense/vpn/ipsec/ipsec-routed.html。
使用VTI,您可以使用某种策略路由来引导流量:https://www.netgate.com/docs/pfsense/routing/directing-traffic-with-policy-routing.html
但是,我可以在这里看到两个大问题:
在WSO2(API网关提供程序)架构上建立了类似的方案。他们在每个网络中使用反向代理解决了这个问题(很遗憾,但确实如此)https://docs.wso2.com/display/APICloud/Expose+your+On-Premises+Backend+Services+to+the+API+Cloud#ExposeyourOn-PremisesBackendServicestotheAPICloud-ExposeyourservicesusingaVPN
问候,
更新:
我不知道你是否使用GKE。如果是,则可以选择使用Alias-IP:https://cloud.google.com/kubernetes-engine/docs/how-to/alias-ips。 POD的IP可从VPC路由。因此,您可以根据其CIDR应用某种路由策略。
关于kubernetes - 在共享Kubernetes集群中运行的应用程序的VPN访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49066665/