我已经为应用程序设置了入口,但想将我的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。
我还用这个配置创建了一个配置映射:
data:
use-forwarded-headers: "true"
在容器中的nginx.conf中,我可以看到它已经被正确地传递/配置,但我仍然得到一个403禁止,仍然只有来自集群节点的客户端ip。
我在一个AKS集群上运行,nginx入口控制器位于Azure负载均衡器后面。nginx入口控制器svc被公开为类型负载平衡器,并锁定在svc打开的节点端口上。
我需要在Nginx中配置其他东西吗?
如果您已经使用Helm图表安装了nginx ingress,您可以简单地使用controller.service.externalTrafficPolicy: Local
配置values.yaml
文件,我相信这将适用于您的所有服务。否则,您可以使用service.spec.externalTrafficPolicy: Local
配置特定的服务,以在这些特定的服务上实现相同的效果。
以下是一些资源,以进一步了解:
- k8s文档-保留客户端源IP
- k8s文档-使用源IP
听起来你的Nginx入口控制器在NodePort(或LoadBalancer(服务后面,或者更确切地说是在kube代理后面。通常,为了让您的控制器看到原始连接IP,您需要使用hostNetwork端口部署它,以便它直接侦听传入流量。