社区版Nginx Ingress如何为不同路径配置差异化参数?
我在Kubernetes集群中使用社区版Nginx Ingress暴露不同服务,现在需要给WebSocket对应的/ws路径单独配置proxy-read-timeout和proxy-send-timeout(值为3600),但不想让这些超时设置影响其他路径。社区版不支持NGINX Inc版的主从合并Ingress功能,也不能手动修改nginx.conf,请问该怎么实现?
我的Ingress简化结构如下(已修正原配置格式错误):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nlb-ingress namespace: test annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/rewrite-target: "/$2" spec: ingressClassName: "nginx" rules: - host: cafe.example.com http: paths: - path: /banana(/|$)(?:.*) pathType: Prefix backend: service: name: banana-svc port: number: 5678 - path: /webapp(/|$)(.*) pathType: Prefix backend: service: name: webapp port: number: 80 - path: /ws pathType: Prefix backend: service: name: ws-svc port: number: 8008
另外,这种路径级的差异化配置也能满足我其他需求(比如灵活的重写目标),希望方案具备通用性。
方案一:拆分多个Ingress资源(推荐,直观易维护)
社区版Nginx Ingress允许同一域名下创建多个Ingress资源,控制器会自动合并这些配置。你可以为WebSocket路径单独创建一个Ingress,仅在这个Ingress上添加超时注解,其他路径保留在原Ingress中。
WebSocket专属Ingress示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nlb-ingress-ws namespace: test annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" spec: ingressClassName: "nginx" rules: - host: cafe.example.com http: paths: - path: /ws pathType: Prefix backend: service: name: ws-svc port: number: 8008
原Ingress调整(移除/ws路径):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nlb-ingress-main namespace: test annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/rewrite-target: "/$2" spec: ingressClassName: "nginx" rules: - host: cafe.example.com http: paths: - path: /banana(/|$)(?:.*) pathType: Prefix backend: service: name: banana-svc port: number: 5678 - path: /webapp(/|$)(.*) pathType: Prefix backend: service: name: webapp port: number: 80
这种方式无需额外的Nginx配置知识,每个Ingress职责清晰,后续调整方便,完全满足路径级差异化配置的需求。
方案二:使用配置片段(Configuration Snippets)
如果不想拆分Ingress,可以利用社区版支持的nginx.ingress.kubernetes.io/configuration-snippet注解,插入Nginx原生配置,仅匹配/ws路径设置超时。
修改原Ingress的注解部分,添加配置片段:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nlb-ingress namespace: test annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/rewrite-target: "/$2" nginx.ingress.kubernetes.io/configuration-snippet: | location ~* ^/ws { proxy_read_timeout 3600s; proxy_send_timeout 3600s; } spec: ingressClassName: "nginx" rules: - host: cafe.example.com http: paths: - path: /banana(/|$)(?:.*) pathType: Prefix backend: service: name: banana-svc port: number: 5678 - path: /webapp(/|$)(.*) pathType: Prefix backend: service: name: webapp port: number: 80 - path: /ws pathType: Prefix backend: service: name: ws-svc port: number: 8008
注意:配置片段中的Nginx规则优先级需与Ingress的路径匹配逻辑一致,这里用~* ^/ws匹配所有以/ws开头的请求,确保覆盖WebSocket路径的所有子请求。这种方式适合需要更精细化Nginx配置的场景,但要求你熟悉Nginx的location匹配规则。
内容的提问来源于stack exchange,提问作者Bertone

