Kubernetes上Traefik的路径或路径前缀路由不工作

jc3wubiy  于 2023-01-29  发布在  Kubernetes
关注(0)|答案(1)|浏览(343)

我在AKS Kubernetes Cluster 1.22.6上使用Traefik 2.7.0。目前,所有内容都路由到相同的服务:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: api
  namespace: namespace1
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`api.my-domain.com`)
      kind: Rule
      services:
        - name: api
          namespace: namespace1
          port: 80
  tls:
    secretName: api-my-domain-com-cert

我目前正在将API资源从这个服务外部化到一个专用的新服务(“/users”),因为将来会有其他服务需要相同的功能。
我尝试(但失败了)做的是将对“/users”的调用路由到新服务:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: api
  namespace: namespace1
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`api.my-domain.com`) && Path(`/users`)
      kind: Rule
      services:
        - name: users-api
          namespace: namespace2
          port: 80
    - match: Host(`api.my-domain.com`)
      kind: Rule
      services:
        - name: api
          namespace: namespace1
          port: 80
  tls:
    secretName: api-baywa-lusy-com-cert

我尝试了Path(..)PathPrefix(..),但没有成功,所有内容仍然路由到旧服务,新服务的输出略有不同,所以我可以肯定它仍然路由到旧服务。
手动添加优先级也没有帮助:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: api
  namespace: namespace1
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`api.my-domain.com`) && Path(`/users`)
      kind: Rule
      priority: 2000
      services:
        - name: users-api
          namespace: namespace2
          port: 80
    - match: Host(`api.my-domain.com`)
      kind: Rule
      priority: 1000
      services:
        - name: api
          namespace: namespace1
          port: 80
  tls:
    secretName: api-baywa-lusy-com-cert

我错过了什么吗?任何帮助都是感激的!
谢谢你,
此致,
帕斯卡

6jygbczu

6jygbczu1#

您只能在与IngressRoute资源相同的命名空间中公开服务。如果您在部署IngressRoute时查看Traefik Pod的日志,您应该会看到如下内容:
time=“2023-01- 26 T13:57:17 Z”级别=错误消息=“服务命名空间2/用户-api不在父资源命名空间1中”提供程序名称=kubernetescrd入口=命名空间1命名空间=命名空间1
要完成您想要的任务,您需要创建两个单独的IngressRoute资源,一个在namespace1中,另一个在namespace2中。
namespace1中:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  labels:
    app: old-api
  name: old-api
  namespace: namespace1
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    priority: 1000
    match: Host(`api.my-domain.com`)
    services:
    - name: old-api
      port: 80

namespace2中:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  labels:
    app: new-api
  name: new-api
  namespace: namespace2
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    priority: 2000
    match: Host(`api.my-domain.com`) && PathPrefix(`/users`)
    services:
    - name: new-api
      port: 80

您可以找到我用来测试here配置的所有文件。
我不知道明确的优先级是否必要;没有它们我也能用,但也许我只是很幸运,所以我把它们留在了那里。我通常会假设“更具体的路线”优先于“不太具体的路线”,但我不知道这是否真的是真的。

相关问题