我正在使用 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 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
注释。