kubernetes 对traefik之后的API的请求在30秒后超时

lzfw57am  于 5个月前  发布在  Kubernetes
关注(0)|答案(2)|浏览(102)

我有一个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"

zy1mlcev

zy1mlcev1#

502服务器错误可能是由于客户端在sleep延迟完成之前关闭请求而导致的上下文取消。
尽管您配置了入口点和服务器传输的超时设置,这在理论上应该可以解决问题。但是,问题可能出在其他地方。
您可以尝试增加Traefik的空闲超时或禁用空闲连接终止。
您可以设置
--entryPoints.websecure.transport.idleTimeout
--entryPoints.web.transport.idleTimeout标记为高于30秒的值,以增加空闲超时。
YAML

"--entryPoints.websecure.transport.idleTimeout=300s"

个字符
或者您可以尝试将--entryPoints.websecure.transport.idleTimeout--entryPoints.web.transport.idleTimeout标志设置为0.
YAML

"--entryPoints.websecure.transport.idleTimeout=0s"
"--entryPoints.web.transport.idleTimeout=0s"

的字符串

uurity8g

uurity8g2#

原来这是GKE的问题。后端服务的默认超时时间为30秒。
我不知道为什么,但是从NodePort切换到LoadBalancer服务修复了超时问题。这是我的图表配置现在的样子:

ingressClass:
  enabled: true
  isDefaultClass: false

additionalArguments:
  - "--log.level=DEBUG"
  - "--providers.kubernetesingress.ingressclass=traefik"
  - "--ping"

dashboard:
  enabled: true
rbac:
  enabled: true

providers:
  kubernetesCRD:
    enabled: true

ports:
  web:
    port: 8000
    expose: true
    exposedPort: 80
    protocol: TCP

  websecure:
    port: 8443
    expose: true
    exposedPort: 443
    protocol: TCP

service:
  enabled: true

requests:
  cpu: "100m"
  memory: "100Mi"

字符串

相关问题