【问题标题】:Different Firewall Rules for Kubernetes ClusterKubernetes 集群的不同防火墙规则
【发布时间】:2018-06-02 21:55:10
【问题描述】:

我在一个 K8s 集群中运行一些内部服务和一些面向客户的服务。内部服务应该只能从某些特定的 ip 访问,面向客户的服务应该可以在全球范围内访问。

所以我创建了我的 Ingresses 和一个 nginx Ingress Controller 以及一些带有适当 ip 过滤器的 K8s LoadBalancer 服务。

现在我看到 GCP 中的那些防火墙规则是在幕后创建的。但它们是相互冲突的,“面向客户”的防火墙规则推翻了“内部”的规则。因此,我的 K8s 集群的所有内容都在全球范围内可见。

用例对我来说听起来并不那么奇特 - 你知道如何让 K8s 集群的某些部分受到防火墙规则的保护,而某些部分在任何地方都可以访问吗?

【问题讨论】:

  • 使用“内部”,您的意思是可以从您的集群中的其他 pod 访问?或者您的意思是可以从您的本地网络访问?还是可以从您的 GCP 项目访问?
  • 我的意思是这些服务需要可以从我们的本地网络访问。
  • 您的 GCP 和本地网络的范围是多少?它们重叠吗?
  • 不,它们不重叠。与此同时,我找到了解决方案。如果我部署 2 个不同的入口、入口控制器、具有不同防火墙设置在不同端口上运行的负载均衡器,我可以实现我的目标......但缺点是有一些非标准端口,例如 myservice.mydomain.wtf:12345
  • 你不应该使用 2 个入口控制器。

标签: kubernetes google-cloud-platform


【解决方案1】:

令人惊讶的是,由 Kubernetes Ingress 对象创建的 GCP 中的 L7 (http/https) 负载均衡器默认情况下没有 IP 白名单功能,因此您所描述的工作正常。您可以使用X-Forwarded-For 标头进行过滤(请参阅Setting Up HTTP(S) Load Balancing 下的目标代理)。

白名单将通过Cloud Armour 提供,目前处于私人测试阶段。

为了让这种情况稍微复杂一点:由 Kubernetes LoadBalancer 对象(因此,不是 Ingress)创建的 GCP 中的 L4 (tcp/ssl) 负载均衡器确实具有 IP 过滤功能。为此,您只需在服务上设置.spec.loadBalancerSourceRanges。当然,Service 不会为您提供基于 url/host 的路由,但您可以通过部署像 nginx-ingress 这样的入口控制器来实现这一点。如果你走这条路,你仍然可以为你的内部服务创建入口,你只需要注释它们,以便新的入口控制器拾取它们。这是一个相当标准的解决方案,实际上比为每个内部服务创建 L7 更便宜(您只需为所有内部服务的 1 个转发规则付费)。

(上面的“内部服务”是指您需要能够从自身集群外部访问的服务,但只能从特定 IP,例如 VPN、办公室等。对于您只需要从内部访问的服务集群你应该使用type: ClusterIP)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多