在 GKE 中保留客户端 IP

问题描述 投票:0回答:1

我在 GKE 集群中的 nginx 入口控制器后面有一个后端应用程序,我想将某个 IP 列入白名单以仅访问它。我在关联的入口中添加了此注释:

nginx.ingress.kubernetes.io/whitelist-source-range: "my-ip/32"

我还在入口控制器服务中将

externalTrafficPolicy
设置为
Local

问题是,当我点击我的应用程序时,它总是返回

403 Forbidden
当我点击应用程序时,入口控制器日志中会记录
access forbidden by rule, client: 127.0.0.1, server: my-appliaction.domain.ext
,这意味着客户端 IP 不会转发到入口控制器。

这是我的 Ingress 清单:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my_app
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: x.x.x.x/32
spec:
  ingressClassName: nginx
  rules:
  - host: my_app.company.com
    http:
      paths:
      - backend:
          service:
            name: my_app
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - my_app.company.com
    secretName: certificate.tls

我错过了什么吗?

提前致谢。

google-kubernetes-engine nginx-ingress
1个回答
-1
投票

要在 GKE 中保留客户端 IP,我们可以遵循以下 2 种方法:

方法1:如果要为所有入口规则配置客户端ip,我们必须全局设置该ip,并且应在NGINX ConfigMap的whitelist-source-range中设置whitelist-source-range值。您可以使用 ngx_http_access_module

注意: 所有入口控制器都不支持白名单,您可以从此文档交叉检查您的入口控制器。

方法 2: 如果您不想为所有入口规则配置 IP - 您需要创建两个单独的入口。第一个入口用于白名单主机,第二个入口用于您的主机。

编辑:
根据关于 LoadBalancer 服务参数的官方 GCP 文档:

设置为“本地”时,GKE 仅路由来自节点上客户端 Pod 的数据包 在同一节点上为 Pod 提供服务。设置为集群时,GKE 路由 来自节点上客户端 Pod 的数据包为任何节点上的 Pod 提供服务。了解更多 详情请参见服务内部流量策略

还可以尝试跨代理保留目标源以启用代理协议,请参阅类似的Github评论打开Github问题了解更多详细信息。

还有

© www.soinside.com 2019 - 2024. All rights reserved.