为 Nginx Ingress http 规则中的每个路径自定义不同的 nginx 行为

问题描述 投票:0回答:1

我正在使用 nginx ingress(社区版)在 Kubernetes 集群中提供不同的服务,同时尝试优化成本。

我在尝试添加 websocket 规则时遇到问题,尽管控制器支持开箱即用,但实际上需要(如果我理解正确的话)使用注释进行设置:

nginx.ingress.kubernetes.io/proxy-read-timeout: 3600
nginx.ingress.kubernetes.io/proxy-send-timeout: 3600

现在我只想将此设置用于 websocket 利用的 http 路径,而不用于其他路径。我怎样才能做到这一点?

-- 额外信息 --

我尝试查看文档,但没有找到任何方法来对此进行微调,并且手动更改

nginx.conf
似乎不是一个选项。此外,nginx inc 控制器具有与 master 和 minions 的“可合并”入口,我想可以通过注释轻松获得不同的配置,但社区版不支持它(而且我不想切换到有限的免费 nginx inc 控制器) .

作为额外的细节,nginx inc 版本允许您使用注释指定 websockets 服务

nginx.org/websocket-services: "ws-svc"
,它在社区版中不可用(我不确定它的作用)。

为了完整起见,我将在此处粘贴与我的入口类似的结构,而不包括所有不相关的内容

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

此外,能够以不同方式自定义入口资源中的路径也将帮助我获得其他事物/参数,例如更好的重写目标,因此我猜想这里应用的任何解决方案也将通过注释应用于其他配置。

nginx kubernetes-ingress nginx-reverse-proxy nginx-ingress aws-nlb
1个回答
0
投票

你是对的,NGINX Ingress Controller 通过可合并 Ingresses 可以实现这种行为。 OSS 和 Plus NGINX 入口控制器均支持可合并入口。

如果您想在 NGINX Ingress Controller 中使用

proxy_send_timeout
proxy_read_timeout
指令,您可以使用这些注释

  • nginx.org/proxy-send-timeout
  • nginx.org/proxy-read-timeout

您可以在docs中查看支持的注释的完整列表。

手动更改 nginx.conf 似乎不是一个选项

这是一个选项,可以通过两种方式实现,一种是使用 snippets,另一种是使用 templatelating(如果您要更改的是

nginx.conf
,则这是
main-template
)。片段是更容易维护的,因此请始终首先考虑这一点。您可以使用配置映射
定位
http
stream块,或者使用配置映射或注释(如果您希望它们仅位于特定入口上,则可以使用注释)定位server
location
块。不过,我认为您不需要针对您所询问的行为的片段或模板。

作为额外的细节,nginx inc 版本允许您使用注释 nginx.org/websocket-services: "ws-svc" 指定 websockets 服务,该注释在社区版中不可用(我不确定它的作用)。

这在 OSS 中也可用,通常,任何以

.org

 结尾的注释都在 OSS(和 Plus)中可用。 
.com
 是 Plus 功能,因为它们是 NGINX Plus 功能。这个 
nginx.org/websocket-services
 注释的作用是通知 NGINX Ingress Controller 哪些服务是 websocket 服务。在幕后发生的事情是这两个指令被添加到使用 websocket 服务的位置块中。

proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;
您可以在

此处查看使用此指令的示例。我已将其复制到下面。正如您所看到的,/ws

路径使用的服务
ws-svc
nginx.org/websocket-services
注释中被引用,告诉NGINX Ingress Controller在生成的配置中的
proxy_set_header
中插入两个
location /ws
指令。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress annotations: nginx.org/websocket-services: "ws-svc" spec: rules: - host: cafe.example.com http: paths: - path: /tea pathType: Prefix backend: service: name: tea-svc port: number: 80 - path: /coffee pathType: Prefix backend: service: name: coffee-svc port: number: 80 - path: /ws pathType: Prefix backend: service: name: ws-svc port: number: 8008
最后,要将您在下面提到的这两个注释放在特定路线上,您将需要使用可合并入口。

  • nginx.org/proxy-send-timeout
    
    
  • nginx.org/proxy-read-timeout
    
    
您可以使用

可合并入口示例来实现此目的。修改 master 和 minion 以获得您想要的行为。看起来您将在路径 /ws

 上有一个小黄人,并且设置了 
nginx.org/proxy-send-timeout
nginx.org/proxy-read-timeout
nginx.org/websocket-services
 注释。

© www.soinside.com 2019 - 2024. All rights reserved.