我在 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
我错过了什么吗?
提前致谢。
要在 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问题了解更多详细信息。
还有