Kubernetes集群Nginx迁移至Traefik V1/V2的Ingress路由配置示例求助
问题解答
同一域名下的多子路径路由不需要拆分多个Ingress资源,单份Ingress(V2版本对应IngressRoute CRD)即可完成所有规则配置。
一、Traefik V1(适配你当前使用的1.7.19版本)
你当前配置的问题出在traefik.frontend.rule.type: PathPrefixStrip注解,这个注解的作用是把匹配到的路径前缀删除后再转发给后端服务,所以会出现/backend/someImage.png被转发为/someImage.png的情况,根据你的实际需求选择对应配置即可:
- 如果你需要保留路径中的/backend前缀转发给后端,直接把规则类型改成
PathPrefix即可:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: demo-ingress namespace: default annotations: kubernetes.io/ingress.class: traefik traefik.frontend.rule.type: PathPrefix spec: rules: - host: demo.myapp.com http: paths: - path: / backend: serviceName: frontend-app servicePort: 80 - path: /backend backend: serviceName: backend-api servicePort: 80
- 如果你需要和原Nginx配置逻辑一致,把/backend/xxx转发为后端的/xxx,保持
PathPrefixStrip规则,调整路径匹配规则避免误匹配即可:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: demo-ingress namespace: default annotations: kubernetes.io/ingress.class: traefik traefik.frontend.rule.type: PathPrefixStrip spec: rules: - host: demo.myapp.com http: paths: - path: / backend: serviceName: frontend-app servicePort: 80 - path: /backend/ backend: serviceName: backend-api servicePort: 80
二、Traefik V2 版本配置
V2版本使用CRD资源进行配置逻辑更清晰,核心用到IngressRoute和Middleware两个资源,根据需求选择对应配置:
场景1:保留/backend前缀转发给后端
直接配置IngressRoute即可,不需要额外的Middleware:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: demo-ingressroute namespace: default spec: entryPoints: - web # 可替换为你实际配置的入口点,比如websecure对应HTTPS入口 routes: - match: Host(`demo.myapp.com`) && PathPrefix(`/`) kind: Rule services: - name: frontend-app port: 80 - match: Host(`demo.myapp.com`) && PathPrefix(`/backend`) kind: Rule services: - name: backend-api port: 80
场景2:转发时去掉/backend前缀(和原Nginx逻辑一致)
先创建路径剥离的Middleware,再在IngressRoute中引用即可:
# 第一步:创建路径剥离Middleware apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: strip-backend-prefix namespace: default spec: stripPrefix: prefixes: - /backend --- # 第二步:创建IngressRoute路由规则 apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: demo-ingressroute namespace: default spec: entryPoints: - web routes: - match: Host(`demo.myapp.com`) && PathPrefix(`/`) kind: Rule services: - name: frontend-app port: 80 - match: Host(`demo.myapp.com`) && PathPrefix(`/backend`) kind: Rule middlewares: - name: strip-backend-prefix # 引用上方的路径剥离规则 services: - name: backend-api port: 80
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

