【问题标题】:How do I restrict access to Kubernetes service?如何限制对 Kubernetes 服务的访问?
【发布时间】:2019-11-09 00:00:39
【问题描述】:

我正在尝试使用以下 yaml 创建服务。如您所见,我正在尝试限制对 10.0.0.0/8 范围内的服务的访问。

apiVersion: v1
kind: Service
metadata: 
  name: nginx-service
spec: 
  ports:
    # the port that this service should serve on
    - port: 443
      targetPort: 443
  # label keys and values that must match in order to receive traffic for this service
  selector: 
    name: nginx
  type: LoadBalancer
  loadBalancerSourceRanges:
  - 10.0.0.0/8

有一些 Kubernetes 文档(如下所列)讨论了如何使用 loadBalancerSourceRanges 注解来控制服务访问。

http://kubernetes.io/docs/user-guide/services-firewalls/

但是,当我尝试创建此服务时,出现如下错误

错误验证“sdp-cluster.yaml”:错误验证数据:找到 v1.ServiceSpec 的无效字段 loadBalancerSourceRanges;如果你 选择忽略这些错误,关闭验证 --validate=false

我查看了 v1.ServiceSpec 也找不到它。

我错过了什么吗?如何限制 Kubernetes 中服务的流量?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    现在 GCE、GKE 和 AWS 支持此功能。如果提供者不支持,则会被忽略。Kubernetes Doc

    apiVersion: v1
    kind: Service
    metadata:
        name: myapp
    spec:
        ports:
        - port: 8765
            targetPort: 9376
        selector:
        app: example
        type: LoadBalancer
        loadBalancerSourceRanges:
        - 10.0.0.0/8
    

    【讨论】:

      【解决方案2】:

      loadBalancerSourceRanges 仅在 1.3 中提升为字段。它一直是一个名为 https://github.com/kubernetes/kubernetes/blob/master/pkg/api/service/annotations.go#L27 的注解(嗯,因为该功能存在于 1.2 中),现在已被弃用,因为我们已将其提升为一个字段。

      请注意,注释/字段是一个 whilelist,但它仅适用于受支持的云提供商。如果您将其设置为 10.0/8,则您只能从您的 kube 集群 within 访问端点(即负载均衡器 ip 的行为类似于 clusterIP)。即使是同一云提供商中集群外部的节点也必须通过 NAT 访问公共 ip,这意味着数据包上的源 ip 不会是 10 点,因此它不会通过防火墙。您可以将其设置为公共 ip,并且只有该客户端才能访问您的服务。

      【讨论】:

      • 感谢 Prashanth B。在发布问题之前,我已经阅读了您发布的内容。但是,在 1.2 版中没有具体的说明或代码示例来使其正确。所以它让我猜测了一段时间。然后我找到了解决办法。
      【解决方案3】:

      发现问题并解决。 1.2 版不支持“loadBalancerSourceRanges”字段,但它支持将其作为注释。所以将我的 yaml 修复如下,效果很好。

      apiVersion: v1
      kind: Service
      metadata: 
        name: nginx-service
        annotations: 
          service.beta.kubernetes.io/load-balancer-source-ranges: "a.b.c.d/8, x.y.0.0/24"
      spec: 
        ports:
          # the port that this service should serve on
          - port: 443
            targetPort: 443
        # label keys and values that must match in order to receive traffic for this service
        selector: 
          name: nginx
        type: LoadBalancer
      

      【讨论】:

      【解决方案4】:

      我发现的只是一个小补充,以防万一有人遇到同样的问题。 Google Container Engine 似乎已升级到 Kubernetes 1.3,这意味着它不会验证新的 loadBalancerSourceRanges 语法,但它似乎并不真正支持新语法,这意味着该字段被忽略。目前,仍然需要设置注释,否则负载均衡器最终将公开可用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-04
        相关资源
        最近更新 更多