我有一个 VueJS 应用程序在 kubernetes 中的 Docker 映像中运行。一旦存在多个副本/pod,客户端就无法加载应用程序 - 许多(但不是全部)加载文件的调用都会返回 404。
我认为这是因为它们被发送到与最初服务请求的 Pod 不同的 Pod。
如何解决这个问题?
这是我的设置:
这是一个返回 404 的示例调用: 获取 https://myapp.mydomain.com/js/chunk-d18c0136.7a3f0664.js
这是我的服务规范:
apiVersion: v1 kind: Service metadata: name: ${CI_PROJECT_NAME}-${CI_BUILD_REF_SLUG_SHORT} labels: app: ${CI_ENVIRONMENT_SLUG} spec: ports: - port: 80 targetPort: 8080 protocol: TCP name: ${CI_PROJECT_NAME}-${CI_BUILD_REF_SLUG} selector: app: ${CI_ENVIRONMENT_SLUG}
这是我的 nginx 入口规范:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ${CI_PROJECT_NAME}-${CI_BUILD_REF_SLUG_SHORT} labels: app: ${CI_ENVIRONMENT_SLUG} annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/proxy-connect-timeout: "30" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" spec: defaultBackend: service: name: ${CI_PROJECT_NAME}-${CI_BUILD_REF_SLUG_SHORT} port: number: 80 rules: - host: ${CI_APPLICATION_HOST} http: paths: - path: / pathType: Prefix backend: service: name: ${CI_PROJECT_NAME}-${CI_BUILD_REF_SLUG_SHORT} port: number: 80
作为一种解决方法,我们将防火墙配置为仅与一个 Pod 直接通信,或仅运行一个副本。
在 nginx 入口上设置会话粘性“cookie”不起作用。
抱歉,这完全是在转移注意力。
最终,问题是外部代理路由中的拼写错误 - 六个节点中只有两个节点配置正确且可访问。这就是为什么“大多数”请求返回 404 - 找不到节点。