我有一個 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 - 找不到節點。