Ich habe eine VueJS-Anwendung, die in einem Docker-Image in Kubernetes ausgeführt wird. Sobald mehrere Replikate/Pods vorhanden sind, können Clients die Anwendung nicht laden – viele (aber nicht alle) Aufrufe zum Laden von Dateien geben 404 zurück.
Ich denke, das liegt daran, dass sie an einen anderen Pod gesendet werden als den Pod, der die Anfrage ursprünglich bearbeitet hat.
Wie kann dieses Problem gelöst werden?
Das ist mein Setup:
Hier ist ein Beispielaufruf, der 404 zurückgibt: Holen Sie sich https://myapp.mydomain.com/js/chunk-d18c0136.7a3f0664.js
Das ist mein Leistungsverzeichnis:
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}
Dies ist meine Nginx-Eintragsspezifikation:
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
Um dieses Problem zu umgehen, konfigurieren wir die Firewall so, dass sie direkt mit nur einem Pod kommuniziert oder nur ein Replikat ausführt.
Das Setzen von Session-Sticky-Cookies auf Nginx-Ingress funktioniert nicht.
抱歉,这完全是在转移注意力。
最终,问题是外部代理路由中的拼写错误 - 六个节点中只有两个节点配置正确且可访问。这就是为什么“大多数”请求返回 404 - 找不到节点。