如何解决如何仅在某些IP地址中在Kubernetes中公开TCP服务?
Nignx入口provides是公开tcp或udp服务的一种方式:您需要的只是公共NLB。
但是,以这种方式将tcp服务公开公开:NLB不支持安全组或acl,而且nginx-ingress在代理tcp或udp时也没有任何过滤流量的方法。
我想到的唯一解决方案是内部负载均衡器和带有haproxy或iptables的单独的非k8s实例,在这些实例中,我实际上将基于源ip受到限制-然后将请求/代理请求转发到内部NLB。
也许还有其他方法可以解决这个问题?
解决方法
-
请勿为此使用nginx-ingress。要在nginx-ingress中获得真实IP,您必须设置
controller.service.externalTrafficPolicy: Local
,这反过来又改变了nginx-ingress服务的公开方式-将其设置为节点本地。参见https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip。这又会导致您的nginx-ingress LoadBalancer拥有不健康的主机,这会在您的监视中产生噪音(与NodePort相反,每个节点都暴露相同的端口且状态良好)。除非您将nginx-ingress作为DaemonSet运行或使用其他技巧,例如限制将哪些节点作为后端添加(思维调度,扩展),或将nginx入口移至一组单独的节点/子网-IMO对于这些简单的问题,每一个都令人头疼。有关此问题的更多信息: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
一样,没有进入。
您可以使用whitelist-source-range annotation。我们已经在一些用例中成功使用了它,并且很好地完成了工作。
编辑:我讲得太早了。重读您的问题并了解您的确切用例后,我想到了issue,它明确指出这些服务不能列入白名单,并建议在防火墙级别解决此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。