如何在Kubernetes中只为特定的ip地址公开tcp服务



Nignx ingress提供了一种公开tcp或udp服务的方法:您只需要公共NLB。

然而,通过这种方式,tcp服务将被公开:NLB不支持安全组或acl,而且nginx ingress在代理tcp或udp时也没有任何方法来过滤流量。

我想到的唯一解决方案是内部负载均衡器和使用haproxy或iptables分离的非k8s实例,在那里我实际上会有基于源ip的限制,然后将/代理请求转发到内部NLB。

也许还有其他方法可以解决这个问题?

  • 不要为此使用nginx入口。为了在nginx ingress中获得真正的IP,你必须设置controller.service.externalTrafficPolicy: Local,这反过来又改变了nginx ingress服务的公开方式,使其成为节点的本地服务。看见https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-客户端源ip。这反过来又会导致nginxingress LoadBalancer的主机不健康,这会在您的监控中产生噪音(与NodePort相反,在NodePort中,每个节点都暴露相同的端口,并且是健康的(。除非你将nginx ingress作为DaemonSet运行,或者使用其他技巧,例如限制哪些节点作为后端添加(注意调度、缩放(,或者将nginxs ingress移动到一组单独的节点/子网-对于这样一个简单的问题,每一个都是非常头疼的。有关此问题的详细信息:https://elsesiy.com/blog/kubernetes-client-source-ip-dilemma

  • 使用支持的普通服务type: LoadBalancer(经典ELB(

    • 源范围:https://aws.amazon.com/premiumsupport/knowledge-center/eks-cidr-ip-address-loadbalancer/
    • service.beta.kubernetes.io/aws-load-balancer-extra-security-groups注释,以防您希望从外部管理源范围

    在这种情况下,您的流量像World -> ELB -> NodePort -> Service -> Pod一样,没有Ingress。

Yo可以使用白名单源范围注释。我们已经在几个用例中成功地使用了它,它做得很好。

编辑:我说得太早了。重读你的问题并了解你的确切用例,我想到了这个问题,它明确指出这些服务不能被列入白名单,并建议在防火墙级别解决这个问题。

最新更新