nginx入口控制器正向源ip

时间:2020-04-01 10:28:06

标签: nginx kubernetes kubernetes-ingress nginx-config nginx-ingress

我已经为应用程序设置了一个入口,但想将我的IP地址列入白名单。所以我创建了这个Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: ${MY_IP}/32
  name: ${INGRESS_NAME}
spec:
  rules:
  - host: ${DNS_NAME}
    http:
      paths:
      - backend:
          serviceName: ${SVC_NAME}
          servicePort: ${SVC_PORT}
  tls:
  - hosts:
    - ${DNS_NAME}
    secretName: tls-secret

但是当我尝试访问它时,我被禁止使用403,并且在nginx日志中,我看到了一个客户端IP,但这是来自群集节点之一而不是我的家庭IP。

我还使用以下配置创建了一个configmap:

data:
  use-forwarded-headers: "true"

在容器的nginx.conf中,我可以看到它已经正确传递/配置,但是仍然收到403禁止,仍然只有来自群集节点的客户端ip。

我正在AKS群集上运行,nginx入口控制器位于Azure负载平衡器的后面。 Nginx入口控制器svc作为类型的loadbalancer公开,并锁定在svc打开的节点端口上。

我需要在Nginx中配置其他内容吗?

2 个答案:

答案 0 :(得分:1)

如果您已经在Helm chart上安装了nginx-ingress,则只需使用values.yaml来配置controller.service.externalTrafficPolicy: Local文件,我相信它将适用于所有服务。否则,您可以使用service.spec.externalTrafficPolicy: Local配置特定的服务,以对那些特定的服务获得相同的效果。

这里有一些资源可以增进您的理解:

答案 1 :(得分:0)

听起来您的Nginx Ingress控制器位于NodePort(或LoadBalancer)服务的后面,或者位于kube-proxy的后面。通常,要让您的控制器查看原始连接IP,您需要使用hostNetwork端口进行部署,以便其直接侦听传入的流量。