簡體   English   中英

Kubernetes Ingress 非根路徑 404 Not Found

[英]Kubernetes Ingress non-root path 404 Not Found

當我嘗試<NodeIP>:30080時,我有以下配置

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        name: app-node
    spec:
      containers:
        - name: app
          image: myregistry.net/repo/app:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
          env:
            - name: NODE_ENV
              value: production
---
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    name: app-node
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30080
  type: NodePort

我正在嘗試使用入口:

 apiVersion: extensions/v1beta1
 kind: Ingress
 metadata:
   name: nginx-ingress
 spec:
   rules:
   - host: myhost.com
     http:
       paths:
       - path: /app
         backend:
           serviceName: app-service
           servicePort: 80

myhost.com與 nginx 介紹屏幕一起使用,但myhost.com/app給出404 Not Found 我的設置問題出在哪里?


更新:

   - path: /
     backend:
       serviceName: app-service
       servicePort: 80

如果我執行根路徑,它可以工作,但是/app怎么沒有?

您的入口定義創建了將流量從{path}代理到{backend.serviceName}{path}的規則。 在您的情況下,我認為它不起作用的原因是/app被代理到app-service:80/app但您打算在/根目錄提供流量。 嘗試將此注釋添加到您的入口資源: nginx.ingress.kubernetes.io/rewrite-target: /

來源: https ://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/rewrite

正如brandon-barnett 所指出的,問題出在路徑上,但在閱讀了他分享的鏈接之后,對你來說,布蘭登大吃一驚,我意識到必須指定更具體的重寫規則才能使其正常工作。 就我而言

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  ingressClassName: nginx
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: http-svc
            port: 
              number: 80

訣竅是在注釋處使用 /$2 ,在路徑處使用 (/|$)(.*) 。 所以這個重寫做了什么,它選擇了一些東西之后的所有東西/並用它替換了 $2,所以:

  • rewrite.bar.com/something 重寫為 http-svc:80/
  • rewrite.bar.com/something/ 重寫為 http-svc:80/
  • rewrite.bar.com/something/new 重寫為 http-svc:80/new
  • rewrite.bar.com/something/new/old 重寫為 http-svc:80/new/old

如果它對其他人有用:

我有同樣的事情,它與 Kubernetes Ingress Nginx 無關。 它是我的 pod 中運行 UI 的 Nginx 服務器(在我的例子中是 Vue.JS)。

解決方案

  1. 將 nginx.conf 文件添加到我的 UI 應用程序。
     user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; server { listen 80; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } } }
  2. 將此行添加到我的 Dockerfile 中,以便 Vue.js 應用程序將 nginx.conf 復制到您的容器中。
     # production stage FROM nginx:stable-alpine as production-stage COPY nginx.conf /etc/nginx/ COPY --from=build-stage /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]

參考:https://stackoverflow.com/a/54193517/4059810

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM