【问题标题】:Traefik V2: Why requests to subfolders are not routed properly?Traefik V2:为什么对子文件夹的请求没有正确路由?
【发布时间】:2021-11-23 11:10:02
【问题描述】:

我尝试从 Traefik V1 迁移到 V2 没有 IngressRouteMiddleware

我对@9​​87654326@ 的请求应该通过/something 路由到我的backend 服务的根目录。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/redirect-regex: /backend$
    traefik.ingress.kubernetes.io/redirect-replacement: /backend/
    traefik.ingress.kubernetes.io/request-modifier: "ReplacePathRegex: ^/backend/(.*) /$1"

spec:
  rules:
    - host: demo.myapp.com
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              serviceName: frontend-app
              servicePort: 80
          - path: /backend # requests to /backend/something should end up in /something
            pathType: ImplementationSpecific
            backend:
              service:
                name: backend-api
                port: http

我怎样才能去掉它?

目前要求

/backend/somethingbackend/something/ 结尾,但应该是 /something

提前谢谢你

PS:是否有监控或测试此类请求的“工具”?

这是我使用的演示部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-app
  namespace: default
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          resources:
            requests:
              cpu: 100m
              memory: 100Mi
            limits:
              cpu: 100m
              memory: 100Mi
          ports:
            - containerPort: 80
              name: http
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    app: nginx
  type: ClusterIP
  sessionAffinity: None
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-api
  namespace: default
  labels:
    app: hello-world
spec:
  selector:
    matchLabels:
      app: hello-world
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
        - name: hello-world
          image: rancher/hello-world:latest
          resources: {}
          ports:
            - containerPort: 80
              name: http
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: hello-world
  namespace: default
spec:
  selector:
    app: hello-world
  type: ClusterIP
  sessionAffinity: None
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80


【问题讨论】:

  • 你的意思是:为什么对子文件夹的请求没有正确路由?你有没有得到一些错误?您使用的是哪个版本的 Kubernetes,您是如何设置集群的?您是否使用裸机安装或某些云提供商?重现您的问题很重要。
  • 是的,我在拨打/backend/image.jpg 时收到404。是的,我使用裸机,它是空的。仅部署了 Traefik 2。我将添加一个演示部署。
  • 您是否尝试从traefik.ingress.kubernetes.io/request-modifier: "ReplacePathRegex: ^/backend/(.*) /$1" 行中删除"
  • 你有解决这个问题的办法吗?我花了一整天,没有运气,试图解决这个问题

标签: kubernetes-ingress traefik-ingress


【解决方案1】:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: production-ingress
  namespace: production
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/router.entrypoints: web, websecure
    # usage: namespace-middlewareName@kubernetescrdIsMandatory
    traefik.ingress.kubernetes.io/router.middlewares: production-middleware-frontend@kubernetescrd,production-middleware-backend@kubernetescrd
    traefik.ingress.kubernetes.io/router.tls: "true"
    # cert-manager.io/cluster-issuer: letsencrypt-staging
spec:
  rules:
    - host: yourdomain.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend
                port:
                  number: 5000
          - path: /backend
            pathType: ImplementationSpecific
            backend:
              service:
                name: backend
                port:
                  number: 3000
  tls:
    - hosts:
        - "yourdomain.com"
      secretName: yourdomain-com-production-tls
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: middleware-backend
  namespace: production
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  stripPrefix:
    prefixes:
      - /backend
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: middleware-frontend
  namespace: production
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  stripPrefix:
    prefixes:
      - /

【讨论】:

    猜你喜欢
    • 2020-04-08
    • 2023-02-09
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多