运行 多 pod 的 nginx 入口 504 超时

nginx ingress 504 timeout with running multi pod

我是 运行 Kubernetes 上带有 nginx ingress 的特定部署的 2 个 pod(副本)。服务也使用网络套接字。

我删除了 2 个 pod 中的一个 pod,因此当 1 个处于就绪状态时它又开始创建。在此期间,我尝试打开 URL 并收到错误 504 网关超时。

据我了解,流量必须从 Kubernetes 服务转移到就绪状态 pod。我是否遗漏了什么请告诉我?

提前致谢。

如果有错误,这里是我的入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: core-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: core-prod
    nginx.ingress.kubernetes.io/proxy-body-size: 50m
    nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/secure-backends: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/websocket-services: core
    nginx.org/websocket-services: core
spec:
  tls:
  - hosts:
    - app.wotnot.io
    secretName: core-prod
  rules:
  - host: example.io
    http:
      paths:
      - backend:
          serviceName: core
          servicePort: 80

服务不能保证 100% 的正常运行时间,特别是如果只有 2 个 pods。根据您提出请求的时间,可能会出现多种结果之一。

  1. 您尝试在 pod 标记为 notReady 之前打开 URL。在这种情况下,您的服务会将请求转发给即将终止的 Pod。由于 pod 即将终止并且网络服务器正在关闭,因此 pod 不再能够响应,因此 nginx 以 504 响应。也有可能会话已经与该 pod 启动并且由于 sigterm

  2. 一旦第二个 pod 处于终止状态,您就发送一个请求。您的主 pod 因处理 100% 的请求而超负荷工作,因此响应速度不够快,因此 nginx returns 出错。

在任何情况下,您最好的选择是检查 nginx 入口容器日志以查看返回 504 的原因,以便您可以进一步调试它。

请注意,如上所述,服务只包括 pods 标记为就绪,但是,这并不能保证 100% 的请求将始终得到正确处理。任何时候由于任何原因关闭 pod 时,总是有可能返回 5xx 错误。拥有更多的 pods 会降低返回错误的几率,但很少会完全消除几率。