AKS部署多Nginx Ingress控制器的Ingress绑定配置方法
第二套Nginx Ingress控制器(Local模式源IP透传)部署&服务绑定实操
1. 第二套Ingress控制器Helm部署配置要点
你现有Ansible逻辑里缺几个避免冲突、开启源IP保留的核心参数,补全后直接部署即可:
- 必须为第二套控制器创建独立的IngressClass,不能复用默认的
nginx类名,比如给透传源IP的这套起名为nginx-local - 给控制器配置独立的选主ID、资源名前缀,避免和第一套控制器抢占配置资源
- 服务设置
externalTrafficPolicy: Local,这是Local模式保留源IP的核心配置,流量不会在节点间做SNAT转发 - 确认关闭控制器对无类Ingress的默认监听,避免乱接管第一套控制器的存量资源
对应修改后的Ansible Helm部署示例如下:
- name: Create NGINX Load Balancer (Source IP Local Mode) w/ IP {{ aks_local_lb_ip }} command: > helm upgrade nginx-local ingress-nginx/ingress-nginx -n kube-system --set controller.ingressClassResource.name=nginx-local --set controller.ingressClassResource.enabled=true --set controller.ingressClass=nginx-local --set controller.electionID=nginx-local-leader --set controller.ingressClassByName=true --set controller.watchIngressWithoutClass=false --set controller.service.loadBalancerIP="{{ aks_local_lb_ip }}" --set controller.service.annotations."service\.beta\.kubernetes\.io\/azure-load-balancer-internal"="true" --set controller.service.externalTrafficPolicy=Local --set controller.replicaCount="{{ nginx_replica_count }}" --version {{ nginx_chart_ver }} --install
如果你实际用的是Bitnami维护的Nginx Ingress Chart,核心参数逻辑一致,只是参数键名稍有区别,重点保证独立IngressClass、Local流量策略两个配置即可。
2. Ingress资源绑定指定控制器的配置方法
你猜测的方向是对的,Ingress v1正式版已经废弃了旧版的kubernetes.io/ingress.class注解,直接在spec层加ingressClassName字段,值填你给第二套控制器设置的IngressClass名即可完成绑定,不需要额外加其他注解。
修改后的Ingress模板示例如下,注意删掉旧的ingress.class注解:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{ template "service.fullname" . }} labels: app: {{ template "service.name" . }} chart: {{ template "service.chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} annotations: nginx.ingress.kubernetes.io/proxy-body-size: {{ .Values.ingress.proxy_body_size }} nginx.ingress.kubernetes.io/rewrite-target: /$1 nginx.ingress.kubernetes.io/add-base-url: "true" nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/proxy-read-timeout: "{{ .Values.ingress.proxy_read_timeout }}" nginx.ingress.kubernetes.io/proxy-send-timeout: "{{ .Values.ingress.proxy_send_timeout }}" nginx.ingress.kubernetes.io/proxy-connect-timeout: "{{ .Values.ingress.proxy_connect_timeout }}" spec: # 绑定第二套源IP透传用的Ingress控制器 ingressClassName: nginx-local tls: - hosts: - "{{ .Values.service_url }}" secretName: tls-secret rules: - host: "{{ .Values.service_url }}" http: paths: - pathType: Prefix path: "/?(.*)" backend: service: name: {{ template "service.name" . }} port: number: {{ .Values.service.port }}
注意:不要同时使用旧版
kubernetes.io/ingress.class注解和新版spec.ingressClassName字段,否则会出现绑定冲突。部署完成后可以查看Ingress资源的ADDRESS字段,如果显示为你给第二套LB配置的静态IP,就说明绑定成功,此时访问服务拿到的X-Forwarded-For头、Nginx日志里的客户端IP就是真实源地址。
内容的提问来源于stack exchange,提问作者Branden
相关产品推荐
相关产品推荐

