我们有两个适用于不同环境的 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
我们已经为 Nginx 配置了真实的 ip 模块,如下所示:
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 header 都是空的,当然源 IP 来自节点,而不是来自客户端。
有没有解决的办法?如果可能的话,我们希望避免定义“真正的”入口,因为我们自己的 Nginx 服务器包含在这样的设置中难以复制的自定义配置,而且还不清楚标准入口是否会有所帮助?
最佳答案
微软现在应该已经修复了这个问题,以便真正进入。然而,显然修复并没有涵盖我们的情况,即 Nginx 作为具有高级网络的服务后面的 pod 运行。我们被告知使用 denniszielke 在 https://github.com/Azure/AKS/issues/607 中发布的解决方法所有节点的 iptables 都会定期更新。在我看来很脏,但它有效。
我们仍然使用“externalTrafficPolicy:Local”定义了上述服务,并且我们已经从链接安装了 ConfigMap 和 DaemonSet。我更改了脚本以减少日志记录,并将两者都移动到另一个命名空间。
关于nginx - 无法通过高级网络在 AKS 中获取真正的远程 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54767698/