我有一个API here来测试我在k8s集群中的Traefik配置。这个API接受一个查询,并在延迟后发送回来。这是我用来测试API的命令:
curl -X 'POST' 'https://apps.peregimenez.com/corstest' -H 'accept: application/json' -H 'Content-Type: application/json' -H "Origin: https://peregimenez.com" -d '{ "query": "hello there", "sleep":30 }' -i --max-time 60
字符串
如果延迟小于30秒,它可以工作。但是,如果超过30秒,我会得到502 Server Error
。Traefik日志显示
time="2023-11-30T11:42:54Z" level=debug msg="'499 Client Closed Re │
│ quest' caused by: context canceled"
型
我试过在 Helm 图中设置更高的超时,也试过将它们设置为0来禁用它们,但都没有用。我做错了什么?
这是我的图表yaml:
ingressClass:
enabled: true
isDefaultClass: false
additionalArguments:
- "--log.level=DEBUG"
- "--providers.kubernetesingress.ingressclass=traefik"
- "--ping"
- "--entryPoints.websecure.transport.respondingTimeouts.readTimeout=300s"
- "--entryPoints.websecure.transport.respondingTimeouts.writeTimeout=300s"
- "--entryPoints.websecure.transport.respondingTimeouts.idleTimeout=300s"
- "--entryPoints.websecure.transport.lifeCycle.graceTimeOut=300s"
- "--entryPoints.web.transport.respondingTimeouts.readTimeout=300s"
- "--entryPoints.web.transport.respondingTimeouts.writeTimeout=300s"
- "--entryPoints.web.transport.respondingTimeouts.idleTimeout=300s"
- "--entryPoints.web.transport.lifeCycle.graceTimeOut=300s"
- "--serversTransport.forwardingTimeouts.responseHeaderTimeout=300s"
- "--serversTransport.forwardingTimeouts.idleConnTimeout=300s"
dashboard:
enabled: true
rbac:
enabled: true
providers:
kubernetesCRD:
enabled: true
ports:
web:
port: 8000
expose: true
exposedPort: 80
protocol: TCP
nodePort: 32080
websecure:
port: 8443
expose: true
exposedPort: 443
protocol: TCP
nodePort: 32443
service:
enabled: true
type: NodePort
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "100m"
memory: "100Mi"
型
2条答案
按热度按时间zy1mlcev1#
502服务器错误可能是由于客户端在
sleep
延迟完成之前关闭请求而导致的上下文取消。尽管您配置了入口点和服务器传输的超时设置,这在理论上应该可以解决问题。但是,问题可能出在其他地方。
您可以尝试增加Traefik的空闲超时或禁用空闲连接终止。
您可以设置
--entryPoints.websecure.transport.idleTimeout
和--entryPoints.web.transport.idleTimeout
标记为高于30秒的值,以增加空闲超时。YAML
个字符
或者您可以尝试将
--entryPoints.websecure.transport.idleTimeout
和--entryPoints.web.transport.idleTimeout
标志设置为0.
YAML
的字符串
uurity8g2#
原来这是GKE的问题。后端服务的默认超时时间为30秒。
我不知道为什么,但是从NodePort切换到LoadBalancer服务修复了超时问题。这是我的图表配置现在的样子:
字符串