kubernetes - 在共享Kubernetes集群中运行的应用程序的VPN访问

标签 kubernetes vpn

当前,我们在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

但是,我可以在这里看到两个大问题:

  • 您不能有两个IPSEC隧道与冲突的网络。例如,您的kube网络为192.168.0.0/24,您有两个客户:A(172.12.0.0/24)和B(172.12.0.0/12)。不幸的是,这可能发生(除非您的客户能够对这些网络进行NAT)。
  • 因为源网络始终相同,所以找到规则匹配的理想标准(以允许路由)。可以使用标记包(使用iptables mangle甚至通过应用程序),但是您仍然会遇到第一个问题。

  • 在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/

    相关文章:

    docker - 自动将新的节点导出器添加到 prometheus.yml 的目标数组中

    c# - 连接到 VPN 后获取结果

    amazon-web-services - 带有 VYOS 的 AWS 区域间 VPN

    android - 从 android 小部件内部启动 VPNService

    amazon-web-services - 在 terraform IPSec 隧道中使用的 AWS IP 地址(通过 Transit Gateway)

    linux - CentOS 网络接口(interface) Post-Up 脚本未执行

    kubernetes - 优雅地终止 kubernetes pod

    kubernetes - 在 GKE 上使用 Horizo​​ntalPodAutoscaler 自定义指标

    nginx - 如何在端口 80/443 的公共(public)节点 IP 上公开 kubernetes nginx-ingress 服务?

    kubernetes - 无法从堡垒访问通过 Terraform 进行的 AWS EKS 集群设置