无法在具有高级网络的 AKS 中获得真正的远程 IP

Unable to get real remote IP in AKS with advanced networking

我们有两个适用于不同环境的 AKS 集群。两者都使用 Nginx 服务器作为自定义入口。我的意思是它就像一个入口,但它只是一个服务背后的普通 Nginx 部署。该设置有几个很好的理由,主要原因是我们开始时 AKS 中不存在入口。

服务定义如下:

apiVersion: v1
kind: Service
metadata:
  name: <our name>
  namespace: <our namespace>
spec:
  ports:
  - port: 443
    targetPort: 443
  selector:
    app: <our app>
  loadBalancerIP: <our ip>
  type: LoadBalancer
  externalTrafficPolicy: Local

我们已经用真实的ip模块配置了Nginx:

real_ip_header X-Original-Forwarded-For;
set_real_ip_from 10.0.0.0/8; # or whatever ip is correct

一个环境使用旧的基本网络,networkPlugin=kubenet。 Nginx 在日志中记录真实的客户端 IP 地址,并可以将它们用于访问控制。另一个使用高级网络,networkPlugin=azure。 Nginx 记录其中一个节点的 IP 地址,这是无用的。 X-Original-Forwarded-For 和标准 X-Forwarded-For headers 都是空的,当然源 IP 来自节点,而不是来自客户端。

有办法解决这个问题吗?如果可能的话,我们希望避免定义 "real" 入口,因为我们自己的 Nginx 服务器包含很难在这样的设置中复制的自定义配置,而且不清楚标准入口是否有帮助?

微软现在应该已经为真正的入口修复了这个问题。但是,显然该修复程序并未涵盖我们的情况,即 Nginx 作为具有高级网络的服务背后的 pod 运行。我们被告知使用 denniszielke 在 https://github.com/Azure/AKS/issues/607 中发布的解决方法,其中定期更新所有节点的 iptables。在我看来很脏,但它确实有效。

我们仍然使用 "externalTrafficPolicy: Local" 定义的服务,并且我们已经从 link 安装了 ConfigMap 和 DaemonSet。我更改了脚本以减少日志记录,并将两者都移到了另一个命名空间。