未找到Kubernetes入口非根路径404

atk*_*yla 6 nginx kubernetes kubernetes-ingress nginx-ingress

我尝试以下配置时有效 <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
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Ingress:

 apiVersion: extensions/v1beta1
 kind: Ingress
 metadata:
   name: nginx-ingress
 spec:
   rules:
   - host: myhost.com
     http:
       paths:
       - path: /app
         backend:
           serviceName: app-service
           servicePort: 80
Run Code Online (Sandbox Code Playgroud)

myhost.com可与nginx简介屏幕配合使用,但myhost.com/app提供404 Not Found。我的设置中的问题在哪里?


更新:

   - path: /
     backend:
       serviceName: app-service
       servicePort: 80
Run Code Online (Sandbox Code Playgroud)

如果我执行根路径,则可以,但是为什么/app不行呢?

bra*_*ett 10

您的入口定义会创建规则,以代理从{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

  • 如果我理解正确,是的,我想要`myhost.com/app/foo =&gt; app-service:80/foo`,而不是`myhost.com/app/foo =&gt; app-service:80/app/foo`。这解释了为什么我的配置是错误的,以及为什么只有根配置(`path: /`)有效,但是 `nginx.ingress.kubernetes.io/rewrite-target: /` 似乎没有正确指向它。我也试过 `ingress.kubernetes.io/rewrite-target: /` 没有运气。 (2认同)

Kwa*_*Csc 9

正如 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
Run Code Online (Sandbox Code Playgroud)

诀窍是在注释处使用 /$2 ,在路径处使用 (/|$)(.*) 。所以这个重写所做的是,它选择了 Something/ 之后的所有内容,并用它替换 $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