nginx - 无法通过高级网络在 AKS 中获取真正的远程 IP

标签 nginx networking kubernetes azure-aks

我们有两个适用于不同环境的 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/

相关文章:

nginx - 重定向到 Nginx 列表中的随机条目

c - 从字符串中可靠地拆分行

c - C : UDP send() taking 6 - 260 micro sec, 中的套接字编程如何使其更快

kubernetes - 如何测试 ClusterIssuer 求解器?

kubernetes - 当静态 Assets 发生变化时,Kubernetes是否具有支持零停机部署的功能?

nginx - 无法让 ab 测试与 gzip 一起使用

Django : Serving static files through nginx

node.js - 如何使用 nginx docker 容器访问 localhost 上的服务器?

python - 更大的应用程序如何处理潜在的(网络)套接字端口冲突?

kubernetes - 如何删除NodePort Kubernetes-Traefik入口 Controller