如何通过Nginx Ingress Controller访问EKS Pod并实现两类请求路由规则
基于双层Nginx架构的Pod定向转发实现方案
前置架构说明
你当前的架构为「上层Nginx反向代理 -> 下层K8s集群Nginx Ingress Controller -> 业务Pod」,两种访问规则可通过分层配置实现,具体方案如下:
规则1:初始请求默认转发到对应Service
无特殊标识的普通请求走默认负载均衡逻辑,配置步骤如下:
- 上层Nginx配置默认转发规则,将请求统一透传到下层Nginx Ingress Controller的对外暴露地址
- Nginx Ingress Controller配置常规Ingress规则,匹配域名/路径后转发到业务对应的ClusterIP Service,由Service原生负载均衡策略分发到就绪的业务Pod
默认Ingress配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: business-default-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: ingressClassName: nginx rules: - host: your-business-domain.com http: paths: - path: /(.*) pathType: Prefix backend: service: name: business-service port: number: 80
规则2:携带Pod/实例标识的请求定向转发到指定Pod
针对路径带特定标识的请求,通过路径匹配+自定义请求头+Ingress规则扩展实现定向转发,步骤如下:
- 先给业务Pod配置唯一标识标签,如需直接转发到Pod需保证Ingress Controller可直接访问Pod的集群内IP
- 上层Nginx匹配带标识的请求路径,提取标识字段写入自定义请求头后透传到Ingress Controller
- Ingress通过自定义注解配置转发逻辑,识别请求头中的标识后直接转发到对应Pod
上层Nginx配置示例:
server { listen 80; server_name your-business-domain.com; # 匹配格式为/instance/{pod标识}/xxx的路径 location ~ ^/instance/([^/]+)/(.*)$ { # 提取标识写入自定义请求头 proxy_set_header X-Target-Pod-Id $1; # 转发到下层Ingress Controller地址 proxy_pass http://<Ingress对外服务IP>/$request_uri; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } # 默认请求规则 location / { proxy_pass http://<Ingress对外服务IP>; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } }
带定向转发逻辑的Ingress配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: business-sticky-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 # 按请求头中的标识做哈希绑定,确保同标识请求落到同一Pod nginx.ingress.kubernetes.io/upstream-hash-by: $http_x_target_pod_id # 也可通过自定义snippet实现精确IP转发 nginx.ingress.kubernetes.io/configuration-snippet: | if ($http_x_target_pod_id != "") { # 如需按标识映射Pod IP,可在此处新增映射逻辑替换以下配置 set $target_pod "http://$http_x_target_pod_id:80"; proxy_pass $target_pod; } spec: ingressClassName: nginx rules: - host: your-business-domain.com http: paths: - path: /instance/([^/]+)/(.*) pathType: Prefix backend: service: name: business-service port: number: 80
注意事项
- 如果用自定义Pod标识而非Pod IP作为路径参数,需要提前维护标识到Pod IP的映射关系,可通过定时调用K8s API同步最新的Pod信息更新到Nginx配置
- 如需无需路径带标识的会话绑定,可结合Cookie实现会话粘滞,替换路径传标识的逻辑
- 要确保Pod的网络策略允许Ingress Controller直接访问Pod端口
内容的提问来源于stack exchange,提问作者visrey
相关产品推荐
相关产品推荐

