在EKS(AWS kubernetes)上将JHub入口流量列入白名单的好方法吗?

时间:2019-10-02 18:22:41

标签: amazon-web-services networking kubernetes jupyterhub aws-eks

上下文: 我有一个EKS集群(EKS是AWS的托管kubernetes服务)。 我通过头盔将应用程序部署到此EKS群集(JupyterHub)。 我有一个VPN服务器。 我的应用程序的用户(EKS上的JupyterHub)必须先连接到VPN服务器,然后才能访问该应用程序。 我通过删除弹性负载均衡器上的0.0.0.0/0“允许所有”入口规则并添加仅允许来自VPN服务器的流量的入口规则来实施此操作。 上面引用的弹性负载均衡器是由JupyterHub应用程序隐式创建的,该应用程序已通过头盔部署到EKS。

问题: 当我将更改部署到EKS中正在运行的JuypyterHub应用程序时,有时[取决于更改] ELB被删除并重新创建。 这将导致与ELB关联的安全组以及入口规则也被重新创建。 这并不理想,因为在将更改部署到JupyterHub / EKS时很容易忽略这一点,并且开发人员可能会忘记验证安全组规则是否仍然存在。

问题: 我可以强制执行此入口网络规则(仅允许来自VPN服务器的流量)吗?

我有两个想法,但并不理想:

  • 使用NACL。这真的行不通,因为由于NACL是有状态的并且在子网级别运行,因此增加了管理CIDR的大量开销。
  • 我曾想将进入规则添加到与EKS辅助节点关联的安全组中,但是由于相同的问题,这将无法正常工作。当您对Jupyterhub / EKS进行更新分发时,并且如果替换了ELB,则将“允许所有流量”入口规则隐式添加到EKS工作者节点安全组(允许来自ELB的所有流量)。这将覆盖我的进入规则。

1 个答案:

答案 0 :(得分:2)

听起来您正在为JupyterHub使用LoadBalanced服务。处理进入集群的更好方法是使用单个入口控制器(如nginx入口控制器)-通过不同的头盔图进行部署。

然后,部署JupyterHub的Helm图表,但使用通过--set参数传递到版本中的自定义值来告诉它使用ClusterIP服务而不是LoadBalancer类型。这样,对可能重新创建ClusterIP服务的JupyterHub版本所做的更改就无关紧要-因为您现在将使用Ingress Controller的Ingress Rules来管理JupyterHub的Ingress。

使用JupyterHub掌舵图的入口规则功能为您的Nginx入口控制器配置入口规则:see docs here

由Nginx入口控制器生成的LoadBalancer将保持持久/稳定,您可以在其上单独定义安全组入口规则。

实际上,您是通过使用Ingress Controller +入口规则访问模式将JupyterHub应用中的EKS应用中的入口分离的。

关于入口和负载平衡器的主题

使用EKS / Helm和负载平衡服务时,默认设置是创建面向Internet的弹性负载平衡器。

您可以在服务定义中添加一些额外的注释,以将其创建为面向内部的LoadBalancer。

这对于您的入口控制器(或您要使用LoadBalancer服务的其他任何地方)而言可能更适合您,因为它不会立即将应用程序公开给开放的Internet。您提到您已经可以访问VPC网络的VPN,因此用户仍可以进入VPN,然后点击LoadBalancer主机名。

我写了guide a while back on installing the nginx ingress controller here。它谈到要使用DigitalOcean Kubernetes进行此操作,但仍与EKS相关,因为它只是一个舵图。

我做了另一篇文章,讨论了一些可以添加到入口控制器服务中的额外配置注释,这些注释会在负载均衡器同时自动创建特定的端口范围入口安全组规则。 (这是您的另一种选择,如果您每次创建它时都必须手动更新安全组上的入口规则)。请参阅有关自定义入口here的入口控制器负载平衡器和端口范围的帖子

要自动配置LoadBalancer入口源范围并将其设置为内部所需的配置值,可以使用以下方法设置:

  1. controller.service.loadBalancerSourceRanges
  2. service.beta.kubernetes.io/aws-load-balancer-internal:0.0.0.0/0

希望有帮助!